1 // This file is part of VSTGUI. It is subject to the license terms
2 // in the LICENSE file found in the top-level directory of this
3 // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
4 
5 #pragma once
6 
7 #include "../uidescription.h"
8 
9 #if VSTGUI_LIVE_EDITING
10 
11 #include "../iviewcreator.h"
12 #include "../icontroller.h"
13 #include "../uidescriptionlistener.h"
14 #include "iaction.h"
15 #include "uiundomanager.h"
16 #include "uitemplatecontroller.h"
17 #include "../../lib/csplitview.h"
18 #include "../../lib/cframe.h"
19 #include "../../lib/controls/icommandmenuitemtarget.h"
20 
21 #include <vector>
22 
23 namespace VSTGUI {
24 class UIEditView;
25 class UISelection;
26 class UITemplateController;
27 class UIEditMenuController;
28 class UIGridController;
29 class UIZoomSettingController;
30 class GenericStringListDataBrowserSource;
31 class CCommandMenuItem;
32 
33 //----------------------------------------------------------------------------------------------------
34 class UIEditController : public CBaseObject,
35                          public IController,
36                          public IContextMenuController2,
37                          public ISplitViewController,
38                          public ISplitViewSeparatorDrawer,
39                          public IActionPerformer,
40                          public IKeyboardHook,
41                          public CommandMenuItemTargetAdapter,
42                          public UIDescriptionListenerAdapter,
43                          public IUIUndoManagerListener,
44                          public IUITemplateControllerListener
45 {
46 public:
47 	UIEditController (UIDescription* description);
48 
49 	CView* createEditView ();
50 	UIEditMenuController* getMenuController () const { return menuController; }
51 	UIUndoManager* getUndoManager () const { return undoManager; }
52 	const std::string& getEditTemplateName () const { return editTemplateName; }
53 	SharedPointer<UIAttributes> getSettings ();
54 	int32_t getSaveOptions ();
55 
56 	void onZoomChanged (double zoom);
57 
58 	void addSelectionToCurrentView (UISelection* selection);
59 
60 	static SharedPointer<UIDescription> getEditorDescription ();
61 	static void setupDataSource (GenericStringListDataBrowserSource* source);
62 	static bool std__stringCompare (const std::string* lhs, const std::string* rhs);
63 	static const UTF8StringPtr kEncodeBitmapsSettingsKey;
64 	static const UTF8StringPtr kWriteWindowsRCFileSettingsKey;
65 protected:
66 	~UIEditController () override;
67 
68 	static void resetScrollViewOffsets (CViewContainer* view);
69 
70 	int32_t getSplitViewIndex (CSplitView* splitView);
71 	void setDirty (bool state);
72 
73 	void valueChanged (CControl* pControl) override;
74 	CView* createView (const UIAttributes& attributes, const IUIDescription* description) override;
75 	CView* verifyView (CView* view, const UIAttributes& attributes, const IUIDescription* description) override;
76 	IController* createSubController (UTF8StringPtr name, const IUIDescription* description) override;
77 
78 	CMessageResult notify (CBaseObject* sender, IdStringPtr message) override;
79 
80 	// IUITemplateControllerListener
81 	void onTemplateSelectionChanged () override;
82 
83 	// IUIUndoManagerListener
84 	void onUndoManagerChange () override;
85 
86 	// IContextMenuController2
87 	void appendContextMenuItems (COptionMenu& contextMenu, CView* view, const CPoint& where) override;
88 
89 	// ISplitViewController
90 	bool getSplitViewSizeConstraint (int32_t index, CCoord& minSize, CCoord& maxSize, CSplitView* splitView) override;
91 	ISplitViewSeparatorDrawer* getSplitViewSeparatorDrawer (CSplitView* splitView) override;
92 	bool storeViewSize (int32_t index, const CCoord& size, CSplitView* splitView) override;
93 	bool restoreViewSize (int32_t index, CCoord& size, CSplitView* splitView) override;
94 
95 	// ISplitViewSeparatorDrawer
96 	void drawSplitViewSeparator (CDrawContext* context, const CRect& size, int32_t flags, int32_t index, CSplitView* splitView) override;
97 
98 	// IActionPerformer
99 	void performAction (IAction* action) override;
100 	void performColorChange (UTF8StringPtr colorName, const CColor& newColor, bool remove = false) override;
101 	void performTagChange (UTF8StringPtr tagName, UTF8StringPtr tagString, bool remove = false) override;
102 	void performBitmapChange (UTF8StringPtr bitmapName, UTF8StringPtr bitmapPath, bool remove = false) override;
103 	void performGradientChange (UTF8StringPtr gradientName, CGradient* newGradient, bool remove = false) override;
104 	void performFontChange (UTF8StringPtr fontName, CFontRef newFont, bool remove = false) override;
105 	void performColorNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
106 	void performTagNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
107 	void performFontNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
108 	void performGradientNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
109 	void performBitmapNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
110 	void performBitmapNinePartTiledChange (UTF8StringPtr bitmapName, const CRect* offsets) override;
111 	void performBitmapFiltersChange (UTF8StringPtr bitmapName, const std::list<SharedPointer<UIAttributes> >& filterDescription) override;
112 	void performAlternativeFontChange (UTF8StringPtr fontName, UTF8StringPtr newAlternativeFonts) override;
113 
114 	void beginLiveColorChange (UTF8StringPtr colorName) override;
115 	void performLiveColorChange (UTF8StringPtr colorName, const CColor& newColor) override;
116 	void endLiveColorChange (UTF8StringPtr colorName) override;
117 
118 	void performTemplateNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
119 	void performTemplateMinMaxSizeChange (UTF8StringPtr templateName, CPoint minSize, CPoint maxSize) override;
120 	void performCreateNewTemplate (UTF8StringPtr name, UTF8StringPtr baseViewClassName) override;
121 	void performDeleteTemplate (UTF8StringPtr name) override;
122 	void performDuplicateTemplate (UTF8StringPtr name, UTF8StringPtr dupName) override;
123 
124 	void onTemplateCreation (UTF8StringPtr name, CView* view) override;
125 	void onTemplateNameChange (UTF8StringPtr oldName, UTF8StringPtr newName) override;
126 
127 	void performChangeFocusDrawingSettings (const FocusDrawingSettings& newSettings) override;
128 
129 	void beginGroupAction (UTF8StringPtr name) override;
130 	void finishGroupAction () override;
131 
132 	// IKeyboardHook
133 	int32_t onKeyDown (const VstKeyCode& code, CFrame* frame) override;
134 	int32_t onKeyUp (const VstKeyCode& code, CFrame* frame) override;
135 
136 	// CommandMenuItemTargetAdapter
137 	bool validateCommandMenuItem (CCommandMenuItem* item) override;
138 	bool onCommandMenuItemSelected (CCommandMenuItem* item) override;
139 
140 	SharedPointer<UIDescription> editDescription;
141 	SharedPointer<UIDescription> editorDesc;
142 	SharedPointer<UISelection> selection;
143 	SharedPointer<UIUndoManager> undoManager;
144 	SharedPointer<UIGridController> gridController;
145 	UIEditView* editView;
146 	SharedPointer<UITemplateController> templateController;
147 	SharedPointer<UIEditMenuController> menuController;
148 	SharedPointer<UIZoomSettingController> zoomSettingController;
149 	SharedPointer<CControl> enableEditingControl;
150 	SharedPointer<CControl> notSavedControl;
151 	SharedPointer<CControl> tabSwitchControl;
152 
153 	std::string editTemplateName;
154 	std::list<SharedPointer<CSplitView> > splitViews;
155 
156 	bool dirty;
157 
158 	struct Template {
159 		std::string name;
160 		SharedPointer<CView> view;
161 
162 		Template (const std::string& n, CView* v) : name (n), view (v) {}
163 		Template (const Template& c) : name (c.name), view (c.view) {}
164 		bool operator==(const Template& t) { return name == t.name && view == t.view; }
165 		bool operator==(const std::string& n) { return name == n; }
166 		Template& operator=(const Template& t) { name = t.name; view = t.view; return *this; }
167 		Template (Template&& t) noexcept { *this = std::move (t); }
168 		Template& operator=(Template&& t) noexcept { name = std::move (t.name); view = std::move (t.view); return *this; }
169 	};
170 	void updateTemplate (UTF8StringPtr name);
171 	void updateTemplate (const std::vector<Template>::const_iterator& it);
172 	void onTemplatesChanged ();
173 	void getTemplateViews (std::list<CView*>& views) const;
174 
175 	std::vector<Template> templates;
176 private:
177 	void beforeUIDescSave (UIDescription* desc) override;
178 	void onUIDescTemplateChanged (UIDescription* desc) override;
179 	bool doUIDescTemplateUpdate (UIDescription* desc, UTF8StringPtr name) override;
180 
181 	void beforeSave ();
182 	CMessageResult validateMenuItem (CCommandMenuItem* item);
183 	CMessageResult onMenuItemSelection (CCommandMenuItem* item);
184 	void doCopy (bool cut = false);
185 	void doPaste ();
186 	void showTemplateSettings ();
187 	void showFocusSettings ();
188 	bool doSelectionMove (const UTF8String& commandName, bool useGrid) const;
189 	bool doSelectionSize (const UTF8String& commandName, bool useGrid) const;
190 	bool doZOrderAction (bool lower);
191 	void doSelectAllChildren ();
192 	void doSelectParents ();
193 	void doSelectViewInHierarchyBrowser (CView* view);
194 
195 	void onUndoManagerChanged ();
196 	template<typename NameChangeAction, IViewCreator::AttrType attrType> void performNameChange (UTF8StringPtr oldName, UTF8StringPtr newName, IdStringPtr groupActionName);
197 
198 	std::string onlyTemplateToUpdateName;
199 };
200 
201 } // VSTGUI
202 
203 #endif // VSTGUI_LIVE_EDITING
204