1 // App.h
2 
3 #ifndef __APP_H
4 #define __APP_H
5 
6 #include "../../../Windows/Control/CommandBar.h"
7 #include "../../../Windows/Control/ImageList.h"
8 
9 #include "AppState.h"
10 #include "Panel.h"
11 
12 class CApp;
13 
14 extern CApp g_App;
15 extern HWND g_HWND;
16 
17 const unsigned kNumPanelsMax = 2;
18 
19 extern bool g_IsSmallScreen;
20 
21 // must be larger than context menu IDs
22 const int kMenuCmdID_Toolbar_Start = 1070;
23 const int kMenuCmdID_Plugin_Start = 1100;
24 
25 enum
26 {
27   kMenuCmdID_Toolbar_Add = kMenuCmdID_Toolbar_Start,
28   kMenuCmdID_Toolbar_Extract,
29   kMenuCmdID_Toolbar_Test,
30   kMenuCmdID_Toolbar_End
31 };
32 
33 class CPanelCallbackImp: public CPanelCallback
34 {
35   CApp *_app;
36   unsigned _index;
37 public:
Init(CApp * app,unsigned index)38   void Init(CApp *app, unsigned index)
39   {
40     _app = app;
41     _index = index;
42   }
43   virtual void OnTab();
44   virtual void SetFocusToPath(unsigned index);
45   virtual void OnCopy(bool move, bool copyToSame);
46   virtual void OnSetSameFolder();
47   virtual void OnSetSubFolder();
48   virtual void PanelWasFocused();
49   virtual void DragBegin();
50   virtual void DragEnd();
51   virtual void RefreshTitle(bool always);
52 };
53 
54 class CApp;
55 
56 class CDropTarget:
57   public IDropTarget,
58   public CMyUnknownImp
59 {
60   CMyComPtr<IDataObject> m_DataObject;
61   UStringVector m_SourcePaths;
62   int m_SelectionIndex;
63   bool m_DropIsAllowed;      // = true, if data contain fillist
64   bool m_PanelDropIsAllowed; // = false, if current target_panel is source_panel.
65                              // check it only if m_DropIsAllowed == true
66   int m_SubFolderIndex;
67   UString m_SubFolderName;
68 
69   CPanel *m_Panel;
70   bool m_IsAppTarget;        // true, if we want to drop to app window (not to panel).
71 
72   bool m_SetPathIsOK;
73 
74   bool IsItSameDrive() const;
75 
76   void QueryGetData(IDataObject *dataObject);
77   bool IsFsFolderPath() const;
78   DWORD GetEffect(DWORD keyState, POINTL pt, DWORD allowedEffect);
79   void RemoveSelection();
80   void PositionCursor(POINTL ptl);
81   UString GetTargetPath() const;
82   bool SetPath(bool enablePath) const;
83   bool SetPath();
84 
85 public:
86   MY_UNKNOWN_IMP1_MT(IDropTarget)
87   STDMETHOD(DragEnter)(IDataObject * dataObject, DWORD keyState, POINTL pt, DWORD *effect);
88   STDMETHOD(DragOver)(DWORD keyState, POINTL pt, DWORD * effect);
89   STDMETHOD(DragLeave)();
90   STDMETHOD(Drop)(IDataObject * dataObject, DWORD keyState, POINTL pt, DWORD *effect);
91 
CDropTarget()92   CDropTarget():
93       m_SelectionIndex(-1),
94       m_DropIsAllowed(false),
95       m_PanelDropIsAllowed(false),
96       m_SubFolderIndex(-1),
97       m_Panel(NULL),
98       m_IsAppTarget(false),
99       m_SetPathIsOK(false),
100       App(NULL),
101       SrcPanelIndex(-1),
102       TargetPanelIndex(-1)
103       {}
104 
105   CApp *App;
106   int SrcPanelIndex;              // index of D&D source_panel
107   int TargetPanelIndex;           // what panel to use as target_panel of Application
108 };
109 
110 
111 class CApp
112 {
113 public:
114   NWindows::CWindow _window;
115   bool ShowSystemMenu;
116   // bool ShowDeletedFiles;
117   unsigned NumPanels;
118   unsigned LastFocusedPanel;
119 
120   bool ShowStandardToolbar;
121   bool ShowArchiveToolbar;
122   bool ShowButtonsLables;
123   bool LargeButtons;
124 
125   CAppState AppState;
126   CPanelCallbackImp m_PanelCallbackImp[kNumPanelsMax];
127   CPanel Panels[kNumPanelsMax];
128 
129   NWindows::NControl::CImageList _buttonsImageList;
130 
131   #ifdef UNDER_CE
132   NWindows::NControl::CCommandBar _commandBar;
133   #endif
134   NWindows::NControl::CToolBar _toolBar;
135 
136   CDropTarget *_dropTargetSpec;
137   CMyComPtr<IDropTarget> _dropTarget;
138 
139   UString LangString_N_SELECTED_ITEMS;
140 
141   void ReloadLang();
142 
CApp()143   CApp(): _window(0), NumPanels(2), LastFocusedPanel(0),
144     AutoRefresh_Mode(true)
145   {
146     SetPanels_AutoRefresh_Mode();
147   }
148 
CreateDragTarget()149   void CreateDragTarget()
150   {
151     _dropTargetSpec = new CDropTarget();
152     _dropTarget = _dropTargetSpec;
153     _dropTargetSpec->App = (this);
154   }
155 
SetFocusedPanel(unsigned index)156   void SetFocusedPanel(unsigned index)
157   {
158     LastFocusedPanel = index;
159     _dropTargetSpec->TargetPanelIndex = LastFocusedPanel;
160   }
161 
DragBegin(unsigned panelIndex)162   void DragBegin(unsigned panelIndex)
163   {
164     _dropTargetSpec->TargetPanelIndex = (NumPanels > 1) ? 1 - panelIndex : panelIndex;
165     _dropTargetSpec->SrcPanelIndex = panelIndex;
166   }
167 
DragEnd()168   void DragEnd()
169   {
170     _dropTargetSpec->TargetPanelIndex = LastFocusedPanel;
171     _dropTargetSpec->SrcPanelIndex = -1;
172   }
173 
174 
175   void OnCopy(bool move, bool copyToSame, int srcPanelIndex);
176   void OnSetSameFolder(int srcPanelIndex);
177   void OnSetSubFolder(int srcPanelIndex);
178 
179   HRESULT CreateOnePanel(int panelIndex, const UString &mainPath, const UString &arcFormat, bool needOpenArc, COpenResult &openRes);
180   HRESULT Create(HWND hwnd, const UString &mainPath, const UString &arcFormat, int xSizes[2], bool needOpenArc, COpenResult &openRes);
181   void Read();
182   void Save();
183   void Release();
184 
185   // void SetFocus(int panelIndex) { Panels[panelIndex].SetFocusToList(); }
SetFocusToLastItem()186   void SetFocusToLastItem() { Panels[LastFocusedPanel].SetFocusToLastRememberedItem(); }
GetFocusedPanelIndex()187   unsigned GetFocusedPanelIndex() const { return LastFocusedPanel; }
IsPanelVisible(unsigned index)188   bool IsPanelVisible(unsigned index) const { return (NumPanels > 1 || index == LastFocusedPanel); }
GetFocusedPanel()189   CPanel &GetFocusedPanel() { return Panels[GetFocusedPanelIndex()]; }
190 
191   // File Menu
OpenItem()192   void OpenItem() { GetFocusedPanel().OpenSelectedItems(true); }
OpenItemInside(const wchar_t * type)193   void OpenItemInside(const wchar_t *type) { GetFocusedPanel().OpenFocusedItemAsInternal(type); }
OpenItemOutside()194   void OpenItemOutside() { GetFocusedPanel().OpenSelectedItems(false); }
EditItem(bool useEditor)195   void EditItem(bool useEditor) { GetFocusedPanel().EditItem(useEditor); }
Rename()196   void Rename() { GetFocusedPanel().RenameFile(); }
CopyTo()197   void CopyTo() { OnCopy(false, false, GetFocusedPanelIndex()); }
MoveTo()198   void MoveTo() { OnCopy(true, false, GetFocusedPanelIndex()); }
Delete(bool toRecycleBin)199   void Delete(bool toRecycleBin) { GetFocusedPanel().DeleteItems(toRecycleBin); }
200   HRESULT CalculateCrc2(const UString &methodName);
201   void CalculateCrc(const char *methodName);
202 
203   void DiffFiles(const UString &path1, const UString &path2);
204   void DiffFiles();
205 
206   void VerCtrl(unsigned id);
207 
208   void Split();
209   void Combine();
Properties()210   void Properties() { GetFocusedPanel().Properties(); }
Comment()211   void Comment() { GetFocusedPanel().ChangeComment(); }
212 
213   #ifndef UNDER_CE
214   void Link();
OpenAltStreams()215   void OpenAltStreams() { GetFocusedPanel().OpenAltStreams(); }
216   #endif
217 
CreateFolder()218   void CreateFolder() { GetFocusedPanel().CreateFolder(); }
CreateFile()219   void CreateFile() { GetFocusedPanel().CreateFile(); }
220 
221   // Edit
EditCut()222   void EditCut() { GetFocusedPanel().EditCut(); }
EditCopy()223   void EditCopy() { GetFocusedPanel().EditCopy(); }
EditPaste()224   void EditPaste() { GetFocusedPanel().EditPaste(); }
225 
SelectAll(bool selectMode)226   void SelectAll(bool selectMode) { GetFocusedPanel().SelectAll(selectMode); }
InvertSelection()227   void InvertSelection() { GetFocusedPanel().InvertSelection(); }
SelectSpec(bool selectMode)228   void SelectSpec(bool selectMode) { GetFocusedPanel().SelectSpec(selectMode); }
SelectByType(bool selectMode)229   void SelectByType(bool selectMode) { GetFocusedPanel().SelectByType(selectMode); }
230 
Refresh_StatusBar()231   void Refresh_StatusBar() { GetFocusedPanel().Refresh_StatusBar(); }
232 
SetListViewMode(UInt32 index)233   void SetListViewMode(UInt32 index) { GetFocusedPanel().SetListViewMode(index); }
GetListViewMode()234   UInt32 GetListViewMode() { return GetFocusedPanel().GetListViewMode(); }
GetSortID()235   PROPID GetSortID() { return GetFocusedPanel().GetSortID(); }
236 
SortItemsWithPropID(PROPID propID)237   void SortItemsWithPropID(PROPID propID) { GetFocusedPanel().SortItemsWithPropID(propID); }
238 
OpenRootFolder()239   void OpenRootFolder() { GetFocusedPanel().OpenDrivesFolder(); }
OpenParentFolder()240   void OpenParentFolder() { GetFocusedPanel().OpenParentFolder(); }
FoldersHistory()241   void FoldersHistory() { GetFocusedPanel().FoldersHistory(); }
RefreshView()242   void RefreshView() { GetFocusedPanel().OnReload(); }
RefreshAllPanels()243   void RefreshAllPanels()
244   {
245     for (unsigned i = 0; i < NumPanels; i++)
246     {
247       unsigned index = i;
248       if (NumPanels == 1)
249         index = LastFocusedPanel;
250       Panels[index].OnReload();
251     }
252   }
253 
254   /*
255   void SysIconsWereChanged()
256   {
257     for (unsigned i = 0; i < NumPanels; i++)
258     {
259       unsigned index = i;
260       if (NumPanels == 1)
261         index = LastFocusedPanel;
262       Panels[index].SysIconsWereChanged();
263     }
264   }
265   */
266 
267   void SetListSettings();
268   HRESULT SwitchOnOffOnePanel();
269 
270   CIntVector _timestampLevels;
271 
GetFlatMode()272   bool GetFlatMode() { return Panels[LastFocusedPanel].GetFlatMode(); }
273 
GetTimestampLevel()274   int GetTimestampLevel() const { return Panels[LastFocusedPanel]._timestampLevel; }
SetTimestampLevel(int level)275   void SetTimestampLevel(int level)
276   {
277     unsigned i;
278     for (i = 0; i < kNumPanelsMax; i++)
279     {
280       CPanel &panel = Panels[i];
281       panel._timestampLevel = level;
282       if (panel.PanelCreated)
283         panel.RedrawListItems();
284     }
285   }
286 
287   // bool Get_ShowNtfsStrems_Mode() { return Panels[LastFocusedPanel].Get_ShowNtfsStrems_Mode(); }
288 
ChangeFlatMode()289   void ChangeFlatMode() { Panels[LastFocusedPanel].ChangeFlatMode(); }
290   // void Change_ShowNtfsStrems_Mode() { Panels[LastFocusedPanel].Change_ShowNtfsStrems_Mode(); }
291   // void Change_ShowDeleted() { ShowDeletedFiles = !ShowDeletedFiles; }
292 
293   bool AutoRefresh_Mode;
Get_AutoRefresh_Mode()294   bool Get_AutoRefresh_Mode()
295   {
296     // return Panels[LastFocusedPanel].Get_ShowNtfsStrems_Mode();
297     return AutoRefresh_Mode;
298   }
Change_AutoRefresh_Mode()299   void Change_AutoRefresh_Mode()
300   {
301     AutoRefresh_Mode = !AutoRefresh_Mode;
302     SetPanels_AutoRefresh_Mode();
303   }
SetPanels_AutoRefresh_Mode()304   void SetPanels_AutoRefresh_Mode()
305   {
306     for (unsigned i = 0; i < kNumPanelsMax; i++)
307       Panels[i].Set_AutoRefresh_Mode(AutoRefresh_Mode);
308   }
309 
OpenBookmark(int index)310   void OpenBookmark(int index) { GetFocusedPanel().OpenBookmark(index); }
SetBookmark(int index)311   void SetBookmark(int index) { GetFocusedPanel().SetBookmark(index); }
312 
313   void ReloadToolbars();
ReadToolbar()314   void ReadToolbar()
315   {
316     UInt32 mask = ReadToolbarsMask();
317     if (mask & ((UInt32)1 << 31))
318     {
319       ShowButtonsLables = !g_IsSmallScreen;
320       LargeButtons = false;
321       ShowStandardToolbar = ShowArchiveToolbar = true;
322     }
323     else
324     {
325       ShowButtonsLables = ((mask & 1) != 0);
326       LargeButtons = ((mask & 2) != 0);
327       ShowStandardToolbar = ((mask & 4) != 0);
328       ShowArchiveToolbar  = ((mask & 8) != 0);
329     }
330   }
SaveToolbar()331   void SaveToolbar()
332   {
333     UInt32 mask = 0;
334     if (ShowButtonsLables) mask |= 1;
335     if (LargeButtons) mask |= 2;
336     if (ShowStandardToolbar) mask |= 4;
337     if (ShowArchiveToolbar) mask |= 8;
338     SaveToolbarsMask(mask);
339   }
340 
341   void SaveToolbarChanges();
342 
SwitchStandardToolbar()343   void SwitchStandardToolbar()
344   {
345     ShowStandardToolbar = !ShowStandardToolbar;
346     SaveToolbarChanges();
347   }
SwitchArchiveToolbar()348   void SwitchArchiveToolbar()
349   {
350     ShowArchiveToolbar = !ShowArchiveToolbar;
351     SaveToolbarChanges();
352   }
SwitchButtonsLables()353   void SwitchButtonsLables()
354   {
355     ShowButtonsLables = !ShowButtonsLables;
356     SaveToolbarChanges();
357   }
SwitchLargeButtons()358   void SwitchLargeButtons()
359   {
360     LargeButtons = !LargeButtons;
361     SaveToolbarChanges();
362   }
363 
AddToArchive()364   void AddToArchive() { GetFocusedPanel().AddToArchive(); }
ExtractArchives()365   void ExtractArchives() { GetFocusedPanel().ExtractArchives(); }
TestArchives()366   void TestArchives() { GetFocusedPanel().TestArchives(); }
367 
368   void OnNotify(int ctrlID, LPNMHDR pnmh);
369 
370   UString PrevTitle;
371   void RefreshTitle(bool always = false);
RefreshTitleAlways()372   void RefreshTitleAlways() { RefreshTitle(true); }
373   void RefreshTitlePanel(unsigned panelIndex, bool always = false);
374 
375   void MoveSubWindows();
376 };
377 
378 #endif
379