~s-cecilio/lenmus/v5.3

« back to all changes in this revision

Viewing changes to src/app/lenmus_document_frame.cpp

  • Committer: cecilios
  • Date: 2012-09-11 16:59:18 UTC
  • Revision ID: svn-v4:2587a929-2f0e-0410-ae78-fe6f687d5efe:branches/TRY-5.0:730
Paths: fixed problem with installation folders. Fixed Chinese ISO language code

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//---------------------------------------------------------------------------------------
 
2
//    LenMus Phonascus: The teacher of music
 
3
//    Copyright (c) 2002-2012 LenMus project
 
4
//
 
5
//    This program is free software; you can redistribute it and/or modify it under the
 
6
//    terms of the GNU General Public License as published by the Free Software Foundation,
 
7
//    either version 3 of the License, or (at your option) any later version.
 
8
//
 
9
//    This program is distributed in the hope that it will be useful, but WITHOUT ANY
 
10
//    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 
11
//    PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 
12
//
 
13
//    You should have received a copy of the GNU General Public License along with this
 
14
//    program. If not, see <http://www.gnu.org/licenses/>.
 
15
//
 
16
//    For any comment, suggestion or feature request, please contact the manager of
 
17
//    the project at cecilios@users.sourceforge.net
 
18
//
 
19
//---------------------------------------------------------------------------------------
 
20
 
 
21
//lenmus
 
22
#include "lenmus_document_frame.h"
 
23
 
 
24
#include "lenmus_canvas.h"
 
25
#include "lenmus_document_canvas.h"
 
26
#include "lenmus_string.h"
 
27
#include "lenmus_midi_server.h"
 
28
#include "lenmus_dyncontrol.h"
 
29
#include "lenmus_standard_header.h"
 
30
#include "lenmus_book_reader.h"
 
31
#include "lenmus_content_box.h"
 
32
#include "lenmus_content_box_ctrol.h"
 
33
#include "lenmus_zip_reader.h"
 
34
 
 
35
//lomse
 
36
#include <lomse_shapes.h>
 
37
 
 
38
//wxWidgets
 
39
#include <wx/filename.h>
 
40
 
 
41
 
 
42
//toc
 
43
#include <wx/textctrl.h>
 
44
#include <wx/notebook.h>
 
45
#include <wx/imaglist.h>
 
46
#include <wx/treectrl.h>
 
47
#include <wx/tokenzr.h>
 
48
#include <wx/wfstream.h>
 
49
#include <wx/html/htmlwin.h>
 
50
#include <wx/busyinfo.h>
 
51
#include <wx/progdlg.h>
 
52
#include <wx/toolbar.h>
 
53
#include <wx/fontenum.h>
 
54
#include <wx/stream.h>
 
55
#include <wx/filedlg.h>
 
56
#include <wx/artprov.h>
 
57
#include <wx/spinctrl.h>
 
58
#include <wx/dynarray.h>
 
59
#include <wx/choicdlg.h>
 
60
#include <wx/settings.h>
 
61
 
 
62
 
 
63
 
 
64
namespace lenmus
 
65
{
 
66
//--------------------------------------------------------------------------
 
67
// TextBookHelpTreeItemData (private)
 
68
//--------------------------------------------------------------------------
 
69
 
 
70
class TextBookHelpTreeItemData : public wxTreeItemData
 
71
{
 
72
    public:
 
73
        TextBookHelpTreeItemData(int id) : wxTreeItemData()
 
74
            { m_Id = id;}
 
75
 
 
76
        int m_Id;
 
77
};
 
78
 
 
79
 
 
80
//--------------------------------------------------------------------------
 
81
// TextBookHelpHashData (private)
 
82
//--------------------------------------------------------------------------
 
83
 
 
84
class TextBookHelpHashData : public wxObject
 
85
{
 
86
    public:
 
87
        TextBookHelpHashData(int index, long id) : wxObject()
 
88
            { m_Index = index; m_Id = id;}
 
89
        ~TextBookHelpHashData() {}
 
90
 
 
91
        int m_Index;
 
92
        long m_Id;
 
93
};
 
94
 
 
95
 
 
96
//---------------------------------------------------------------------------
 
97
// DocumentFrame::m_mergedIndex
 
98
//---------------------------------------------------------------------------
 
99
 
 
100
WX_DEFINE_ARRAY_PTR(const BookIndexItem*, wxHtmlHelpDataItemPtrArray);
 
101
 
 
102
struct TextBookHelpMergedIndexItem
 
103
{
 
104
    TextBookHelpMergedIndexItem *parent;
 
105
    wxString                   name;
 
106
    wxHtmlHelpDataItemPtrArray items;
 
107
};
 
108
 
 
109
WX_DECLARE_OBJARRAY(TextBookHelpMergedIndexItem, TextBookHelpMergedIndex);
 
110
#include <wx/arrimpl.cpp>
 
111
WX_DEFINE_OBJARRAY(TextBookHelpMergedIndex)
 
112
 
 
113
//void DocumentFrame::UpdateMergedIndex()
 
114
//{
 
115
//    // Updates "merged index" structure that combines indexes of all books
 
116
//    // into better searchable structure
 
117
//
 
118
//    delete m_mergedIndex;
 
119
//    m_mergedIndex = LENMUS_NEW TextBookHelpMergedIndex;
 
120
//    TextBookHelpMergedIndex& merged = *m_mergedIndex;
 
121
//
 
122
//    const BookIndexArray& items = m_pBookReader->GetIndexArray();
 
123
//    size_t len = items.size();
 
124
//
 
125
//    TextBookHelpMergedIndexItem *history[128] = {NULL};
 
126
//
 
127
//    for (size_t i = 0; i < len; i++)
 
128
//    {
 
129
//        const BookIndexItem* pItem = items[i];
 
130
//        wxASSERT_MSG( pItem->level < 128, _T("nested index entries too deep") );
 
131
//
 
132
//        if (history[pItem->level] &&
 
133
//            history[pItem->level]->items[0]->title == pItem->title)
 
134
//        {
 
135
//            // same index entry as previous one, update list of items
 
136
//            history[pItem->level]->items.Add(pItem);
 
137
//        }
 
138
//        else
 
139
//        {
 
140
//            // LENMUS_NEW index entry
 
141
//            TextBookHelpMergedIndexItem *mi = LENMUS_NEW TextBookHelpMergedIndexItem();
 
142
//            mi->name = pItem->GetIndentedName();
 
143
//            mi->items.Add(pItem);
 
144
//            mi->parent = (pItem->level == 0) ? NULL : history[pItem->level - 1];
 
145
//            history[pItem->level] = mi;
 
146
//            merged.Add(mi);
 
147
//        }
 
148
//    }
 
149
//}
 
150
 
 
151
//=======================================================================================
 
152
// DocumentLoader implementation
 
153
//=======================================================================================
 
154
DocumentLoader::DocumentLoader(ContentWindow* parent, ApplicationScope& appScope,
 
155
                               LomseDoorway& lomse)
 
156
    : m_pContentWindow(parent)
 
157
    , m_appScope(appScope)
 
158
    , m_lomse(lomse)
 
159
{
 
160
}
 
161
 
 
162
//---------------------------------------------------------------------------------------
 
163
CanvasInterface* DocumentLoader::create_canvas(const string& filename, int viewType)
 
164
{
 
165
    //use filename (without path) as page title
 
166
    wxFileName document( to_wx_string(filename) );
 
167
    bool fIsBook = (document.GetExt().Upper() == _T("LMB"));
 
168
 
 
169
    if (fIsBook)
 
170
    {
 
171
        DocumentFrame* pCanvas = LENMUS_NEW DocumentFrame(m_pContentWindow, m_appScope, m_lomse);
 
172
        m_pContentWindow->add_canvas(pCanvas, document.GetName());
 
173
        pCanvas->display_document(filename, viewType);
 
174
        return pCanvas;
 
175
    }
 
176
    else
 
177
    {
 
178
        DocumentCanvas* pCanvas = LENMUS_NEW DocumentCanvas(m_pContentWindow, m_appScope, m_lomse);
 
179
        m_pContentWindow->add_canvas(pCanvas, document.GetName());
 
180
        pCanvas->display_document(filename, viewType);
 
181
        return pCanvas;
 
182
    }
 
183
}
 
184
 
 
185
 
 
186
//=======================================================================================
 
187
// DocumentFrame implementation
 
188
//=======================================================================================
 
189
 
 
190
BEGIN_EVENT_TABLE(DocumentFrame, wxSplitterWindow)
 
191
    EVT_SPLITTER_SASH_POS_CHANGED(wxID_ANY, DocumentFrame::on_splitter_moved)
 
192
    LM_EVT_PAGE_REQUEST(DocumentFrame::on_page_change_requested)
 
193
END_EVENT_TABLE()
 
194
 
 
195
DocumentFrame::DocumentFrame(ContentWindow* parent, ApplicationScope& appScope,
 
196
                             LomseDoorway& lomse)
 
197
    : wxSplitterWindow(parent, wxNewId(), wxDefaultPosition,
 
198
                       wxDefaultSize, 0, _T("Canvas"))
 
199
    , CanvasInterface(parent)
 
200
    , m_appScope(appScope)
 
201
    , m_lomse(lomse)
 
202
    , m_left(NULL)
 
203
    , m_right(NULL)
 
204
    , m_pBookReader(NULL)
 
205
{
 
206
}
 
207
 
 
208
//---------------------------------------------------------------------------------------
 
209
DocumentFrame::~DocumentFrame()
 
210
{
 
211
    delete m_pBookReader;
 
212
    delete m_left;
 
213
    delete m_right;
 
214
}
 
215
 
 
216
////---------------------------------------------------------------------------------------
 
217
//void DocumentFrame::on_show_toc(wxCommandEvent& WXUNUSED(event) )
 
218
//{
 
219
//    if (IsSplit())
 
220
//        Unsplit();
 
221
//    m_left->Show(true);
 
222
//    m_right->Show(true);
 
223
//    SplitVertically(m_left, m_right, 100);
 
224
//}
 
225
//
 
226
////---------------------------------------------------------------------------------------
 
227
//void DocumentFrame::on_hide_toc(wxCommandEvent& WXUNUSED(event) )
 
228
//{
 
229
//    if (IsSplit())
 
230
//        Unsplit();
 
231
//}
 
232
 
 
233
//---------------------------------------------------------------------------------------
 
234
void DocumentFrame::on_page_change_requested(PageRequestEvent& event)
 
235
{
 
236
    wxString url = to_wx_string(event.get_url());
 
237
    change_to_page(url);
 
238
}
 
239
 
 
240
//---------------------------------------------------------------------------------------
 
241
void DocumentFrame::create_toc_pane()
 
242
{
 
243
    m_left = LENMUS_NEW BookContentBox(this, this, m_appScope, wxID_ANY, wxDefaultPosition,
 
244
                                wxDefaultSize, 0, _T("The TOC"));
 
245
    m_left->CreateContents(m_pBookReader);
 
246
}
 
247
 
 
248
//---------------------------------------------------------------------------------------
 
249
void DocumentFrame::create_content_pane(const string& filename)
 
250
{
 
251
    m_right = LENMUS_NEW DocumentWindow(this, m_appScope, m_lomse);
 
252
    load_page(filename);
 
253
}
 
254
 
 
255
//---------------------------------------------------------------------------------------
 
256
void DocumentFrame::create_content_pane(int iTocItem)
 
257
{
 
258
    m_right = LENMUS_NEW DocumentWindow(this, m_appScope, m_lomse);
 
259
    load_page(iTocItem);
 
260
}
 
261
 
 
262
//---------------------------------------------------------------------------------------
 
263
ImoScore* DocumentFrame::get_active_score()
 
264
{
 
265
    if (m_right)
 
266
        return m_right->get_active_score();
 
267
    else
 
268
        return NULL;
 
269
}
 
270
 
 
271
//---------------------------------------------------------------------------------------
 
272
Interactor* DocumentFrame::get_interactor()
 
273
{
 
274
    if (m_right)
 
275
        return m_right->get_interactor();
 
276
    else
 
277
        return NULL;
 
278
}
 
279
 
 
280
//---------------------------------------------------------------------------------------
 
281
void DocumentFrame::display_document(const string& filename, int viewType)
 
282
{
 
283
    wxFileName document( to_wx_string(filename) );
 
284
    bool fIsBook = (document.GetExt().Upper() == _T("LMB"));
 
285
 
 
286
    m_bookPath = document.GetFullPath();
 
287
 
 
288
   if (fIsBook)
 
289
    {
 
290
        //read book (.lmb)
 
291
        m_pBookReader = LENMUS_NEW BookReader();
 
292
        if (!m_pBookReader->AddBook(document))
 
293
        {
 
294
            //TODO better error handling
 
295
            wxMessageBox(wxString::Format(_("Failed adding book %s"),
 
296
                document.GetFullPath().c_str() ));
 
297
            return;
 
298
        }
 
299
        create_toc_pane();
 
300
        create_content_pane(0);
 
301
 
 
302
        m_left->Show(true);
 
303
 
 
304
        //split at 25%/75%
 
305
        wxSize size = this->GetClientSize();
 
306
        int leftPixels = size.GetWidth() / 4;
 
307
        SplitVertically(m_left, m_right, leftPixels);
 
308
    }
 
309
    else
 
310
    {
 
311
        //read page (.lms)
 
312
        create_content_pane(filename);
 
313
        Initialize(m_right);
 
314
    }
 
315
}
 
316
 
 
317
//---------------------------------------------------------------------------------------
 
318
void DocumentFrame::on_hyperlink_event(SpEventInfo pEvent)
 
319
{
 
320
    SpEventMouse pEv = boost::static_pointer_cast<EventMouse>(pEvent);
 
321
    ImoLink* pLink = static_cast<ImoLink*>( pEv->get_imo_object() );
 
322
    wxString url = to_wx_string( pLink->get_url() );
 
323
 
 
324
    wxString pagename;
 
325
    if (url.StartsWith(_T("#LenMusPage/"), &pagename))
 
326
        change_to_page(pagename);
 
327
    else
 
328
        ::wxLaunchDefaultBrowser(url);
 
329
}
 
330
 
 
331
//---------------------------------------------------------------------------------------
 
332
void DocumentFrame::change_to_page(wxString& pagename)
 
333
{
 
334
    wxString fullpath = m_pBookReader->FindPageByName(pagename);
 
335
    if (fullpath != _T(""))
 
336
    {
 
337
        load_page( to_std_string(fullpath) );
 
338
        m_right->Refresh(false /* don't erase background */);
 
339
    }
 
340
    else
 
341
    {
 
342
        wxString msg = wxString::Format(_T("Invalid link='%s'\nPage='%s' not found."),
 
343
                                        pagename.c_str(), fullpath.c_str() );
 
344
        wxMessageBox(msg);
 
345
    }
 
346
}
 
347
 
 
348
//---------------------------------------------------------------------------------------
 
349
void DocumentFrame::load_page(int iTocItem)
 
350
{
 
351
    wxLogMessage(_T("DocumentFrame::load_page (by toc item, item %d) %s"), iTocItem, GetLabel().c_str());
 
352
    wxString fullpath = get_path_for_toc_item(iTocItem);
 
353
    wxLogMessage(_T("[DocumentFrame::load_page] page: <%s>"), fullpath.c_str());
 
354
    load_page( to_std_string(fullpath) );
 
355
}
 
356
 
 
357
//---------------------------------------------------------------------------------------
 
358
void DocumentFrame::load_page(const string& filename)
 
359
{
 
360
    wxLogMessage(_T("DocumentFrame::load_page (by filename) %s. Filename='%s'"), GetLabel().c_str(), to_wx_string(filename).c_str());
 
361
    //Code commented out and replaced by following code because it causes a rare problem
 
362
    //when returning back from exercise 1 in L1_MusicReading_accidentals.lms
 
363
    //
 
364
    //int viewType = ViewFactory::k_view_vertical_book;
 
365
    // m_right->display_document(filename, viewType);
 
366
 
 
367
    if (!filename.empty())
 
368
    {
 
369
        LdpZipReader reader(filename);
 
370
        int viewType = ViewFactory::k_view_vertical_book;
 
371
        string title = "test";
 
372
        m_right->display_document(reader, viewType, title);
 
373
    }
 
374
}
 
375
 
 
376
//---------------------------------------------------------------------------------------
 
377
wxString DocumentFrame::get_path_for_toc_item(int iItem)
 
378
{
 
379
    const BookIndexArray& contents = m_pBookReader->GetContentsArray();
 
380
    if (!contents[iItem]->page.empty())
 
381
        return contents[iItem]->GetFullPath();
 
382
    else
 
383
        return wxEmptyString;
 
384
}
 
385
 
 
386
//---------------------------------------------------------------------------------------
 
387
void DocumentFrame::on_splitter_moved(wxSplitterEvent& WXUNUSED(event))
 
388
{
 
389
    wxLogMessage(_T("DocumentFrame::on_splitter_moved %s"), GetLabel().c_str());
 
390
    if (m_right)
 
391
        m_right->zoom_fit_width();
 
392
}
 
393
 
 
394
 
 
395
}   //namespace lenmus