OSDN Git Service

Show Ignore Sub Menu
[tortoisegit/TortoiseGitJp.git] / TortoiseProc / RevisionGraph / UpsideDownLayout.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2008 - TortoiseSVN\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 #include "StdAfx.h"\r
20 #include "UpsideDownLayout.h"\r
21 #include "StandardLayout.h"\r
22 \r
23 std::pair<int, int> CUpsideDownLayout::GetMinMaxY \r
24     (IStandardLayoutNodeAccess* nodeAccess)\r
25 {\r
26     int minY = INT_MAX;\r
27     int maxY = INT_MIN;\r
28 \r
29     for (size_t i = 0, count = nodeAccess->GetNodeCount(); i < count; ++i)\r
30     {\r
31         const CRect& rect = nodeAccess->GetNode(i)->rect;\r
32         minY = min (minY, rect.top);\r
33         maxY = max (maxY, rect.bottom);\r
34     }\r
35 \r
36     return std::make_pair (minY, maxY);\r
37 }\r
38 \r
39 void CUpsideDownLayout::MirrorY \r
40     ( IStandardLayoutNodeAccess* nodeAccess\r
41     , std::pair<int, int> minMaxY)\r
42 {\r
43     for (size_t i = 0, count = nodeAccess->GetNodeCount(); i < count; ++i)\r
44     {\r
45         CRect& rect = nodeAccess->GetNode(i)->rect;\r
46         int origTop = rect.top;\r
47 \r
48         rect.top = minMaxY.first + minMaxY.second - rect.bottom;\r
49         rect.bottom = minMaxY.first + minMaxY.second - origTop;\r
50     }\r
51 }\r
52 \r
53 // construction\r
54 \r
55 CUpsideDownLayout::CUpsideDownLayout \r
56     ( CRevisionGraphOptionList& list)\r
57     : CRevisionGraphOptionImpl<ILayoutOption, 1000, ID_VIEW_TOPDOWN> (list)\r
58 {\r
59 }\r
60 \r
61 // implement IRevisionGraphOption: Active if top-down is not selected.\r
62 \r
63 bool CUpsideDownLayout::IsActive() const\r
64 {\r
65     return !IsSelected();\r
66 }\r
67 \r
68 // cast @a layout pointer to the respective modification\r
69 // interface and write the data.\r
70 \r
71 void CUpsideDownLayout::ApplyTo (IRevisionGraphLayout* layout)\r
72 {\r
73     // we need access to actual data\r
74 \r
75     IStandardLayoutNodeAccess* nodeAccess \r
76         = dynamic_cast<IStandardLayoutNodeAccess*>(layout);\r
77     if (nodeAccess == NULL) \r
78         return;\r
79 \r
80     // get dimensions\r
81 \r
82     std::pair<int, int> minMaxY = GetMinMaxY (nodeAccess);\r
83 \r
84     // mirror Y coordinates\r
85 \r
86     MirrorY (nodeAccess, minMaxY);\r
87 }\r