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