|
From: <cur...@us...> - 2009-08-08 15:22:10
|
Revision: 49
http://wxdevcenter.svn.sourceforge.net/wxdevcenter/?rev=49&view=rev
Author: cursorstar
Date: 2009-08-08 15:22:02 +0000 (Sat, 08 Aug 2009)
Log Message:
-----------
Add task support.
Modified Paths:
--------------
trunk/wxdevcenter/src/plugins/text/bookmark.cpp
trunk/wxdevcenter/src/plugins/text/text.cpp
trunk/wxdevcenter/src/plugins/text/view.cpp
trunk/wxdevcenter/src/plugins/text/view.hpp
trunk/wxdevcenter/src/sys/Makefile.am
trunk/wxdevcenter/src/sys/Makefile.in
Added Paths:
-----------
trunk/wxdevcenter/src/sys/task.cpp
trunk/wxdevcenter/src/sys/task.hpp
Modified: trunk/wxdevcenter/src/plugins/text/bookmark.cpp
===================================================================
--- trunk/wxdevcenter/src/plugins/text/bookmark.cpp 2009-08-04 05:19:15 UTC (rev 48)
+++ trunk/wxdevcenter/src/plugins/text/bookmark.cpp 2009-08-08 15:22:02 UTC (rev 49)
@@ -243,6 +243,7 @@
m_list->InsertColumn(0, _("Line"), wxLIST_FORMAT_LEFT, 48);
m_list->InsertColumn(1, _("Name"));
+ return true;
}
void dcBookmarkWorkBar::OnNewPerspective(bool shown, const dcPerspective& perspec)
Modified: trunk/wxdevcenter/src/plugins/text/text.cpp
===================================================================
--- trunk/wxdevcenter/src/plugins/text/text.cpp 2009-08-04 05:19:15 UTC (rev 48)
+++ trunk/wxdevcenter/src/plugins/text/text.cpp 2009-08-08 15:22:02 UTC (rev 49)
@@ -332,7 +332,6 @@
GetCommandProcessor()->Store(new cmdTextInsert(this, pos, len, text));
Modify();
}
- dump();
}
void dcTextDocument::RelayDocWatcherEventRemove(int pos, int len, int linesAdded, const char *text)
@@ -344,7 +343,6 @@
GetCommandProcessor()->Store(new cmdTextRemove(this, pos, len, text));
Modify();
}
- dump();
}
void dcTextDocument::dump()
@@ -508,10 +506,6 @@
m_actionsTools = new dcActionGroupEntry(viewTempl, wxID_ANY, wxdcACTION_GROUP_ENTRY_TOOLS, wxT(""), wxT(""), wxT(""), wxdcACTION_GROUP_PRIORITY_TOOLS);
dcActionManager::Register(m_actionsTools);
-// m_actionsTools->Append(XRCID("TEST1"), _("Test1"));
-// m_actionsTools->Append(XRCID("TEST2"), _("Test2"));
-// m_actionsTools->Append(XRCID("TEST3"), _("Test3"));
-
dcActionGroup* modify = m_actionsTools->AppendSubGroup(wxID_ANY, _("Modify"));
modify->Append(XRCID("CHANGE_UPPER"), _("Change upper"), _("Change case upper"));
modify->Append(XRCID("CHANGE_LOWER"), _("Change lower"), _("Change case lower"));
Modified: trunk/wxdevcenter/src/plugins/text/view.cpp
===================================================================
--- trunk/wxdevcenter/src/plugins/text/view.cpp 2009-08-04 05:19:15 UTC (rev 48)
+++ trunk/wxdevcenter/src/plugins/text/view.cpp 2009-08-08 15:22:02 UTC (rev 49)
@@ -95,29 +95,8 @@
EVT_ACTION(XRCID("NEXT_BOOKMARK"), dcTextView::OnNextBookmark)
EVT_ACTION(XRCID("PREV_BOOKMARK"), dcTextView::OnPrevBookmark)
EVT_ACTION(XRCID("CLEAR_BOOKMARK"), dcTextView::OnClearBookmark)
-
-// EVT_ACTION(XRCID("TEST1"), dcTextView::OnTest1)
-// EVT_ACTION(XRCID("TEST2"), dcTextView::OnTest2)
-// EVT_ACTION(XRCID("TEST3"), dcTextView::OnTest3)
END_EVENT_TABLE()
-void dcTextView::OnTest1(dcActionEvent& event)
-{
- GetDocument()->insertText(0, _("Bonjour"));
-}
-
-void dcTextView::OnTest2(dcActionEvent& event)
-{
- GetDocument()->removeText(0, 3);
-}
-
-void dcTextView::OnTest3(dcActionEvent& event)
-{
- GetDocument()->replaceText(0, 3, _("Bonjour"));
-}
-
-
-
dcTextView::dcTextView():
dcView(),
m_lang(wxID_ANY),
Modified: trunk/wxdevcenter/src/plugins/text/view.hpp
===================================================================
--- trunk/wxdevcenter/src/plugins/text/view.hpp 2009-08-04 05:19:15 UTC (rev 48)
+++ trunk/wxdevcenter/src/plugins/text/view.hpp 2009-08-08 15:22:02 UTC (rev 49)
@@ -80,10 +80,6 @@
void UpdateBookmarkWorkBar();
private:
- void OnTest1(dcActionEvent& event);
- void OnTest2(dcActionEvent& event);
- void OnTest3(dcActionEvent& event);
-
void OnCut(dcActionEvent& event);
void OnCopy(dcActionEvent& event);
void OnPaste(dcActionEvent& event);
Modified: trunk/wxdevcenter/src/sys/Makefile.am
===================================================================
--- trunk/wxdevcenter/src/sys/Makefile.am 2009-08-04 05:19:15 UTC (rev 48)
+++ trunk/wxdevcenter/src/sys/Makefile.am 2009-08-08 15:22:02 UTC (rev 49)
@@ -13,7 +13,9 @@
plugin.hpp \
plugin.cpp \
config.hpp \
- config.cpp
+ config.cpp \
+ task.hpp \
+ task.cpp
libsys_la_CXXFLAGS = \
-DPLUGIN_LIBDIR="\"$(PLUGIN_LIBDIR)\"" \
Modified: trunk/wxdevcenter/src/sys/Makefile.in
===================================================================
--- trunk/wxdevcenter/src/sys/Makefile.in 2009-08-04 05:19:15 UTC (rev 48)
+++ trunk/wxdevcenter/src/sys/Makefile.in 2009-08-08 15:22:02 UTC (rev 49)
@@ -44,7 +44,7 @@
LTLIBRARIES = $(noinst_LTLIBRARIES)
libsys_la_LIBADD =
am_libsys_la_OBJECTS = libsys_la-action.lo libsys_la-manager.lo \
- libsys_la-plugin.lo libsys_la-config.lo
+ libsys_la-plugin.lo libsys_la-config.lo libsys_la-task.lo
libsys_la_OBJECTS = $(am_libsys_la_OBJECTS)
libsys_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(libsys_la_CXXFLAGS) \
@@ -248,7 +248,9 @@
plugin.hpp \
plugin.cpp \
config.hpp \
- config.cpp
+ config.cpp \
+ task.hpp \
+ task.cpp
libsys_la_CXXFLAGS = \
-DPLUGIN_LIBDIR="\"$(PLUGIN_LIBDIR)\"" \
@@ -310,6 +312,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsys_la-config.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsys_la-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsys_la-plugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsys_la-task.Plo@am__quote@
.cpp.o:
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -360,6 +363,13 @@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsys_la_CXXFLAGS) $(CXXFLAGS) -c -o libsys_la-config.lo `test -f 'config.cpp' || echo '$(srcdir)/'`config.cpp
+libsys_la-task.lo: task.cpp
+@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsys_la_CXXFLAGS) $(CXXFLAGS) -MT libsys_la-task.lo -MD -MP -MF $(DEPDIR)/libsys_la-task.Tpo -c -o libsys_la-task.lo `test -f 'task.cpp' || echo '$(srcdir)/'`task.cpp
+@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/libsys_la-task.Tpo $(DEPDIR)/libsys_la-task.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='task.cpp' object='libsys_la-task.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsys_la_CXXFLAGS) $(CXXFLAGS) -c -o libsys_la-task.lo `test -f 'task.cpp' || echo '$(srcdir)/'`task.cpp
+
mostlyclean-libtool:
-rm -f *.lo
Added: trunk/wxdevcenter/src/sys/task.cpp
===================================================================
--- trunk/wxdevcenter/src/sys/task.cpp (rev 0)
+++ trunk/wxdevcenter/src/sys/task.cpp 2009-08-08 15:22:02 UTC (rev 49)
@@ -0,0 +1,563 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * wxdevcenter
+ * Copyright (C) Emilien KIA 2009 <emi...@fr...>
+ *
+ * wxdevcenter is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * wxdevcenter is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "../wxdevcenter.hpp"
+#include "../application.hpp"
+#include "task.hpp"
+
+#include <wx/thread.h>
+
+//==========================================================================
+// dcTask
+//==========================================================================
+
+dcTask::dcTask():
+name(),
+comment(),
+art(),
+min(0),
+max(0),
+pos(0),
+state(WAITING)
+{
+}
+
+dcTask::dcTask(const wxString& name, int min, int max):
+name(name),
+comment(),
+art(),
+min(min),
+max(max),
+pos(min),
+state(WAITING)
+{
+}
+
+dcTask::dcTask(const wxString& name, const wxString& art, int min, int max):
+name(name),
+comment(),
+art(art),
+min(min),
+max(max),
+pos(min),
+state(WAITING)
+{
+}
+
+void dcTask::run()
+{
+ setState(RUNNING);
+ if(execute())
+ setState(SUCCESS);
+ else
+ setState(FAILED);
+}
+
+//==========================================================================
+// dcTaskThread
+//=========================================================================
+class dcTaskThread : public wxThread
+{
+public:
+ dcTaskThread(dcAsynchronousTask* async):wxThread(),async(async){}
+ virtual ExitCode Entry();
+protected:
+ dcAsynchronousTask* async;
+};
+
+void* dcTaskThread::Entry(){
+ if(async!=NULL){
+ async->run();
+ async->clearThread();
+ }
+}
+
+
+//==========================================================================
+// dcAsynchronousTask
+//==========================================================================
+
+dcAsynchronousTask::dcAsynchronousTask():
+dcTask(),
+interrupted(false)
+{
+}
+
+dcAsynchronousTask::dcAsynchronousTask(const wxString& name, int min, int max):
+dcTask(name, min, max),
+interrupted(false)
+{
+}
+
+dcAsynchronousTask::dcAsynchronousTask(const wxString& name, const wxString& art, int min, int max):
+dcTask(name, art, min, max),
+interrupted(false)
+{
+}
+
+
+void dcAsynchronousTask::clearThread(){
+ wxCriticalSectionLocker locker(cs);
+ thread=NULL;
+}
+
+wxString dcAsynchronousTask::getName()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getName();
+}
+
+wxString dcAsynchronousTask::getComment()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getComment();
+}
+
+wxString dcAsynchronousTask::getArt()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getArt();
+}
+
+int dcAsynchronousTask::getMin()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getMin();
+}
+
+int dcAsynchronousTask::getMax()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getMax();
+}
+
+int dcAsynchronousTask::getPos()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getPos();
+}
+
+dcTask::State dcAsynchronousTask::getState()const{
+ wxCriticalSectionLocker locker(cs);
+ return dcTask::getState();
+}
+
+void dcAsynchronousTask::setName(const wxString& name){
+ {
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setName(name);
+ }
+ callNameChanged();
+}
+
+void dcAsynchronousTask::setComment(const wxString& comment){
+ {
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setComment(comment);
+ }
+ callCommentChanged();
+}
+
+void dcAsynchronousTask::setArt(const wxString& art){
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setArt(art);
+}
+
+void dcAsynchronousTask::setMin(int min){
+ {
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setMin(min);
+ }
+ callMinChanged();
+}
+
+void dcAsynchronousTask::setMax(int max){
+ {
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setMax(max);
+ }
+ callMaxChanged();
+}
+
+void dcAsynchronousTask::setPos(int pos){
+ {
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setPos(pos);
+ }
+ callPosChanged();
+}
+
+void dcAsynchronousTask::setState(State state){
+ {
+ wxCriticalSectionLocker locker(cs);
+ dcTask::setState(state);
+ }
+ callStateChanged();
+}
+
+bool dcAsynchronousTask::runAsync(){
+ thread = new dcTaskThread(this);
+ if(thread!=NULL){
+ if(thread->Create()!=wxTHREAD_NO_ERROR)
+ return false;
+ return thread->Run()==wxTHREAD_NO_ERROR;
+ }
+ return false;
+}
+
+void dcAsynchronousTask::addListner(Listener* listner)
+{
+ listners.insert(listner);
+}
+
+void dcAsynchronousTask::remListner(Listener* listner)
+{
+ listners.erase(listner);
+}
+
+void dcAsynchronousTask::callNameChanged(){
+ wxString str = getName();
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onNameChange(str, this);
+}
+
+void dcAsynchronousTask::callCommentChanged(){
+ wxString str = getComment();
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onCommentChange(str, this);
+}
+
+void dcAsynchronousTask::callMinChanged(){
+ int i = getMin();
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onMinChange(i, this);
+}
+
+void dcAsynchronousTask::callMaxChanged(){
+ int i = getMax();
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onMaxChange(i, this);
+}
+
+void dcAsynchronousTask::callPosChanged(){
+ int i = getPos();
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onPosChange(i, this);
+}
+
+void dcAsynchronousTask::callStateChanged(){
+ State s = getState();
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onStateChange(s, this);
+}
+
+void dcAsynchronousTask::interrupt(){
+ wxCriticalSectionLocker locker(cs);
+ interrupted = true;
+}
+
+bool dcAsynchronousTask::isInterrupted()const{
+ wxCriticalSectionLocker locker(cs);
+ return interrupted;
+}
+
+
+
+//==========================================================================
+// dcTaskManager
+//==========================================================================
+
+dcAsynchronousTaskManager dcAsynchronousTaskManager::instance;
+
+void dcAsynchronousTaskManager::add(dcAsynchronousTask* task, bool run)
+{
+ tasks.push_back(task);
+ callAddTask(task);
+ if(run)
+ task->runAsync();
+}
+
+void dcAsynchronousTaskManager::rem(dcAsynchronousTask* task, bool del)
+{
+ callRemTask(task);
+ if(del)
+ delete task;
+}
+
+void dcAsynchronousTaskManager::addListner(Listener* listner)
+{
+ listners.insert(listner);
+}
+
+void dcAsynchronousTaskManager::remListner(Listener* listner)
+{
+ listners.erase(listner);
+}
+
+void dcAsynchronousTaskManager::callAddTask(dcAsynchronousTask* task)
+{
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onAddTask(task, this);
+}
+
+void dcAsynchronousTaskManager::callRemTask(dcAsynchronousTask* task)
+{
+ for(std::set<Listener*>::iterator iter=listners.begin(); iter!=listners.end(); iter++)
+ (*iter)->onRemTask(task, this);
+}
+
+
+//==========================================================================
+// dcAsyncTaskWorkBar
+//==========================================================================
+
+IMPLEMENT_DYNAMIC_CLASS(dcAsyncTaskWorkBar, dcWorkBar)
+
+BEGIN_EVENT_TABLE(dcAsyncTaskWorkBar, dcWorkBar)
+END_EVENT_TABLE()
+
+dcAsyncTaskWorkBar::dcAsyncTaskWorkBar():
+dcWorkBar(),
+scrolled(NULL)
+{
+}
+
+bool dcAsyncTaskWorkBar::Create(wxWindow* parent, wxWindowID id)
+{
+ if(!dcWorkBar::Create(parent, id))
+ return false;
+
+ wxSizer *szTop = new wxBoxSizer(wxVERTICAL),
+ *szScrolled = new wxBoxSizer(wxVERTICAL);
+ scrolled = new wxScrolledWindow(this, wxID_ANY);
+ szTop->Add(scrolled, 1, wxEXPAND);
+ scrolled->SetSizer(szScrolled);
+ SetSizer(szTop);
+
+ dcAsynchronousTaskManager::getInstance().addListner(this);
+
+ return true;
+}
+
+wxSizer* dcAsyncTaskWorkBar::getScrollSizer()
+{
+ return scrolled!=NULL?scrolled->GetSizer():NULL;
+}
+
+void dcAsyncTaskWorkBar::onAddTask(dcAsynchronousTask* task, dcAsynchronousTaskManager*)
+{
+ dcAsyncTaskWorkBarItem* item = new dcAsyncTaskWorkBarItem(task, this, wxID_ANY);
+ map[task] = item;
+ getScrollSizer()->Add(item, 0, wxEXPAND);
+ getScrollSizer()->Layout();
+}
+
+void dcAsyncTaskWorkBar::onRemTask(dcAsynchronousTask* task, dcAsynchronousTaskManager*)
+{
+ PanelMap::iterator iter = map.find(task);
+ if(iter!=map.end())
+ {
+ dcAsyncTaskWorkBarItem* item = iter->second;
+ map.erase(iter);
+ getScrollSizer()->Detach(item);
+ item->Destroy();
+ }
+}
+
+
+//==========================================================================
+// dcAsyncTaskWorkBarItem
+//==========================================================================
+
+IMPLEMENT_DYNAMIC_CLASS(dcAsyncTaskWorkBarItem, wxPanel)
+
+BEGIN_EVENT_TABLE(dcAsyncTaskWorkBarItem, wxPanel)
+ EVT_BUTTON(wxID_CLOSE, dcAsyncTaskWorkBarItem::onClose)
+END_EVENT_TABLE()
+
+dcAsyncTaskWorkBarItem::dcAsyncTaskWorkBarItem():
+wxPanel(),
+task(NULL),
+min(-1),
+max(-1),
+pos(-1)
+{
+}
+
+dcAsyncTaskWorkBarItem::dcAsyncTaskWorkBarItem(dcAsynchronousTask* task, wxWindow* parent, wxWindowID id):
+wxPanel(),
+task(NULL),
+min(-1),
+max(-1),
+pos(-1)
+{
+ Create(task, parent, id);
+}
+
+bool dcAsyncTaskWorkBarItem::Create(dcAsynchronousTask* task, wxWindow* parent, wxWindowID id)
+{
+ if(!wxPanel::Create(parent, id))
+ return false;
+
+ this->task = task;
+
+ title = new wxStaticText(this, wxID_ANY, task->getName());
+ comment = new wxStaticText(this, wxID_ANY, task->getComment());
+ progress = new wxGauge(this, wxID_ANY, 1);
+ cancel = new wxButton(this, wxID_CANCEL);
+ close = new wxButton(this, wxID_CLOSE);
+
+ cancel->Enable(task->canInterrupt());
+
+ wxFont font = title->GetFont();
+ font.SetWeight(wxFONTWEIGHT_BOLD);
+ title->SetFont(font);
+
+ wxSizer *topSz = new wxBoxSizer(wxVERTICAL),
+ *pgSz = new wxBoxSizer(wxHORIZONTAL);
+ topSz->Add(title, 0, wxEXPAND);
+ topSz->Add(comment, 0, wxEXPAND);
+ pgSz->Add(progress, 1, wxALIGN_CENTER|wxALL, 4);
+ pgSz->Add(cancel, 0, wxEXPAND|wxALL, 4);
+ pgSz->Add(close, 0, wxEXPAND|wxALL, 4);
+ topSz->Add(pgSz, 0, wxEXPAND);
+ SetSizer(topSz);
+
+ set(task->getMin(), task->getMax(), task->getPos());
+ task->addListner(this);
+
+ col = GetBackgroundColour();
+
+ return true;
+}
+
+void dcAsyncTaskWorkBarItem::set(int min, int max, int pos)
+{
+ if(min!=this->min || max!=this->max)
+ {
+ if(min<max)
+ {
+ progress->SetRange(max-min);
+ }
+ this->min = min;
+ this->max = max;
+ }
+
+ if(pos!=this->pos)
+ {
+ if(min<max)
+ progress->SetValue(pos-min);
+ else
+ progress->Pulse();
+ this->pos = pos;
+ }
+}
+
+
+void dcAsyncTaskWorkBarItem::onNameChange(const wxString& title, dcAsynchronousTask* task)
+{
+ wxMutexGuiEnter();
+ this->title->SetLabel(title);
+ wxMutexGuiLeave();
+}
+
+void dcAsyncTaskWorkBarItem::onCommentChange(const wxString& comment, dcAsynchronousTask* task)
+{
+ wxMutexGuiEnter();
+ this->comment->SetLabel(comment);
+ wxMutexGuiLeave();
+}
+
+void dcAsyncTaskWorkBarItem::onMinChange(int min, dcAsynchronousTask* task)
+{
+ wxMutexGuiEnter();
+ set(min, max, pos);
+}
+
+void dcAsyncTaskWorkBarItem::onMaxChange(int max, dcAsynchronousTask* task)
+{
+ wxMutexGuiEnter();
+ set(min, max, pos);
+ wxMutexGuiLeave();
+}
+
+void dcAsyncTaskWorkBarItem::onPosChange(int pos, dcAsynchronousTask* task)
+{
+ wxMutexGuiEnter();
+ set(min, max, pos);
+ wxMutexGuiLeave();
+}
+
+void dcAsyncTaskWorkBarItem::onStateChange(dcTask::State state, dcAsynchronousTask* task)
+{
+ wxMutexGuiEnter();
+ switch(state){
+ case dcTask::SUCCESS:
+ {
+ SetBackgroundColour(mixColour(col, 3, *wxGREEN, 1));
+ GetSizer()->Show(cancel, false, true);
+ GetSizer()->Show(close, true, true);
+ break;
+ }
+ case dcTask::FAILED:
+ {
+ SetBackgroundColour(mixColour(col, 3, *wxRED, 1));
+ GetSizer()->Show(cancel, false, true);
+ GetSizer()->Show(close, true, true);
+ break;
+ }
+ default:
+ {
+ SetBackgroundColour(col);
+ GetSizer()->Show(cancel, true, true);
+ GetSizer()->Show(close, false, true);
+ break;
+ }
+ }
+ wxMutexGuiLeave();
+}
+
+wxColour dcAsyncTaskWorkBarItem::mixColour(const wxColour& col1, int ratio1, const wxColour& col2, int ratio2)
+{
+ int r = ((int)col1.Red())*ratio1 + ((int)col2.Red())*ratio2,
+ g = ((int)col1.Green())*ratio1 + ((int)col2.Green())*ratio2,
+ b = ((int)col1.Blue())*ratio1 + ((int)col2.Blue())*ratio2;
+ return wxColour(r/(ratio1+ratio2), g/(ratio1+ratio2), b/(ratio1+ratio2));
+}
+
+void dcAsyncTaskWorkBarItem::onClose(wxCommandEvent& event)
+{
+ dcAsynchronousTaskManager::getInstance().rem(task);
+}
+
+
+//==========================================================================
+// dcTaskModule
+//==========================================================================
+IMPLEMENT_DYNAMIC_CLASS(dcTaskModule, wxModule)
+
+dcTaskModule::dcTaskModule()
+{
+ AddDependency(CLASSINFO(dcWorkBarModule));
+}
+
+bool dcTaskModule::OnInit()
+{
+ dcWorkBarTemplate* wbtempl = new dcWorkBarTemplate(_("Tasks"), _("Background tasks"),
+ CLASSINFO(dcAsyncTaskWorkBar), &wxGetApp());
+ dcWorkBarManager::GetManager().RegisterTemplate(wbtempl);
+ return true;
+}
+
+void dcTaskModule::OnExit()
+{
+}
Added: trunk/wxdevcenter/src/sys/task.hpp
===================================================================
--- trunk/wxdevcenter/src/sys/task.hpp (rev 0)
+++ trunk/wxdevcenter/src/sys/task.hpp 2009-08-08 15:22:02 UTC (rev 49)
@@ -0,0 +1,257 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * wxdevcenter
+ * Copyright (C) Emilien KIA 2009 <emi...@fr...>
+ *
+ * wxdevcenter is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * wxdevcenter is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _TASK_HPP_
+#define _TASK_HPP_
+
+#include <list>
+#include <set>
+#include <map>
+
+class dcTask;
+class dcAsynchronousTask;
+class dcAsyncTaskWorkBarItem;
+class dcTaskThread;
+typedef std::list<dcAsynchronousTask*> dcAsynchronousTaskList;
+
+/**
+ * Base class for task.
+ * Implements execute() with specific code.
+ */
+class dcTask
+{
+public:
+ enum State {
+ WAITING,
+ WAIT_DEPENDS,
+ RUNNING,
+ PAUSED,
+ SUCCESS,
+ FAILED
+ };
+
+ dcTask();
+ dcTask(const wxString& name, int min, int max);
+ dcTask(const wxString& name, const wxString& art, int min, int max);
+
+ virtual wxString getName()const{return name;}
+ virtual wxString getComment()const{return comment;}
+ virtual wxString getArt()const{return art;}
+ virtual int getMin()const{return min;}
+ virtual int getMax()const{return max;}
+ virtual int getPos()const{return pos;}
+
+ virtual State getState()const{return state;}
+
+ virtual bool canPause()const{return false;}
+ virtual void pause(){}
+ virtual void resume(){}
+
+ virtual bool canInterrupt()const{return false;}
+ virtual void interrupt(){}
+
+ /** Run task synchronously. */
+ virtual void run();
+
+protected:
+ virtual void setName(const wxString& name){this->name = name;}
+ virtual void setComment(const wxString& comment){this->comment = comment;}
+ virtual void setArt(const wxString& art){this->art = art;}
+ virtual void setMin(int min){this->min = min;}
+ virtual void setMax(int max){this->max = max;}
+ virtual void setPos(int pos){this->pos = pos;}
+
+ virtual void setState(State state){this->state = state;}
+
+ virtual bool execute()=0;
+
+private:
+ wxString name, comment, art;
+ int min, pos, max;
+
+ State state;
+};
+
+/**
+ * Asynchronous task.
+ */
+class dcAsynchronousTask : public dcTask
+{
+ friend class dcTaskThread;
+public:
+ class Listener{
+ public:
+ virtual void onNameChange(const wxString& title, dcAsynchronousTask* task)=0;
+ virtual void onCommentChange(const wxString& comment, dcAsynchronousTask* task)=0;
+ virtual void onMinChange(int min, dcAsynchronousTask* task)=0;
+ virtual void onMaxChange(int max, dcAsynchronousTask* task)=0;
+ virtual void onPosChange(int pos, dcAsynchronousTask* task)=0;
+ virtual void onStateChange(dcTask::State state, dcAsynchronousTask* task)=0;
+ };
+
+ dcAsynchronousTask();
+ dcAsynchronousTask(const wxString& name, int min, int max);
+ dcAsynchronousTask(const wxString& name, const wxString& art, int min, int max);
+
+ virtual wxString getName()const;
+ virtual wxString getComment()const;
+ virtual wxString getArt()const;
+ virtual int getMin()const;
+ virtual int getMax()const;
+ virtual int getPos()const;
+ virtual State getState()const;
+
+ virtual void interrupt();
+
+ /** Run task asynchronously. */
+ virtual bool runAsync();
+ void addListner(Listener* listner);
+ void remListner(Listener* listner);
+
+protected:
+ virtual void setName(const wxString& name);
+ virtual void setComment(const wxString& comment);
+ virtual void setArt(const wxString& art);
+ virtual void setMin(int min);
+ virtual void setMax(int max);
+ virtual void setPos(int pos);
+ virtual void setState(State state);
+
+ virtual bool isInterrupted()const;
+
+
+ void clearThread();
+
+ void callNameChanged();
+ void callCommentChanged();
+ void callMinChanged();
+ void callMaxChanged();
+ void callPosChanged();
+ void callStateChanged();
+
+private:
+ mutable wxCriticalSection cs;
+ dcTaskThread* thread;
+ std::set<Listener*> listners;
+ bool interrupted;
+};
+
+/**
+ * Asynchronous task manager.
+ */
+class dcAsynchronousTaskManager
+{
+public:
+ class Listener{
+ public:
+ virtual void onAddTask(dcAsynchronousTask* task, dcAsynchronousTaskManager* manager)=0;
+ virtual void onRemTask(dcAsynchronousTask* task, dcAsynchronousTaskManager* manager)=0;
+ };
+
+ /** Singleton retriever. */
+ static dcAsynchronousTaskManager& getInstance(){return instance;}
+
+ void add(dcAsynchronousTask* task, bool run=true);
+ void rem(dcAsynchronousTask* task, bool del=true);
+
+ void addListner(Listener* listner);
+ void remListner(Listener* listner);
+protected:
+ void callAddTask(dcAsynchronousTask* task);
+ void callRemTask(dcAsynchronousTask* task);
+
+private:
+ dcAsynchronousTaskList tasks;
+
+ static dcAsynchronousTaskManager instance;
+
+ std::set<Listener*> listners;
+};
+
+
+/**
+ * Asynchronous task list work bar.
+ */
+class dcAsyncTaskWorkBar: public dcWorkBar, protected dcAsynchronousTaskManager::Listener
+{
+ DECLARE_DYNAMIC_CLASS(dcAsyncTaskWorkBar)
+ DECLARE_EVENT_TABLE()
+public:
+ dcAsyncTaskWorkBar();
+ bool Create(wxWindow* parent, wxWindowID id);
+protected:
+ virtual void onAddTask(dcAsynchronousTask* task, dcAsynchronousTaskManager* manager);
+ virtual void onRemTask(dcAsynchronousTask* task, dcAsynchronousTaskManager* manager);
+
+ wxSizer* getScrollSizer();
+ wxScrolledWindow* scrolled;
+
+ typedef std::map<dcAsynchronousTask*, dcAsyncTaskWorkBarItem*> PanelMap;
+ PanelMap map;
+};
+
+/**
+ * Asynchronous task list item.
+ */
+class dcAsyncTaskWorkBarItem : public wxPanel, protected dcAsynchronousTask::Listener
+{
+ DECLARE_DYNAMIC_CLASS(dcAsyncTaskWorkBarItem)
+ DECLARE_EVENT_TABLE()
+public:
+ dcAsyncTaskWorkBarItem();
+ dcAsyncTaskWorkBarItem(dcAsynchronousTask* task, wxWindow* parent, wxWindowID id);
+ bool Create(dcAsynchronousTask* task, wxWindow* parent, wxWindowID id);
+
+protected:
+ virtual void onNameChange(const wxString& title, dcAsynchronousTask* task);
+ virtual void onCommentChange(const wxString& comment, dcAsynchronousTask* task);
+ virtual void onMinChange(int min, dcAsynchronousTask* task);
+ virtual void onMaxChange(int max, dcAsynchronousTask* task);
+ virtual void onPosChange(int pos, dcAsynchronousTask* task);
+ virtual void onStateChange(dcTask::State state, dcAsynchronousTask* task);
+
+ void set(int min, int max, int pos);
+
+ dcAsynchronousTask *task;
+ wxStaticText *title, *comment;
+ wxGauge *progress;
+ wxButton *cancel, *close;
+ int min, max, pos;
+
+ wxColour col;
+
+ static wxColour mixColour(const wxColour& col1, int ratio1, const wxColour& col2, int ratio2);
+private:
+ void onClose(wxCommandEvent& event);
+};
+
+
+/**
+ * dcTaskModule
+ */
+class dcTaskModule: public wxModule
+{
+ DECLARE_DYNAMIC_CLASS(dcTaskModule)
+public:
+ dcTaskModule();
+ virtual bool OnInit();
+ virtual void OnExit();
+};
+
+#endif // _TASK_HPP_
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|