]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/fswatcher/fswatcher.cpp
Implement undo and redo for the ie and gtk webkit backends. Extend the sample to...
[wxWidgets.git] / samples / fswatcher / fswatcher.cpp
index 7b30d4212e5574157010a2ed2a78e46d42a76c68..8e4132192e0e7efa58c000108891a5e895a379fa 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "wx/fswatcher.h"
 #include "wx/listctrl.h"
+#include "wx/cmdline.h"
 
 // Define a new frame type: this is going to be our main frame
 class MyFrame : public wxFrame
@@ -31,9 +32,12 @@ public:
     MyFrame(const wxString& title);
     virtual ~MyFrame();
 
+    void AddDirectory(const wxString& dir);
+
+    bool CreateWatcherIfNecessary();
+
 private:
     // file system watcher creation
-    void OnEventLoopEnter();
     void CreateWatcher();
 
     // event handlers
@@ -52,8 +56,6 @@ private:
     wxListView *m_filesList;          // list of watched paths
     wxFileSystemWatcher* m_watcher;   // file system watcher
 
-    friend class MyApp;
-
     const static wxString LOG_FORMAT; // how to format events
 };
 
@@ -66,6 +68,9 @@ public:
     // 'Main program' equivalent: the program execution "starts" here
     virtual bool OnInit()
     {
+        if ( !wxApp::OnInit() )
+            return false;
+
         wxLog::AddTraceMask("EventSource");
         wxLog::AddTraceMask(wxTRACE_FSWATCHER);
 
@@ -79,11 +84,37 @@ public:
     // create the file system watcher here, because it needs an active loop
     virtual void OnEventLoopEnter(wxEventLoopBase* WXUNUSED(loop))
     {
-        m_frame->OnEventLoopEnter();
+        if ( m_frame->CreateWatcherIfNecessary() )
+        {
+            if ( !m_dirToWatch.empty() )
+                m_frame->AddDirectory(m_dirToWatch);
+        }
+    }
+
+    virtual void OnInitCmdLine(wxCmdLineParser& parser)
+    {
+        wxApp::OnInitCmdLine(parser);
+        parser.AddParam("directory to watch",
+                        wxCMD_LINE_VAL_STRING,
+                        wxCMD_LINE_PARAM_OPTIONAL);
+    }
+
+    virtual bool OnCmdLineParsed(wxCmdLineParser& parser)
+    {
+        if ( !wxApp::OnCmdLineParsed(parser) )
+            return false;
+
+        if ( parser.GetParamCount() )
+            m_dirToWatch = parser.GetParam();
+
+        return true;
     }
 
 private:
     MyFrame *m_frame;
+
+    // The directory to watch if specified on the command line.
+    wxString m_dirToWatch;
 };
 
 // Create a new application object: this macro will allow wxWidgets to create
@@ -235,14 +266,16 @@ MyFrame::~MyFrame()
     delete m_watcher;
 }
 
-void MyFrame::OnEventLoopEnter()
+bool MyFrame::CreateWatcherIfNecessary()
 {
     if (m_watcher)
-        return;
+        return false;
 
     CreateWatcher();
     Connect(wxEVT_FSWATCHER,
             wxFileSystemWatcherEventHandler(MyFrame::OnFileSystemEvent));
+
+    return true;
 }
 
 void MyFrame::CreateWatcher()
@@ -279,8 +312,7 @@ void MyFrame::OnWatch(wxCommandEvent& event)
     {
         wxCHECK_RET(m_watcher, "Watcher not initialized");
         m_filesList->DeleteAllItems();
-        delete m_watcher;
-        m_watcher = NULL;
+        wxDELETE(m_watcher);
     }
 }
 
@@ -294,6 +326,11 @@ void MyFrame::OnAdd(wxCommandEvent& WXUNUSED(event))
     if ( dir.empty() )
         return;
 
+    AddDirectory(dir);
+}
+
+void MyFrame::AddDirectory(const wxString& dir)
+{
     wxLogDebug("Adding directory: '%s'", dir);
 
     if (!m_watcher->Add(wxFileName::DirName(dir), wxFSW_EVENT_ALL))
@@ -329,7 +366,7 @@ void MyFrame::OnRemove(wxCommandEvent& WXUNUSED(event))
 void MyFrame::OnFileSystemEvent(wxFileSystemWatcherEvent& event)
 {
     // TODO remove when code is rock-solid
-    wxLogDebug(wxTRACE_FSWATCHER, "*** %s ***", event.ToString());
+    wxLogTrace(wxTRACE_FSWATCHER, "*** %s ***", event.ToString());
     LogEvent(event);
 }