OSDN Git Service

ProgressDlg: Changed 'OK' into 'Close' and 'Cancel' into 'Abort'
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / RevisionGraph / StandardNodeSizeAssignment.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2009 - 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 \r
20 #include "StdAfx.h"\r
21 #include "StandardNodeSizeAssignment.h"\r
22 #include "StandardLayout.h"\r
23 #include "VisibleGraphNode.h"\r
24 #include "GraphNodeState.h"\r
25 \r
26 // construction\r
27 \r
28 CStandardNodeSizeAssignment::CStandardNodeSizeAssignment \r
29     ( CRevisionGraphOptionList& list\r
30     , const CGraphNodeStates* nodeStates)\r
31     : CRevisionGraphOptionImpl<ILayoutOption, 100, 0> (list)\r
32     , nodeStates (nodeStates)\r
33 {\r
34 }\r
35 \r
36 // cast @a layout pointer to the respective modification\r
37 // interface and write the data.\r
38 \r
39 void CStandardNodeSizeAssignment::ApplyTo (IRevisionGraphLayout* layout)\r
40 {\r
41     // we need access to actual data\r
42 \r
43     IStandardLayoutNodeAccess* nodeAccess \r
44         = dynamic_cast<IStandardLayoutNodeAccess*>(layout);\r
45     if (nodeAccess == NULL) \r
46         return;\r
47 \r
48     // run\r
49 \r
50     for (index_t i = 0, count = nodeAccess->GetNodeCount(); i < count; ++i)\r
51     {\r
52         CStandardLayoutNodeInfo* node = nodeAccess->GetNode(i);\r
53 \r
54         // expand node to show the path, if necessary\r
55 \r
56         node->requiresPath =   (node->previousInBranch == NULL)\r
57                             || (   node->previousInBranch->node->GetPath() \r
58                                 != node->node->GetPath());\r
59 \r
60         int height = 28;\r
61         if (node->requiresPath)\r
62         {\r
63             size_t visibleElementCount = node->node->GetPath().GetDepth() \r
64                                        - node->skipStartPathElements\r
65                                        - node->skipTailPathElements;\r
66             height += 3 + visibleElementCount * 21;\r
67         }\r
68 \r
69         // shift (root) nodes down, if their source has been folded\r
70         // (otherwise, glyphs would be partly hidden)\r
71 \r
72         DWORD state = nodeStates->GetFlags (node->node);\r
73         int shift = (state & ( CGraphNodeStates::COLLAPSED_ABOVE \r
74                              | CGraphNodeStates::SPLIT_ABOVE)) == 0\r
75                   ? 0\r
76                   : 8;\r
77 \r
78         int extension = (state & ( CGraphNodeStates::COLLAPSED_BELOW \r
79                                  | CGraphNodeStates::SPLIT_BELOW)) == 0\r
80                       ? 0\r
81                       : 8;\r
82 \r
83         // set result\r
84 \r
85         node->requiredSize = CSize (200, height + extension + shift);\r
86         node->rect = CRect (0, shift, 200, height + shift);\r
87     }\r
88 }\r