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