summaryrefslogtreecommitdiff
path: root/shared/util.h
blob: 2c9af17604d2996302dfcefeb7e59f3e30eb0c4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// **************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: http://www.gnu.org/licenses/gpl.html       *
// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de)                    *
// **************************************************************************
//
#ifndef UTIL_H_INCLUDED
#define UTIL_H_INCLUDED

#include <wx/string.h>
#include <wx/textctrl.h>
#include <wx/filepicker.h>
#include <wx/combobox.h>
#include <wx/scrolwin.h>
#include <wx/choice.h>
#include "zstring.h"
#include "string_tools.h"
#include "int64.h"

namespace zen
{
wxString extractJobName(const wxString& configFilename);

wxString formatFilesizeToShortString(zen::UInt64 filesize);
wxString formatPercentage(zen::Int64 dividend, zen::Int64 divisor);

template <class NumberType>
wxString toStringSep(NumberType number); //convert number to wxString including thousands separator

void scrollToBottom(wxScrolledWindow* scrWindow);

wxString utcTimeToLocalString(zen::Int64 utcTime); //throw std::runtime_error


//handle mapping of enum values to wxChoice controls
template <class Enum>
struct EnumDescrList
{
    EnumDescrList& add(Enum value, const wxString& text, const wxString& tooltip = wxEmptyString)
    {
        descrList.push_back(std::make_pair(value, std::make_pair(text, tooltip)));
        return *this;
    }
    typedef std::vector<std::pair<Enum, std::pair<wxString, wxString> > > DescrList;
    DescrList descrList;
};
template <class Enum> void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value);
template <class Enum> Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl);
template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl);
}


























//--------------- inline impelementation -------------------------------------------

//helper function! not to be used directly
namespace ffs_Impl
{
wxString includeNumberSeparator(const wxString& number);
}


namespace zen
{
template <class NumberType>
inline
wxString toStringSep(NumberType number)
{
    return ffs_Impl::includeNumberSeparator(zen::toString<wxString>(number));
}

template <class Enum>
void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value)
{
    ctrl.Clear();

    int selectedPos = 0;
    for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i)
    {
        ctrl.Append(i->second.first);
        if (i->first == value)
        {
            selectedPos = i - mapping.descrList.begin();

            if (!i->second.second.empty())
                ctrl.SetToolTip(i->second.second);
        }
    }

    ctrl.SetSelection(selectedPos);
}

template <class Enum>
Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl)
{
    const int selectedPos = ctrl.GetSelection();

    if (0 <= selectedPos && selectedPos < static_cast<int>(mapping.descrList.size()))
        return mapping.descrList[selectedPos].first;
    else
    {
        assert(false);
        return Enum(0);
    }
}

template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl)
{
    const Enum value = getEnumVal(mapping, ctrl);

    for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i)
        if (i->first == value)
            ctrl.SetToolTip(i->second.second);
}

}


#endif // UTIL_H_INCLUDED
bgstack15