Develop and Download Open Source Software

Browse CVS Repository

Contents of /malonnote/mnNotePanelController.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (show annotations) (download) (as text)
Tue Jan 3 23:20:39 2006 UTC (18 years, 2 months ago) by maloninc
Branch: MAIN
Changes since 1.7: +1 -1 lines
File MIME type: text/x-c++src
modify "open directory" command for windows, and add SetFont method to
mnHtml

1 #include "mnID.h"
2 #include "mnDef.h"
3 #include "mnNotePanel.h"
4 #include "mnNotePanelController.h"
5 #include <wx/uri.h>
6 #include <wx/config.h>
7 #include <wx/regex.h>
8 #include <wx/utils.h>
9 #include <wx/xrc/xmlres.h>
10 #include <wx/tokenzr.h>
11
12 BEGIN_EVENT_TABLE(mnNotePanelController, wxEvtHandler)
13 EVT_TEXT_ENTER(XRCID("searchTextCtrl"), mnNotePanelController::handleSearch)
14 EVT_TREE_SEL_CHANGED(XRCID("searchTree"), mnNotePanelController::handleTreeItemSelect)
15 EVT_TREE_SEL_CHANGING(XRCID("searchTree"), mnNotePanelController::handleTreeItemSelecting)
16 EVT_TREE_BEGIN_LABEL_EDIT(XRCID("searchTree"), mnNotePanelController::handleBeginLabelEdit)
17 EVT_TREE_END_LABEL_EDIT(XRCID("searchTree"), mnNotePanelController::handleEndLabelEdit)
18 #ifdef __WXMAC__
19 EVT_WEBKIT_STATE_CHANGED(mnNotePanelController::handleLinkClick)
20 #else
21 EVT_COMMAND(XRCID("wikiHtmlTextCtrl"), mnEVT_LINK_CLICK, mnNotePanelController::handleLinkClick)
22 #endif
23 END_EVENT_TABLE()
24
25 mnNotePanelController::mnNotePanelController(mnNotePanel* inPanel, wxString* inWikiDir)
26 {
27 wiki = new mnModel(inWikiDir->mb_str());
28 panel = inPanel;
29 }
30
31 mnNotePanelController::~mnNotePanelController()
32 {
33 }
34
35 const wxString* mnNotePanelController::getWikiDataDir()
36 {
37 return wiki->getWikiDataDir();
38 }
39
40 void mnNotePanelController::handleSearch(wxCommandEvent& event)
41 {
42 wxString* str = new wxString(event.GetString());
43 WikiList* wikiList;
44 WikiList::Node* node;
45
46 wikiList = wiki->search(str->mb_str());
47
48 node = wikiList->GetFirst();
49 if(!node) {
50 wxLogMessage(wxT("Not Found! [%s]"), (const char*)str->c_str());
51 return;
52 }
53
54 if(wiki->addSearchStr(str)) {
55 wiki->addSearchList(str, wikiList);
56 panel->addSearchResult(wiki, str);
57 }
58 else { /* str is already in search list */
59 delete wikiList;
60 }
61 }
62
63 void mnNotePanelController::handleGroup(wxCommandEvent& event)
64 {
65 WikiList* wikiList;
66 const wxArrayString* searchStrList;
67 int i;
68 wxCursor normal;
69 wxCursor watch(wxCURSOR_WATCH);
70
71 panel->SetCursor(watch);
72 wiki->group();
73 panel->clearAllTree();
74 searchStrList = wiki->getSearchStrList();
75 for(i = 0; i < searchStrList->Count(); i++) {
76 wxString& searchStr = searchStrList->Item(i);
77 panel->addSearchResult(wiki, &searchStr);
78 }
79 panel->SetCursor(normal);
80 }
81
82 void mnNotePanelController::handleNew(wxCommandEvent& event)
83 {
84 int ans;
85 WikiData* wikiData = wiki->newWikiData();
86 wxString plainTextStr;
87 wxString newSubjectStr;
88 mnWikiDataEntryDialog* dlg = new mnWikiDataEntryDialog(panel);
89 const wxString* wikiText = wikiData->getText();
90 const wxString* subject = wikiData->getSubject();
91
92 dlg->setSubject(*subject);
93 dlg->setPlainText(*wikiText);
94 ans = dlg->ShowModal();
95
96 if(ans != wxID_OK) return ;
97
98 plainTextStr = dlg->getPlainText();
99 newSubjectStr = dlg->getSubject();
100 wikiData->modText(&plainTextStr);
101 wikiData->save();
102
103 wikiData->modSubject(&newSubjectStr);
104
105 notifyUpdate(wikiData);
106
107 delete dlg;
108 }
109
110 void mnNotePanelController::handleRemove(wxCommandEvent& event)
111 {
112 wxTreeItemData* item = panel->getSelectedItem();
113
114 if(panel->isEditableTreeLabel(panel->getSelection())) {
115 if(wxMessageBox(wxT("Do you realy remove this memo?\n") + panel->getSelectedLabel(), wxT("Realy?"), wxYES_NO|wxICON_QUESTION) == wxYES){
116 ((WikiData*)(item))->removeDataFile();
117 notifyUpdate((WikiData*)(item));
118 }
119 else {
120 return;
121 }
122 }
123 else {
124 wiki->removeSearchStr(panel->getSelectedLabel());
125 panel->removeSelectedItem();
126 }
127
128 }
129
130 void mnNotePanelController::handleHighlight(wxCommandEvent& event)
131 {
132 panel->highlightSelectedItem();
133 }
134
135
136 void mnNotePanelController::handleTreeItemSelect(wxTreeEvent& event)
137 {
138 panel->showSelectedItemText(event);
139 }
140
141
142 void mnNotePanelController::handleTreeItemSelecting(wxTreeEvent& event)
143 {
144 }
145
146 void mnNotePanelController::handleBeginLabelEdit(wxTreeEvent& event)
147 {
148 if(!panel->isEditableTreeLabel(event.GetItem())) event.Veto();
149 }
150
151 void mnNotePanelController::handleEndLabelEdit(wxTreeEvent& event)
152 {
153 wxString newSubject = event.GetLabel();
154 wxTreeItemData* item = panel->getSelectedItem();
155
156 if(item == NULL) {
157 return ;
158 }
159
160 if(newSubject.Len() == 0) {
161 event.Veto();
162 return;
163 }
164
165 ((WikiData*)(item))->modSubject(&newSubject);
166
167 event.Veto();
168
169 notifyUpdate((WikiData*)item);
170 }
171
172 void mnNotePanelController::handleTreeExpand(wxCommandEvent& event)
173 {
174 panel->expandAllTree();
175 }
176
177 void mnNotePanelController::handleTreeCollapse(wxCommandEvent& event)
178 {
179 panel->collapseAllTree();
180 }
181
182 void mnNotePanelController::handleTreeClear(wxCommandEvent& event)
183 {
184 wiki->clearSearchStrList();
185 wiki->clearSearchResultList();
186 panel->clearAllTree();
187 }
188
189 void mnNotePanelController::handleEdit(wxCommandEvent& event)
190 {
191 wxString plainTextStr;
192 wxString newSubjectStr;
193 wxTreeItemData* itemData = panel->getSelectedItem();
194 wxString subject = panel->getSelectedLabel();
195 mnWikiDataEntryDialog* dlg = new mnWikiDataEntryDialog(panel);
196 int ans;
197
198 if(!panel->isEditableTreeLabel(panel->getSelection())) return; /* selection is not memo data */
199
200 const wxString* wikiText = ((WikiData*)(itemData))->getText();
201
202 dlg->setSubject(subject);
203 dlg->setPlainText(*wikiText);
204 ans = dlg->ShowModal();
205
206 if(ans != wxID_OK) return ;
207 if(itemData == NULL) return ;
208
209 plainTextStr = dlg->getPlainText();
210 newSubjectStr = dlg->getSubject();
211 ((WikiData*)(itemData))->modText(&plainTextStr);
212 ((WikiData*)(itemData))->save();
213
214 ((WikiData*)(itemData))->modSubject(&newSubjectStr);
215
216 notifyUpdate((WikiData*)itemData);
217
218 delete dlg;
219 }
220
221 wxString mnNotePanelController::delPercent(const wxString& str)
222 {
223 #ifdef __WXMAC__
224 wxURI uri;
225 return uri.Unescape(str);
226 #else
227 return str;
228 #endif
229 }
230
231
232 void mnNotePanelController::notifyUpdate(WikiData* data)
233 {
234 const wxArrayString* searchStrList= wiki->getSearchStrList();
235 char* tokenList[32];
236
237 memset(tokenList, 0, sizeof(char*)*32);
238 for(int i = 0; i < searchStrList->Count(); i++) {
239 wxString& searchStr = searchStrList->Item(i);
240 if( wiki->makeSearchToken(searchStr.mb_str(), tokenList) ) { /* create token */
241 if(wiki->matchWithToken((wxString*)(data->getFileName()), tokenList)) { /* match */
242 wiki->addSearchResultList(&searchStr, data);
243 panel->updateSearchResult(wiki, &searchStr);
244 }
245 else { /* not match */
246 if( wiki->delSearchResultList(&searchStr, data) ) {
247 panel->updateSearchResult(wiki, &searchStr); /* only when suceed to delete */
248 }
249 }
250 for(int j = 0; tokenList[j] != NULL; j++) free(tokenList[j]);
251 memset(tokenList, 0, sizeof(char*)*32);
252 }
253 }
254 data->setOldSubjectFromCurrent(); // restore old subject
255 }
256
257 #ifdef __WXMAC__
258 void mnNotePanelController::handleLinkClick(wxWebKitStateChangedEvent &event)
259 #else
260 void mnNotePanelController::handleLinkClick(wxCommandEvent &event)
261 #endif
262 {
263 wxString href;
264 const wxString* wikiDataDir;
265 #ifdef __WXMAC__
266 href = event.GetURL();
267 if (href.Find(wxT("file:///tmp/")) == -1 &&
268 href.Length() != 0 &&
269 event.GetState() == wxWEBKIT_STATE_NEGOTIATING){
270 ((wxWebKitCtrl*)(event.GetEventObject()))->Stop(); // Stop native webkit loading
271 }
272 else {
273 event.Skip();
274 }
275 #else
276 href = event.GetString();
277 #endif
278
279 if(href.Find(wxT("file:///tmp/")) != -1) {
280 // do nothing
281 }
282 else if(href.Find(wxT(MNLINK)) != -1) {
283 wxRegEx exp(wxT(MNLINK));
284 exp.Replace(&href, wxT(""));
285 event.SetString((delPercent(href)).c_str());
286 handleSearch(event);
287 }
288 else if(href.Find(wxT(MNDOC)) != -1) {
289 wxRegEx exp(wxT(MNDOC));
290 exp.Replace(&href, wxT(""));
291 wikiDataDir = wiki->getWikiDataDir();
292 wxString doc = *wikiDataDir + wxT(DOCS_DIR) + delPercent(href);
293 openDoc(doc);
294 }
295 else {
296 openUrl(href);
297 }
298 }
299
300 void mnNotePanelController::handleOpenDocsDir(wxCommandEvent &event)
301 {
302 const wxString* wikiDataDir;
303 wxString cmd;
304 wxString docDir;
305
306 wikiDataDir = wiki->getWikiDataDir();
307 docDir = *wikiDataDir + wxT(DOCS_DIR);
308
309 /* create docs directory, anyway */
310 cmd.sprintf(wxT(MKDIR), docDir.c_str());
311 wxExecute(cmd);
312
313 /* open docs directory */
314 openDoc(docDir);
315 }
316
317 void mnNotePanelController::openUrl(wxString& url)
318 {
319 wxString cmd;
320
321 #ifdef __WXMSW__
322 cmd.sprintf(wxT("cmd /c \"start %s\""), url.c_str());
323 #endif
324
325 #ifdef __WXMAC__
326 cmd.sprintf(wxT("open %s"), url.c_str());
327 #endif
328
329 #ifdef __WXCOCOA__
330 cmd.sprintf(wxT("open %s"), url.c_str());
331 #endif
332
333 #ifdef __WXGTK__
334 cmd.sprintf(wxT("gnome-open %s"), url.c_str());
335 #endif
336
337 //wxExecute(argv);
338 wxExecute(cmd);
339 }
340
341 void mnNotePanelController::openDoc(wxString& doc)
342 {
343 wxString cmd;
344
345 #ifdef __WXMSW__
346 cmd.sprintf(wxT("cmd /c \"start %s\""), doc.c_str());
347 #endif
348
349 #ifdef __WXMAC__
350 cmd.sprintf(wxT("open %s"), doc.c_str());
351 #endif
352
353 #ifdef __WXCOCOA__
354 cmd.sprintf(wxT("open %s"), doc.c_str());
355 #endif
356
357 #ifdef __WXGTK__
358 cmd.sprintf(wxT("gnome-open %s"), doc.c_str());
359 #endif
360
361 wxExecute(cmd);
362 }
363

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26