Changeset 310


Ignore:
Timestamp:
10/05/07 16:02:57 (13 years ago)
Author:
Eoin
Message:
 
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • Halite.pnproj

    r305 r310  
    1 <Project name="Halite"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="res" path="res\"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="res24" path="res24\"><File path="ad.ico"></File><File path="ae.ico"></File><File path="af.ico"></File><File path="ag.ico"></File><File path="ai.ico"></File><File path="al.ico"></File><File path="am.ico"></File><File path="an.ico"></File><File path="ao.ico"></File><File path="ar.ico"></File><File path="as.ico"></File><File path="at.ico"></File><File path="au.ico"></File><File path="aw.ico"></File><File path="ax.ico"></File><File path="az.ico"></File><File path="ba.ico"></File><File path="bb.ico"></File><File path="bd.ico"></File><File path="be.ico"></File><File path="bf.ico"></File><File path="bg.ico"></File><File path="bh.ico"></File><File path="bi.ico"></File><File path="bj.ico"></File><File path="bm.ico"></File><File path="bn.ico"></File><File path="bo.ico"></File><File path="br.ico"></File><File path="bs.ico"></File><File path="bt.ico"></File><File path="bw.ico"></File><File path="by.ico"></File><File path="bz.ico"></File><File path="ca.ico"></File><File path="cc.ico"></File><File path="cd.ico"></File><File path="cf.ico"></File><File path="cg.ico"></File><File path="ch.ico"></File><File path="ci.ico"></File><File path="ck.ico"></File><File path="cl.ico"></File><File path="cm.ico"></File><File path="cn.ico"></File><File path="co.ico"></File><File path="cr.ico"></File><File path="cu.ico"></File><File path="cv.ico"></File><File path="cx.ico"></File><File path="cy.ico"></File><File path="cz.ico"></File><File path="de.ico"></File><File path="dj.ico"></File><File path="dk.ico"></File><File path="dm.ico"></File><File path="do.ico"></File><File path="dz.ico"></File><File path="ec.ico"></File><File path="ee.ico"></File><File path="eg.ico"></File><File path="eh.ico"></File><File path="er.ico"></File><File path="es.ico"></File><File path="et.ico"></File><File path="fi.ico"></File><File path="fj.ico"></File><File path="fk.ico"></File><File path="fm.ico"></File><File path="fo.ico"></File><File path="fr.ico"></File><File path="ga.ico"></File><File path="gb.ico"></File><File path="gd.ico"></File><File path="ge.ico"></File><File path="gg.ico"></File><File path="gh.ico"></File><File path="gi.ico"></File><File path="gk.ico"></File><File path="gl.ico"></File><File path="gm.ico"></File><File path="gn.ico"></File><File path="gp.ico"></File><File path="gq.ico"></File><File path="gr.ico"></File><File path="gs.ico"></File><File path="gt.ico"></File><File path="gu.ico"></File><File path="gw.ico"></File><File path="gy.ico"></File><File path="hk.ico"></File><File path="hn.ico"></File><File path="hr.ico"></File><File path="ht.ico"></File><File path="hu.ico"></File><File path="Icons.h"></File><File path="Icons.rc"></File><File path="id.ico"></File><File path="ie.ico"></File><File path="il.ico"></File><File path="im.ico"></File><File path="in.ico"></File><File path="io.ico"></File><File path="iq.ico"></File><File path="ir.ico"></File><File path="is.ico"></File><File path="it.ico"></File><File path="je.ico"></File><File path="jm.ico"></File><File path="jo.ico"></File><File path="jp.ico"></File><File path="ke.ico"></File><File path="kg.ico"></File><File path="kh.ico"></File><File path="ki.ico"></File><File path="km.ico"></File><File path="kn.ico"></File><File path="kp.ico"></File><File path="kr.ico"></File><File path="kw.ico"></File><File path="ky.ico"></File><File path="kz.ico"></File><File path="la.ico"></File><File path="lb.ico"></File><File path="lc.ico"></File><File path="li.ico"></File><File path="lk.ico"></File><File path="lr.ico"></File><File path="ls.ico"></File><File path="lt.ico"></File><File path="lu.ico"></File><File path="lv.ico"></File><File path="ly.ico"></File><File path="ma.ico"></File><File path="mc.ico"></File><File path="md.ico"></File><File path="me.ico"></File><File path="mg.ico"></File><File path="mh.ico"></File><File path="mk.ico"></File><File path="ml.ico"></File><File path="mm.ico"></File><File path="mn.ico"></File><File path="mo.ico"></File><File path="mp.ico"></File><File path="mq.ico"></File><File path="mr.ico"></File><File path="ms.ico"></File><File path="mt.ico"></File><File path="mu.ico"></File><File path="mv.ico"></File><File path="mw.ico"></File><File path="mx.ico"></File><File path="my.ico"></File><File path="mz.ico"></File><File path="na.ico"></File><File path="nc.ico"></File><File path="ne.ico"></File><File path="nf.ico"></File><File path="ng.ico"></File><File path="ni.ico"></File><File path="nl.ico"></File><File path="no.ico"></File><File path="not.ico"></File><File path="np.ico"></File><File path="nr.ico"></File><File path="nu.ico"></File><File path="nz.ico"></File><File path="om.ico"></File><File path="pa.ico"></File><File path="pe.ico"></File><File path="pf.ico"></File><File path="pg.ico"></File><File path="ph.ico"></File><File path="pk.ico"></File><File path="pl.ico"></File><File path="pm.ico"></File><File path="pn.ico"></File><File path="pr.ico"></File><File path="ps.ico"></File><File path="pt.ico"></File><File path="pw.ico"></File><File path="py.ico"></File><File path="qa.ico"></File><File path="ro.ico"></File><File path="rs.ico"></File><File path="ru.ico"></File><File path="rw.ico"></File><File path="sa.ico"></File><File path="sb.ico"></File><File path="sc.ico"></File><File path="sd.ico"></File><File path="se.ico"></File><File path="sg.ico"></File><File path="sh.ico"></File><File path="si.ico"></File><File path="sk.ico"></File><File path="sl.ico"></File><File path="sm.ico"></File><File path="sn.ico"></File><File path="so.ico"></File><File path="sr.ico"></File><File path="st.ico"></File><File path="sv.ico"></File><File path="sy.ico"></File><File path="sz.ico"></File><File path="tc.ico"></File><File path="td.ico"></File><File path="Template.rc"></File><File path="tf.ico"></File><File path="tg.ico"></File><File path="th.ico"></File><File path="tj.ico"></File><File path="tk.ico"></File><File path="tl.ico"></File><File path="tm.ico"></File><File path="tn.ico"></File><File path="to.ico"></File><File path="tr.ico"></File><File path="tt.ico"></File><File path="tv.ico"></File><File path="tw.ico"></File><File path="tz.ico"></File><File path="ua.ico"></File><File path="ug.ico"></File><File path="us.ico"></File><File path="uy.ico"></File><File path="uz.ico"></File><File path="va.ico"></File><File path="vc.ico"></File><File path="ve.ico"></File><File path="vg.ico"></File><File path="vi.ico"></File><File path="vn.ico"></File><File path="vu.ico"></File><File path="wf.ico"></File><File path="ws.ico"></File><File path="ye.ico"></File><File path="yu.ico"></File><File path="za.ico"></File><File path="zm.ico"></File><File path="zw.ico"></File></MagicFolder><File path="About.rtf"></File><File path="afxres.h"></File><File path="English.rtf"></File><File path="Halite.aps"></File><File path="Halite.ico"></File><File path="Halite.rc"></File><File path="Icons.rc"></File><File path="Manifest.xml"></File><File path="resource.h"></File><File path="toolbar.bmp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="src" path="src\"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="advtabs" path="advtabs\"><File path="Debug.cpp"></File><File path="Debug.hpp"></File><File path="Files.cpp"></File><File path="Files.hpp"></File><File path="Peers.cpp"></File><File path="Peers.hpp"></File><File path="ThemeTestDialog.hpp"></File><File path="Torrent.cpp"></File><File path="Torrent.hpp"></File><File path="Tracker.cpp"></File><File path="Tracker.hpp"></File><File path="TrackerAddDialog.hpp"></File><File path="TrackerListView.cpp"></File><File path="TrackerListView.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="global" path="global\"><File path="InheritEnum.hpp"></File><File path="ini.cpp"></File><File path="ini.hpp"></File><File path="ini_adapter.cpp"></File><File path="ini_adapter.hpp"></File><File path="logger.cpp"></File><File path="logger.hpp"></File><File path="string_conv.cpp"></File><File path="string_conv.hpp"></File><File path="tinyxml.cpp"></File><File path="tinyxml.hpp"></File><File path="tinyxmlerror.cpp"></File><File path="tinyxmlparser.cpp"></File><File path="unicode.hpp"></File><File path="utf8.hpp"></File><File path="wtl_app.cpp"></File><File path="wtl_app.hpp"></File></MagicFolder><File path="AddTorrentDialog.hpp"></File><File path="AdvHaliteDialog.cpp"></File><File path="AdvHaliteDialog.hpp"></File><File path="ConfigOptions.cpp"></File><File path="ConfigOptions.hpp"></File><File path="CSSFileDialog.hpp"></File><File path="DdxEx.hpp"></File><File path="DebugDialog.hpp"></File><File path="DropFileTarget.h"></File><File path="halConfig.cpp"></File><File path="halConfig.hpp"></File><File path="halEvent.cpp"></File><File path="halEvent.hpp"></File><File path="Halite.cpp"></File><File path="Halite.hpp"></File><File path="HaliteDialog.cpp"></File><File path="HaliteDialog.hpp"></File><File path="HaliteDialogBase.hpp"></File><File path="HaliteEditCtrl.hpp"></File><File path="HaliteIni.hpp"></File><File path="HaliteListManager.hpp"></File><File path="HaliteListView.cpp"></File><File path="HaliteListView.hpp"></File><File path="HaliteListViewCtrl.hpp"></File><File path="HaliteSortListViewCtrl.hpp"></File><File path="HaliteTabCtrl.hpp"></File><File path="HaliteTabPage.hpp"></File><File path="HaliteUpdateLock.hpp"></File><File path="HaliteWindow.cpp"></File><File path="HaliteWindow.hpp"></File><File path="halTorrent.cpp"></File><File path="halTorrent.hpp"></File><File path="halTorrentInternal.hpp"></File><File path="halXmlRpc.cpp"></File><File path="halXmlRpc.hpp"></File><File path="NTray.cpp"></File><File path="NTray.hpp"></File><File path="ProgressDialog.hpp"></File><File path="SimpleHtml.h"></File><File path="SplashDialog.hpp"></File><File path="SSFileDialog.hpp"></File><File path="stdAfx.cpp"></File><File path="stdAfx.hpp"></File><File path="UxthemeWrapper.cpp"></File><File path="UxthemeWrapper.hpp"></File><File path="WinAPIMutex.hpp"></File><File path="WinAPIWaitableTimer.hpp"></File></MagicFolder><File path="Jamfile.v2"></File></Project> 
     1<Project name="Halite"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="res" path="res\"><File path="About.rtf"></File><File path="afxres.h"></File><File path="English.rtf"></File><File path="Halite.aps"></File><File path="Halite.ico"></File><File path="Halite.rc"></File><File path="Manifest.xml"></File><File path="resource.h"></File><File path="toolbar.bmp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="src" path="src\"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="advtabs" path="advtabs\"><File path="Debug.cpp"></File><File path="Debug.hpp"></File><File path="Files.cpp"></File><File path="Files.hpp"></File><File path="Peers.cpp"></File><File path="Peers.hpp"></File><File path="ThemeTestDialog.hpp"></File><File path="Torrent.cpp"></File><File path="Torrent.hpp"></File><File path="Tracker.cpp"></File><File path="Tracker.hpp"></File><File path="TrackerAddDialog.hpp"></File><File path="TrackerListView.cpp"></File><File path="TrackerListView.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="global" path="global\"><File path="InheritEnum.hpp"></File><File path="ini.cpp"></File><File path="ini.hpp"></File><File path="ini_adapter.cpp"></File><File path="ini_adapter.hpp"></File><File path="logger.cpp"></File><File path="logger.hpp"></File><File path="string_conv.cpp"></File><File path="string_conv.hpp"></File><File path="tinyxml.cpp"></File><File path="tinyxml.hpp"></File><File path="tinyxmlerror.cpp"></File><File path="tinyxmlparser.cpp"></File><File path="unicode.hpp"></File><File path="utf8.hpp"></File><File path="wtl_app.cpp"></File><File path="wtl_app.hpp"></File></MagicFolder><File path="AddTorrentDialog.hpp"></File><File path="AdvHaliteDialog.cpp"></File><File path="AdvHaliteDialog.hpp"></File><File path="ConfigOptions.cpp"></File><File path="ConfigOptions.hpp"></File><File path="CSSFileDialog.hpp"></File><File path="DdxEx.hpp"></File><File path="DebugDialog.hpp"></File><File path="DropFileTarget.h"></File><File path="halConfig.cpp"></File><File path="halConfig.hpp"></File><File path="halEvent.cpp"></File><File path="halEvent.hpp"></File><File path="Halite.cpp"></File><File path="Halite.hpp"></File><File path="HaliteDialog.cpp"></File><File path="HaliteDialog.hpp"></File><File path="HaliteDialogBase.hpp"></File><File path="HaliteEditCtrl.hpp"></File><File path="HaliteIni.hpp"></File><File path="HaliteListManager.hpp"></File><File path="HaliteListView.cpp"></File><File path="HaliteListView.hpp"></File><File path="HaliteListViewCtrl.hpp"></File><File path="HaliteSortListViewCtrl.hpp"></File><File path="HaliteTabCtrl.hpp"></File><File path="HaliteTabPage.hpp"></File><File path="HaliteUpdateLock.hpp"></File><File path="HaliteWindow.cpp"></File><File path="HaliteWindow.hpp"></File><File path="halTorrent.cpp"></File><File path="halTorrent.hpp"></File><File path="halTorrentInternal.hpp"></File><File path="halXmlRpc.cpp"></File><File path="halXmlRpc.hpp"></File><File path="NTray.cpp"></File><File path="NTray.hpp"></File><File path="ProgressDialog.hpp"></File><File path="SimpleHtml.h"></File><File path="SplashDialog.hpp"></File><File path="SSFileDialog.hpp"></File><File path="stdAfx.cpp"></File><File path="stdAfx.hpp"></File><File path="UxthemeWrapper.cpp"></File><File path="UxthemeWrapper.hpp"></File><File path="WinAPIMutex.hpp"></File><File path="WinAPIWaitableTimer.hpp"></File></MagicFolder><File path="Jamfile.v2"></File></Project> 
  • Halite.pnps

    r305 r310  
    1 <pd><ViewState><e p="Halite\src\advtabs" x="true"></e><e p="Halite" x="true"></e><e p="Halite\res" x="true"></e><e p="Halite\res\res24" x="false"></e><e p="Halite\src" x="true"></e><e p="Halite\src\global" x="true"></e></ViewState></pd> 
     1<pd><ViewState><e p="Halite\src\advtabs" x="true"></e><e p="Halite" x="true"></e><e p="Halite\res" x="true"></e><e p="Halite\src" x="true"></e><e p="Halite\src\global" x="true"></e></ViewState></pd> 
  • res/Halite.rc

    r294 r310  
    296296END 
    297297 
    298 IDD_ADD_TORRENT DIALOGEX 0, 0, 225, 80 
     298IDD_ADD_TORRENT DIALOGEX 0, 0, 225, 82 
    299299STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION 
    300300EXSTYLE WS_EX_STATICEDGE 
     
    302302FONT 8, "MS Shell Dlg", 400, 0, 0x1 
    303303BEGIN 
    304     PUSHBUTTON      "Ok",IDOK,85,65,60,12 
    305     PUSHBUTTON      "Cancel",IDCANCEL,155,65,60,12 
     304    PUSHBUTTON      "Ok",IDOK,85,65,60,14 
     305    PUSHBUTTON      "Cancel",IDCANCEL,155,65,60,14 
    306306 
    307307    EDITTEXT        IDC_BC_SAVEFOLDER,5,5,195,12,ES_AUTOHSCROLL 
  • src/advtabs/Files.cpp

    r308 r310  
    234234void AdvFilesDialog::uiUpdate(const hal::TorrentDetails& tD) 
    235235{ 
    236         if (fileDetails_.empty()) return; 
     236        if (fileLinks_.empty()) return; 
    237237         
    238238        TryUpdateLock<FileListView::listClass> lock(list_); 
     
    240240        {        
    241241                const hal::TorrentDetail_ptr pT = tD.focusedTorrent(); 
    242                 if (pT->fileDetails().size() != fileDetails_.size()) return; 
     242                if (pT->fileDetails().size() != fileLinks_.size()) return; 
    243243                 
    244244                // Wipe details not present 
     
    248248                        list_.GetItemText(i, 0, fullPath.c_array(), MAX_PATH); 
    249249                         
    250                         hal::FileDetail file(wstring(fullPath.c_array())); 
    251                         hal::FileDetails::iterator iter =  
    252                                 std::lower_bound(range_.first, range_.second, file, &hal::FileDetailNamesLess); 
    253                          
    254                         if (iter == range_.second || !(hal::FileDetailNamesEqual((*iter), file))) 
     250                        FileLink file(wstring(fullPath.c_array())); 
     251                        std::vector<FileLink>::iterator iter =  
     252                                std::lower_bound(range_.first, range_.second, file, &FileLinkNamesLess); 
     253                         
     254                        if (iter == range_.second || !(FileLinkNamesEqual((*iter), file))) 
    255255                        { 
    256256                                if (iter == range_.second) 
     
    269269                 
    270270                // Add additional details 
    271                 for (hal::FileDetails::iterator i=range_.first, e=range_.second; 
     271                for (std::vector<FileLink>::iterator i=range_.first, e=range_.second; 
    272272                        i != e; ++i) 
    273273                { 
    274                         *i = pT->fileDetails()[(*i).order()]; 
     274                         
     275                hal::event().post(shared_ptr<hal::EventDetail>( 
     276                        new hal::EventMsg(wformat(L"-> %1% - %2%.") % (*i).filename % (*i).order())));   
     277                         
     278                        hal::FileDetail fileD = pT->fileDetails()[(*i).order()]; 
    275279                         
    276280                        LV_FINDINFO findInfo;  
     
    285289                         
    286290                        list_.SetItemText(itemPos, 1, (*i).branch.string().c_str());                     
    287                         list_.SetItemText(itemPos, 2, list_.getColumnAdapter(2)->print(*i).c_str()); 
    288                         list_.SetItemText(itemPos, 3, list_.getColumnAdapter(3)->print(*i).c_str()); 
    289                         list_.SetItemText(itemPos, 4, list_.getColumnAdapter(4)->print(*i).c_str());                     
     291                        list_.SetItemText(itemPos, 2, list_.getColumnAdapter(2)->print(fileD).c_str()); 
     292                        list_.SetItemText(itemPos, 3, list_.getColumnAdapter(3)->print(fileD).c_str()); 
     293                        list_.SetItemText(itemPos, 4, list_.getColumnAdapter(4)->print(fileD).c_str());                  
    290294                } 
    291295 
     
    296300void AdvFilesDialog::focusChanged(const hal::TorrentDetail_ptr pT) 
    297301{ 
    298         fileDetails_.clear(); 
     302        fileLinks_.clear(); 
    299303        if (pT) 
    300304        { 
    301305                std::copy(pT->fileDetails().begin(), pT->fileDetails().end(),  
    302                         std::back_inserter(fileDetails_)); 
     306                        std::back_inserter(fileLinks_)); 
    303307        } 
    304308         
    305309        list_.setFocused(pT); 
    306310         
    307         std::sort(fileDetails_.begin(), fileDetails_.end()); 
     311        std::sort(fileLinks_.begin(), fileLinks_.end()); 
    308312         
    309313        {       UpdateLock<FileTreeView> lock(tree_); 
     
    311315                treeManager_.InvalidateAll(); 
    312316                 
    313                 foreach (hal::FileDetail file, fileDetails_) 
     317                foreach (FileLink file, fileLinks_) 
    314318                { 
    315319                        treeManager_.EnsureValid(file.branch); 
     
    321325        tree_.determineFocused(); 
    322326         
    323         range_ = std::equal_range(fileDetails_.begin(), fileDetails_.end(), 
    324                 hal::FileDetail(tree_.focused()/L"leaf")); 
    325          
    326         std::sort(range_.first, range_.second, &hal::FileDetailNamesLess); 
     327        range_ = std::equal_range(fileLinks_.begin(), fileLinks_.end(), 
     328                FileLink(tree_.focused())); 
     329         
     330        std::sort(range_.first, range_.second, &FileLinkNamesLess); 
    327331         
    328332        splitterPos = splitter_.GetSplitterPos(); 
  • src/advtabs/Files.hpp

    r306 r310  
    2020 
    2121#include "../HaliteUpdateLock.hpp" 
     22 
     23struct FileLink 
     24{ 
     25        FileLink(const boost::filesystem::wpath& b, size_t o=0) : 
     26                branch(b), 
     27                filename(L""), 
     28                order_(o) 
     29        {} 
     30 
     31        FileLink(const wstring& f, size_t o=0) : 
     32                branch(L""), 
     33                filename(f), 
     34                order_(o) 
     35        {} 
     36 
     37        FileLink(const hal::FileDetail& f) : 
     38                branch(f.branch), 
     39                filename(f.filename), 
     40                order_(f.order()) 
     41        { 
     42                hal::event().post(shared_ptr<hal::EventDetail>( 
     43                        new hal::EventMsg(wformat(L"Con -> %1% - %2%.") % filename % order())));        } 
     44         
     45        bool operator==(const FileLink& f) const 
     46        { 
     47                return (branch == f.branch); 
     48        } 
     49         
     50        bool operator<(const FileLink& f) const 
     51        { 
     52                return (branch < f.branch); 
     53        } 
     54         
     55        enum FileType 
     56        { 
     57                folder, 
     58                file 
     59        }; 
     60         
     61        size_t order() { return order_; } 
     62         
     63        boost::filesystem::wpath branch; 
     64        wstring filename; 
     65        unsigned type; 
     66         
     67private: 
     68        size_t order_; 
     69}; 
     70 
     71 
     72inline bool FileLinkNamesEqual(const FileLink& l, const FileLink& r) 
     73{ 
     74        return l.filename == r.filename; 
     75} 
     76 
     77inline bool FileLinkNamesLess(const FileLink& l, const FileLink& r) 
     78{ 
     79        return l.filename < r.filename; 
     80} 
    2281 
    2382class FileListView : 
     
    390449        TreeViewManager<FileTreeView> treeManager_; 
    391450         
    392         wstring current_torrent_name_;   
     451        wstring current_torrent_name_; 
     452        std::vector<FileLink> fileLinks_; 
     453         
    393454        hal::FileDetails fileDetails_; 
    394         std::pair<hal::FileDetails::iterator, hal::FileDetails::iterator> range_; 
    395 }; 
     455        std::pair<std::vector<FileLink>::iterator, std::vector<FileLink>::iterator> range_; 
     456}; 
  • src/halTorrent.hpp

    r308 r310  
    7373struct FileDetail 
    7474{ 
    75         FileDetail(boost::filesystem::wpath p, unsigned t=FileDetail::file, size_t s=0, float pg=0, int pr=1, size_t o=0) : 
     75        FileDetail(boost::filesystem::wpath p, size_t s=0, float pg=0, int pr=1, size_t o=0, unsigned t=FileDetail::file) : 
    7676                branch(p.branch_path()), 
    7777                filename(p.leaf()), 
     
    9999        }; 
    100100         
    101         size_t order() { return order_; } 
     101        size_t order() const { return order_; } 
    102102         
    103103        boost::filesystem::wpath branch; 
  • src/stdAfx.hpp

    r285 r310  
    3939#include <atlscrl.h> 
    4040 
     41#include "AtlAutosizeDlg.h" 
    4142//#include <stlsoft/util/nulldef.h> 
    4243 
Note: See TracChangeset for help on using the changeset viewer.