From 38f7ea00c2086b464bc9ac3b5d5c49cb9ec93c47 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 00:43:32 +0200 Subject: [PATCH 01/15] update doxygen.css --- Tools/Documentation/doxygen.css | 1024 ++++++++++++++++++------------- 1 file changed, 604 insertions(+), 420 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index fa16d6d4b..bb28386ec 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -1,98 +1,61 @@ /* The standard CSS for doxygen */ -body, table, td, div, p, dl, dd, dt, em { - margin: 0; - padding: 0; -} - -body, table, div, p { - font: normal 13px "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; -} - -table { - border-collapse: collapse; -} - -pre, code { - font-family: Courier; -} - -p { - margin: 0 0 1em 0; -} - -dl { - margin-bottom: 1em; -} - -dd { - margin: .25em 1em; -} - -ul { - list-style-type: square; -} - -li { - margin: 0; - padding: .2em 0; -} - -em { - font-style: normal; - color: #7B509F; +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; } /* @group Heading Levels */ -h1, h2, h3, h4 { - font-family: "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; - margin: 1.5em 0 .5em; +h1 { + font-size: 150%; } -h1 { - font-size: 150%; +.title { + font-size: 150%; + font-weight: bold; + margin: 10px 2px; } h2 { - font-size: 120%; + font-size: 120%; } h3 { - font-size: 100%; + font-size: 100%; } dt { - font-weight: bold; + font-weight: bold; } div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { - margin-top: 2px; + margin-top: 2px; } p.endli { - margin-bottom: 0px; + margin-bottom: 0px; } p.enddd { - margin-bottom: 4px; + margin-bottom: 4px; } p.endtd { - margin-bottom: 2px; + margin-bottom: 2px; } /* @end */ caption { - font-weight: bold; + font-weight: bold; } span.legend { @@ -105,58 +68,47 @@ h3.version { text-align: center; } -div.qindex, div.navtab { - background-color: #ECEFF6; - border: 1px solid #A4B5D6; - text-align: center; - padding: .25em; +div.qindex, div.navtab{ + background-color: #ECEFF6; + border: 1px solid #A4B5D6; + text-align: center; } div.qindex, div.navpath { - line-height: 140%; -} - -div.contents div.qindex+table { - margin: 1.5em 15px; -} - -div.qindex+table td { - padding: .2em 0; -} - -div.qindex+table tr td table { - display: none; + width: 100%; + line-height: 140%; } div.navtab { - margin-right: 15px; + margin-right: 15px; } /* @group Link Styling */ a { - color: #2F4697; - font-weight: normal; - text-decoration: none; + color: #439DE0; + font-weight: normal; + text-decoration: none; } .contents a:visited { + color: #439DE0; } a:hover { - text-decoration: underline; - /* background-color: #D5E8FF; */ + text-decoration: none; + color: #62B9ED; } a.qindex { - font-weight: bold; + font-weight: bold; } a.qindexHL { - font-weight: bold; - background-color: #9DAFD3; - color: #ffffff; - border: 1px double #879DC9; + font-weight: bold; + background-color: #9DAFD3; + color: #ffffff; + border: 1px double #879DC9; } .contents a.qindexHL:visited { @@ -164,139 +116,107 @@ a.qindexHL { } a.el { - padding: 1px; + font-weight: bold; } a.elRef { } a.code { - color: #4765A1; + color: #4765A1; } a.codeRef { - color: #4765A1; + color: #4765A1; } /* @end */ dl.el { - margin-left: -1cm; + margin-left: -1cm; } .fragment { - font-family: Courier, monospace, fixed; - font-size: 105%; + font-family: monospace, fixed; + font-size: 105%; } pre.fragment { - margin-top: 1em; - border: 1px solid #C5CFE5; - /* background-color: #FBFCFD; */ - padding: 4px 6px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; + border: 1px solid #C5CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; } div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; + margin-left: 16px; + margin-top: 12px; + font-weight: bold; } div.groupText { - margin-left: 16px; - font-style: italic; + margin-left: 16px; + font-style: italic; } body { - background: white; - color: black; + background-color: white; + color: black; margin: 0; } div.contents { - width: 1024px; - margin: auto; - border: 1px solid #eee; - border-width: 0 1px; - padding: 15px; -} - -/* If the first element of the contents is a table, give it some space */ -div.contents > table { - margin: 1.5em 0 0; -} - -div.contents > p, -div.contents > h1, -div.contents > h2, -div.contents > dl, -.dynheader, -.dynsummary, -.dyncontent { - padding-left: 0; - padding-right: 0; -} - -div.contents hr { - margin-left: -15px; - margin-right: -15px; + margin-top: 10px; + margin-left: 8px; + margin-right: 8px; } td.indexkey { - font-family: Consolas, Menlo, "Lucida Console"; - border-bottom: 1px solid #eee; - padding: .25em 0 .25em .5em; -} + background-color: #ECEFF6; + font-weight: bold; + border-bottom: 1px solid #C5CFE5; + background-color: white; + margin: 4px; + padding: 5px 5px 5px 8px; -table tr.indexkey:first-child td { - padding-top: 1.5em; } td.indexvalue { - font-family: Consolas, Menlo, "Lucida Console"; - border-bottom: 1px solid #eee; - padding: .25em 0 .25em .5em; + background-color: #ECEFF6; + background-color: white; + border-bottom: 1px solid #C5CFE5; + padding: 2px 10px; + margin: 2px 0px; } -table tr.memlist > td { - padding-left: .5em; -} - -tr.memlist td { - font-family: Consolas, Menlo, "Lucida Console"; - padding: .25em 0; - border-bottom: 1px solid #eee; -} - -/* Don't show the [static] column in full member list */ -tr.memlist td code { - display: none; +tr.memlist { + background-color: #EEF1F7; } p.formulaDsp { - text-align: center; + text-align: center; } img.formulaDsp { @@ -304,155 +224,157 @@ img.formulaDsp { } img.formulaInl { - vertical-align: middle; + vertical-align: middle; } div.center { - text-align: center; + text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { - border: 0px; + border: 0px; } address.footer { - text-align: right; - padding-right: 12px; + text-align: right; + padding-right: 12px; } img.footer { - border: 0px; - vertical-align: middle; + border: 0px; + vertical-align: middle; } /* @group Code Colorization */ span.keyword { - color: #008000 + color: #008000 } span.keywordtype { - color: #604020 + color: #604020 } span.keywordflow { - color: #e08000 + color: #e08000 } span.comment { - color: #A085E4 + color: #800000 } span.preprocessor { - color: #806020 + color: #806020 } span.stringliteral { - color: #002080 + color: #002080 } span.charliteral { - color: #008080 + color: #008080 } span.vhdldigit { - color: #ff00ff + color: #ff00ff } span.vhdlchar { - color: #000000 + color: #000000 } span.vhdlkeyword { - color: #700070 + color: #700070 } span.vhdllogic { - color: #ff0000 + color: #ff0000 } /* @end */ /* .search { - color: #003399; - font-weight: bold; + color: #003399; + font-weight: bold; } form.search { - margin-bottom: 0px; - margin-top: 0px; + margin-bottom: 0px; + margin-top: 0px; } input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } */ td.tiny { - font-size: 75%; + font-size: 75%; } .dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A4B5D6; + padding: 4px; + border-collapse: collapse; + border: 1px solid #A4B5D6; } th.dirtab { - background: #ECEFF6; - font-weight: bold; + background: #ECEFF6; + font-weight: bold; } hr { - height: 0px; - border: none; - border-top: 2px solid #ddd; - margin: 1em 0; + height: 0px; + border: none; + border-top: 1px solid #4B6AA9; } hr.footer { - height: 1px; - margin-top: 0; + height: 1px; } /* @group Member Descriptions */ table.memberdecls { - font-family: Consolas, Menlo, "Lucida Console"; - border-spacing: 0px; - padding: 0px; - margin: 0 !important; + border-spacing: 0px; + padding: 0px; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { - border: none; - margin: 4px; - padding: .25em 0; + background-color: white; + border: none; + margin: 4px; + padding: 5px 5px 5px 8px; } .mdescLeft, .mdescRight { - color: #555; - padding-bottom: 1em; + padding: 0px 8px 4px 8px; + color: #555; } .memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #ccc; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } +.memItemRight { + width: 100%; +} + .memTemplParams { - color: #4765A1; + color: #4765A1; white-space: nowrap; } @@ -463,91 +385,129 @@ table.memberdecls { /* Styles for detailed member documentation */ .memtemplate { - font-size: 80%; - color: #4765A1; - font-weight: normal; - margin-left: 3px; + font-size: 80%; + color: #4765A1; + font-weight: normal; + margin-left: 9px; } .memnav { - background-color: #ECEFF6; - border: 1px solid #A4B5D6; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; + background-color: #ECEFF6; + border: 1px solid #A4B5D6; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; } .memitem { - padding: 0; - margin-top: .5em; + padding: 0; + margin-bottom: 10px; + margin-right: 5px; } .memname { - white-space: nowrap; - font: bold 105% Consolas, Menlo, "Lucida Console"; - margin: .25em 0 .1em .25em; + white-space: nowrap; + font-weight: bold; + margin-left: 6px; } -.memproto { - margin: 2em -15px 0; - border-top: 1px solid #ccc; - padding: 6px 15px; - color: #253554; - background-color: #f7f7f7; - font-family: Consolas, Menlo, "Lucida Console"; - font-weight: bold; +.memproto, dl.reflist dt { + border-top: 1px solid #BDBDBD; + border-left: 1px solid #BDBDBD; + border-right: 1px solid #BDBDBD; + padding: 6px 0px 6px 0px; + color: #333; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 1px 1px 5px; + -moz-border-radius-topright: 3px; + -moz-border-radius-topleft: 3px; + /* webkit specific markup */ + -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + background-color: #E2E2E2; + } -.memdoc { - margin: 0 -15px; - padding: .5em 15px 0; +.memdoc, dl.reflist dd { + border-bottom: 1px solid #BDBDBD; + border-left: 1px solid #BDBDBD; + border-right: 1px solid #BDBDBD; + padding: 2px 5px; + background-color: white; + border-top-width: 0; + /* opera specific markup */ + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-bottomright: 3px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 1px 1px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15) } -.memdoc > p { - margin-top: 0; +dl.reflist dt { + padding: 5px; } -.memdoc dl dd td { - padding-right: 1em; - padding-top: .5em; -} - -.memdoc dl dd table tr:first-child td { - padding-top: 0; -} - -.memdoc dl dd table tr td:first-child { - padding-right: 0; -} - -.memdoc dl.return dd { - margin-left: 1.25em; -} - -.memdoc dl dd td em { - font-family: Consolas, Menlo, "Lucida Console"; - font-weight: bold; - white-space: nowrap; +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; } .paramkey { - text-align: right; + text-align: right; } .paramtype { - white-space: nowrap; - color: #DD6800; + white-space: nowrap; } .paramname { - color: #602020; - white-space: nowrap; + color: #602020; + white-space: nowrap; } .paramname em { - font-style: normal; + font-style: normal; } +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + + + + /* @end */ /* @group Directory (tree) */ @@ -555,268 +515,492 @@ table.memberdecls { /* for the tree view */ .ftvtree { - font-family: sans-serif; - margin: 0px; + font-family: sans-serif; + margin: 0px; } /* these are for tree view when used as main index */ .directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; + font-size: 9pt; + font-weight: bold; + margin: 5px; } .directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + margin: 0px; + margin-top: 1em; + font-size: 11pt; } /* - The following two styles can be used to replace the root node title - with an image of your choice. Simply uncomment the next two styles, - specify the name of your image and be sure to set 'height' to the - proper pixel height of your image. +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. */ /* .directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); } .directory h3.swap span { - display: none; + display: none; } */ .directory > h3 { - margin-top: 0; + margin-top: 0; } .directory p { - margin: 0px; - white-space: nowrap; + margin: 0px; + white-space: nowrap; } .directory div { - display: none; - margin: 0px; + display: none; + margin: 0px; } .directory img { - vertical-align: -30%; + vertical-align: -30%; } /* these are for tree view when not used as main index */ .directory-alt { - font-size: 100%; - font-weight: bold; + font-size: 100%; + font-weight: bold; } .directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + margin: 0px; + margin-top: 1em; + font-size: 11pt; } .directory-alt > h3 { - margin-top: 0; + margin-top: 0; } .directory-alt p { - margin: 0px; - white-space: nowrap; + margin: 0px; + white-space: nowrap; } .directory-alt div { - display: none; - margin: 0px; + display: none; + margin: 0px; } .directory-alt img { - vertical-align: -30%; + vertical-align: -30%; } /* @end */ div.dynheader { - margin-top: 8px; -} - -div.dynheader.closed { - margin-bottom: 1em; -} - -div.dyncontent { - margin-bottom: 1em; + margin-top: 8px; } address { - font-style: normal; - color: #2B3D61; + font-style: normal; + color: #2B3D61; } table.doxtable { - border-collapse:collapse; + border-collapse:collapse; } table.doxtable td, table.doxtable th { - border: 1px solid #2E4167; - padding: 3px 7px 2px; + border: 1px solid #2E4167; + padding: 3px 7px 2px; } table.doxtable th { - background-color: #384F7E; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; + background-color: #384F7E; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; } +table.fieldtable { + width: 100%; + margin-bottom: 10px; + border: 1px solid #A9B9D8; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A9B9D8; + border-bottom: 1px solid #A9B9D8; + vertical-align: top; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A9B9D8; + width: 100%; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E3E8F2; + font-size: 90%; + color: #253554; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A9B9D8; +} + + .tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; } .navpath ul { - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - height:30px; - line-height:30px; - color:#8BA0CB; - border:solid 1px #C2CEE4; - overflow:hidden; - margin:0px; - padding:0px; + font-size: 11px; + background: -moz-linear-gradient(90deg, from(#CCC), to(whiteSmoke)); + background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); + height:30px; + line-height:30px; + color:#333; + border:solid 1px #CCC; + overflow:hidden; + margin:0px; + padding:0px; } .navpath li { - list-style-type:none; - float:left; - padding-left:10px; - padding-right: 15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#374E7C; + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#374E7C; } -.navpath a +.navpath li.navelem a { - height:32px; - display:block; - text-decoration: none; - outline: none; + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #333; } -.navpath a:hover +.navpath li.navelem a:hover { - color:#6985BC; + color:#6985BC; } +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#374E7C; + font-size: 8pt; +} + + div.summary { - float: right; - font-size: 90%; - width: 50%; - text-align: right; + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; } div.summary a { - white-space: nowrap; + white-space: nowrap; +} + +div.ingroups +{ + margin-left: 5px; + font-size: 8pt; + padding-left: 5px; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; } div.header { - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - width: 1024px; - margin: 0 auto; - padding: 1.5em 15px; - border-bottom: 1px solid #C5CFE5; - border-left: 1px solid #eee; - border-right: 1px solid #eee; + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C5CFE5; } -div.headertitle h1 { - margin: 0; +div.headertitle +{ + padding: 5px 5px 5px 7px; + background: -moz-linear-gradient(90deg, from(#333), to(#444)); + background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333)); + color: white; + text-shadow: -1px -1px black; } -/* @group Tabs */ - -.tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); - z-index: 101; - font-size: 100%; +div.headertitle a { + color: #5EB5EB; } -.tabs2 { - font-size: 90%; +dl +{ + padding: 0 0 0 10px; } -.tabs3 { - font-size: 75%; +dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug +{ + border-left:4px solid; + padding: 0 0 0 6px; } -.tablist { - margin: 0; - padding: 0; - display: table; +dl.note +{ + border-color: #D0C000; } +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #CCC; + background: -moz-linear-gradient(90deg, from(#333), to(#444)); + background: -webkit-gradient(linear, left top, left bottom, from(#E8E8E8), to(#B0B0B0)); + color: white; + font-weight: bold; + text-shadow: -1px -1px black; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #91A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334974; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } + pre.fragment + { + overflow: visible; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + } +} + + +/* ADDITIONS */ +.tabs, .tabs1, .tabs2, .tabs3 { + background: -moz-linear-gradient(90deg, from(#CCC), to(whiteSmoke)); + background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); + border-bottom: 1px solid #ccc; +} .tablist li { - float: left; - display: table-cell; - background-image: url('tab_b.png'); - line-height: 36px; - list-style: none; - padding: 0; + background: inherit; } .tablist a { - display: block; - padding: 0 20px; - font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #293A5C; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; - outline: none; -} - -.tabs3 .tablist a { - padding: 0 10px; + background: none; + color: #444; + border-right: 1px solid #ccc; } .tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; + background: inherit; } .tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + background: -moz-linear-gradient(90deg, from(whiteSmoke), to(#CCC)); + background: -webkit-gradient(linear, left top, left bottom, from(#CCC), to(whiteSmoke)); + color: #444; + text-shadow: 0px 1px 1px #f2f2f2; +} + +#nav-tree { + background: #E8EAEE !important; +} +#nav-tree a { + color: #333; +} + +#side-nav { + background: #E8EAEE !important; + border:none; +} + +#nav-tree .selected { + background: -moz-linear-gradient(90deg, from(#308CD9), to(#62B9ED)) !important; + background: -webkit-gradient(linear, left top, left bottom, from(#62B9ED), to(#308CD9)) !important; + border-top: 1px solid #308CD9; } -/* @end */ From 909471a5d7922c83be3b1df1f71c5366d93c1a50 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 01:30:58 +0200 Subject: [PATCH 02/15] fix the documentation generation process --- Jakefile | 4 + Tools/Documentation/Cappuccino.doxygen | 2 +- Tools/Documentation/doxygen.css | 165 +++++++++++++++++++++++-- 3 files changed, 159 insertions(+), 12 deletions(-) diff --git a/Jakefile b/Jakefile index be6eff3d5..3d2b5d0aa 100644 --- a/Jakefile +++ b/Jakefile @@ -160,6 +160,10 @@ function generateDocs(/* boolean */ noFrame) rm_rf($DOCUMENTATION_BUILD); mv("debug.txt", FILE.join("Documentation", "debug.txt")); mv("Documentation", $DOCUMENTATION_BUILD); + + // There is a bug in doxygen 1.7.x preventing loading correctly the custom CSS + // So let's do it manually + cp(FILE.join(documentationDir, "doxygen.css"), FILE.join($DOCUMENTATION_BUILD, "html", "doxygen.css")); } } diff --git a/Tools/Documentation/Cappuccino.doxygen b/Tools/Documentation/Cappuccino.doxygen index 50222fb25..d7c71175b 100644 --- a/Tools/Documentation/Cappuccino.doxygen +++ b/Tools/Documentation/Cappuccino.doxygen @@ -845,7 +845,7 @@ HTML_FOOTER = # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! -HTML_STYLESHEET = ./Tools/Documentation/doxygen.css +#HTML_STYLESHEET = doxygen.css # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet and background images diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index bb28386ec..e51686578 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -1,3 +1,4 @@ + /* The standard CSS for doxygen */ body, table, div, p, dl { @@ -880,7 +881,7 @@ dl.bug margin: 0px; width: 100%; border-bottom: 1px solid #CCC; - background: -moz-linear-gradient(90deg, from(#333), to(#444)); + background: -moz-linear-gradient(90deg, from(#B0B0B0), to(#E8E8E8)); background: -webkit-gradient(linear, left top, left bottom, from(#E8E8E8), to(#B0B0B0)); color: white; font-weight: bold; @@ -960,16 +961,43 @@ dl.citelist dd { /* ADDITIONS */ -.tabs, .tabs1, .tabs2, .tabs3 { +.tabs, .tabs2, .tabs3 { background: -moz-linear-gradient(90deg, from(#CCC), to(whiteSmoke)); background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); border-bottom: 1px solid #ccc; + width: 100%; + z-index: 101; + font-size: 13px; + } +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + .tablist li { - background: inherit; + float: left; + display: table-cell; + line-height: 36px; + list-style: none; + background: inherit; } .tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; background: none; color: #444; border-right: 1px solid #ccc; @@ -977,8 +1005,16 @@ dl.citelist dd { .tablist a:hover { background: inherit; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; + } +.tabs3 .tablist a { + padding: 0 10px; +} + + .tablist li.current a { background: -moz-linear-gradient(90deg, from(whiteSmoke), to(#CCC)); background: -webkit-gradient(linear, left top, left bottom, from(#CCC), to(whiteSmoke)); @@ -986,21 +1022,128 @@ dl.citelist dd { text-shadow: 0px 1px 1px #f2f2f2; } -#nav-tree { - background: #E8EAEE !important; -} -#nav-tree a { - color: #333; + +////// +#nav-tree .children_ul { + margin:0; + padding:4px; } -#side-nav { - background: #E8EAEE !important; - border:none; +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; } #nav-tree .selected { background: -moz-linear-gradient(90deg, from(#308CD9), to(#62B9ED)) !important; background: -webkit-gradient(linear, left top, left bottom, from(#62B9ED), to(#308CD9)) !important; border-top: 1px solid #308CD9; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); } +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; + outline:none; + color: #333; +} + +#nav-tree .label { + margin:0px; + padding:0px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + padding:2px; + margin:0px; + color:#fff; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + background: #E8EAEE; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: 300px; + background: #E8EAEE; + border:none; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background:url("ftv2splitbar.png") repeat scroll right center transparent; + cursor:e-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; +} From a40345c14d76e868fc2b8e4f85497cb61fcf8e9c Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 11:46:20 +0200 Subject: [PATCH 03/15] fix the slider --- Tools/Documentation/doxygen.css | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index e51686578..1b73be2d5 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -1098,6 +1098,8 @@ dl.citelist dd { background: #E8EAEE; font-size:14px; overflow:auto; + padding-right: 0px !important; + margin-right: -3px !important; } #doc-content { @@ -1120,15 +1122,16 @@ dl.citelist dd { .ui-resizable .ui-resizable-handle { display:block; + background-image: none !important; } .ui-resizable-e { - background:url("ftv2splitbar.png") repeat scroll right center transparent; + background: none !important; cursor:e-resize; height:100%; right:0; top:0; - width:6px; + width:3px !important; } .ui-resizable-handle { @@ -1136,6 +1139,7 @@ dl.citelist dd { font-size:0.1px; position:absolute; z-index:1; + background: none !important; } #nav-tree-contents { @@ -1143,7 +1147,7 @@ dl.citelist dd { } #nav-tree { - background-image:url('nav_h.png'); + /*background-image:url('nav_h.png');*/ background-repeat:repeat-x; background-color: #F9FAFC; } From c7518d0c49f963572872473b1e3f4328312bb227 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 12:44:10 +0200 Subject: [PATCH 04/15] merge Aparajita's previous improvments on the CSS --- Tools/Documentation/doxygen.css | 193 ++++++++++++++++++++++++-------- 1 file changed, 146 insertions(+), 47 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index 1b73be2d5..5c6687577 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -1,21 +1,57 @@ - /* The standard CSS for doxygen */ -body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; +body, table, td, div, p, dl, dd, dt, em { + margin: 0; + padding: 0; +} + +body, table, div, p { + font: 13px normal "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; +} + +table { + border-collapse: collapse; +} + +pre, code { + font-family: Courier; +} + +p { + margin: 1em 0; +} + +dl { + margin-bottom: 1em; +} + +dd { + margin: .25em 1em; +} + +ul { + list-style-type: square; +} + +li { + margin: 0; + padding: .2em 0; +} + +em { + font-style: normal; + color: #7B509F; } /* @group Heading Levels */ -h1 { - font-size: 150%; +h1, h2, h3, h4 { + font-family: "Lucida Grande", Helvetica, Arial, Geneva, sans-serif; + margin: 2em 0 1em 0; } .title { font-size: 150%; - font-weight: bold; - margin: 10px 2px; } h2 { @@ -69,10 +105,12 @@ h3.version { text-align: center; } -div.qindex, div.navtab{ +div.qindex, div.navtab { background-color: #ECEFF6; border: 1px solid #A4B5D6; text-align: center; + margin: 2px; + padding: 2px; } div.qindex, div.navpath { @@ -80,6 +118,18 @@ div.qindex, div.navpath { line-height: 140%; } +div.qindex+table { + margin: 1.5em; +} + +div.qindex+table td { + padding: .2em 0; +} + +div.qindex+table tr td table { + display: none; +} + div.navtab { margin-right: 15px; } @@ -117,7 +167,7 @@ a.qindexHL { } a.el { - font-weight: bold; + padding: 1px; } a.elRef { @@ -138,18 +188,19 @@ dl.el { } .fragment { - font-family: monospace, fixed; + font-family: Courier, monospace, fixed; font-size: 105%; } pre.fragment { + margin-top: 1em; border: 1px solid #C5CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; - font-size: 9pt; + font-size: 9pt; line-height: 125%; } @@ -174,6 +225,7 @@ div.ah { div.groupHeader { margin-left: 16px; margin-top: 12px; + margin-bottom: 6px; font-weight: bold; } @@ -189,33 +241,58 @@ body { } div.contents { - margin-top: 10px; - margin-left: 8px; - margin-right: 8px; + margin: 1.5em; +} + +/* If the first element of the contents is a table, give it some space */ +div.contents > table { + margin-top: 1.5em; } td.indexkey { - background-color: #ECEFF6; + font-family: Consolas, "Lucida Console"; + padding: .25em 0 .25em .5em; font-weight: bold; border-bottom: 1px solid #C5CFE5; background-color: white; margin: 4px; - padding: 5px 5px 5px 8px; +} +table tr.indexkey:first-child td { + padding-top: 1.5em; } td.indexvalue { background-color: #ECEFF6; background-color: white; border-bottom: 1px solid #C5CFE5; - padding: 2px 10px; margin: 2px 0px; + padding: .25em 0 .25em .5em; } tr.memlist { background-color: #EEF1F7; } +table tr.memlist:first-child td { + padding-top: 1.5em; +} + +table tr.memlist > td { + padding-left: .5em; +} + +tr.memlist td { + font-family: Consolas, "Lucida Console"; + padding: .25em 0; + border-bottom: 1px solid #eee; +} + +/* Don't show the [static] column in full member list */ +tr.memlist td code { + display: none; +} + p.formulaDsp { text-align: center; } @@ -264,7 +341,7 @@ span.keywordflow { } span.comment { - color: #800000 + color: #A085E4 } span.preprocessor { @@ -334,7 +411,8 @@ th.dirtab { hr { height: 0px; border: none; - border-top: 1px solid #4B6AA9; + border-top: 2px solid #ddd; + margin: 1em 0; } hr.footer { @@ -344,6 +422,7 @@ hr.footer { /* @group Member Descriptions */ table.memberdecls { + font-family: Consolas, "Lucida Console"; border-spacing: 0px; padding: 0px; } @@ -354,12 +433,12 @@ table.memberdecls { background-color: white; border: none; margin: 4px; - padding: 5px 5px 5px 8px; + padding: .25em 0; } .mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; color: #555; + padding-bottom: 1em; } .memItemLeft, .memItemRight, .memTemplParams { @@ -407,14 +486,13 @@ table.memberdecls { .memitem { padding: 0; - margin-bottom: 10px; - margin-right: 5px; + margin-top: .5em; } .memname { - white-space: nowrap; - font-weight: bold; - margin-left: 6px; + white-space: nowrap; + font: bold 105% Consolas, "Lucida Console"; + margin: .25em 0 0 .25em; } .memproto, dl.reflist dt { @@ -441,11 +519,13 @@ table.memberdecls { } +.memdoc > p { + margin-top: 0; +} .memdoc, dl.reflist dd { border-bottom: 1px solid #BDBDBD; border-left: 1px solid #BDBDBD; border-right: 1px solid #BDBDBD; - padding: 2px 5px; background-color: white; border-top-width: 0; /* opera specific markup */ @@ -459,16 +539,30 @@ table.memberdecls { /* webkit specific markup */ -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; - -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15) + -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); + padding: .5em .5em 0; +} + +.memdoc dl dd td { + padding-right: 1em; } dl.reflist dt { padding: 5px; } -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; +.memdoc dl dd table tr td:first-child { + padding-right: 0; +} + +.memdoc dl.return dd { + margin-left: 1.25em; +} + +.memdoc dl dd td em { + font-family: Consolas, "Lucida Console"; + font-weight: bold; + white-space: nowrap; } .paramkey { @@ -477,6 +571,7 @@ dl.reflist dd { .paramtype { white-space: nowrap; + color: #DD6800; } .paramname { @@ -535,10 +630,10 @@ dl.reflist dd { } /* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. + The following two styles can be used to replace the root node title + with an image of your choice. Simply uncomment the next two styles, + specify the name of your image and be sure to set 'height' to the + proper pixel height of your image. */ /* @@ -711,7 +806,7 @@ table.fieldtable { list-style-type:none; float:left; padding-left:10px; - padding-right:15px; + padding-right: 15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; @@ -749,7 +844,7 @@ table.fieldtable { div.summary { float: right; - font-size: 8pt; + font-size: 90%; padding-right: 5px; width: 50%; text-align: right; @@ -762,9 +857,9 @@ div.summary a div.ingroups { - margin-left: 5px; + margin-left: 0px; font-size: 8pt; - padding-left: 5px; + padding-left: 0px; width: 50%; text-align: left; } @@ -776,10 +871,8 @@ div.ingroups a div.header { - background-image:url('nav_h.png'); - background-repeat:repeat-x; background-color: #F9FAFC; - margin: 0px; + margin: 0px; border-bottom: 1px solid #C5CFE5; } @@ -792,6 +885,10 @@ div.headertitle text-shadow: -1px -1px black; } +div.headertitle h1 { + margin: 0px; +} + div.headertitle a { color: #5EB5EB; } @@ -967,14 +1064,15 @@ dl.citelist dd { border-bottom: 1px solid #ccc; width: 100%; z-index: 101; - font-size: 13px; + font-size: 100%; +} -} .tabs2 { - font-size: 10px; + font-size: 90%; } + .tabs3 { - font-size: 9px; + font-size: 75%; } .tablist { @@ -989,6 +1087,7 @@ dl.citelist dd { line-height: 36px; list-style: none; background: inherit; + padding: 0; } .tablist a { From b4edc084f8e386e15c39ca6984132f8087399d89 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 14:00:20 +0200 Subject: [PATCH 05/15] add Cappuccino logo --- Tools/Documentation/Cappuccino.doxygen | 4 +++- Tools/Documentation/doxygen.css | 1 + Tools/Documentation/logo.png | Bin 0 -> 23047 bytes 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Tools/Documentation/logo.png diff --git a/Tools/Documentation/Cappuccino.doxygen b/Tools/Documentation/Cappuccino.doxygen index d7c71175b..2766db0a7 100644 --- a/Tools/Documentation/Cappuccino.doxygen +++ b/Tools/Documentation/Cappuccino.doxygen @@ -25,7 +25,7 @@ DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. -PROJECT_NAME = "Cappuccino API" +PROJECT_NAME = " API" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or @@ -33,6 +33,8 @@ PROJECT_NAME = "Cappuccino API" PROJECT_NUMBER = 0.9.1 +PROJECT_LOGO = ./Tools/Documentation/logo.png + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index 5c6687577..134a9f9e4 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -949,6 +949,7 @@ dl.bug #projectlogo img { border: 0px none; + max-height: 55px; } #projectname diff --git a/Tools/Documentation/logo.png b/Tools/Documentation/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d370088a7d36fe39f6d2f712a095d78f1d07b701 GIT binary patch literal 23047 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 Date: Thu, 8 Sep 2011 14:44:05 +0200 Subject: [PATCH 06/15] forget to restore the bg color of the tree view --- Tools/Documentation/doxygen.css | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index 134a9f9e4..29db770d9 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -1200,6 +1200,7 @@ dl.citelist dd { overflow:auto; padding-right: 0px !important; margin-right: -3px !important; + background: #E8EAEE !important; } #doc-content { From b619c0b793988d3347b6e46dd1201e07e880ec9e Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 16:55:12 +0200 Subject: [PATCH 07/15] some small graphical improvments --- Tools/Documentation/doxygen.css | 91 +++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 32 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index 29db770d9..d0116fb6c 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -149,6 +149,7 @@ a { a:hover { text-decoration: none; color: #62B9ED; + text-shadow: none; } a.qindex { @@ -487,6 +488,7 @@ table.memberdecls { .memitem { padding: 0; margin-top: .5em; + margin-bottom: 10px; } .memname { @@ -516,7 +518,7 @@ table.memberdecls { -webkit-border-top-right-radius: 3px; -webkit-border-top-left-radius: 3px; background-color: #E2E2E2; - + padding-left: 3px; } .memdoc > p { @@ -540,7 +542,7 @@ table.memberdecls { -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); - padding: .5em .5em 0; + padding: .8em .5em 0; } .memdoc dl dd td { @@ -825,19 +827,20 @@ table.fieldtable { .navpath li.navelem a:hover { color:#6985BC; + text-shadow: none; } .navpath li.footer { - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#374E7C; - font-size: 8pt; + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#374E7C; + font-size: 8pt; } @@ -848,11 +851,17 @@ div.summary padding-right: 5px; width: 50%; text-align: right; + margin-left: 10px; + margin-top: 22px; + margin-right: 10px; + color: #419DE0; } div.summary a { white-space: nowrap; + margin-left: 3px; + margin-right: 3px; } div.ingroups @@ -862,6 +871,7 @@ div.ingroups padding-left: 0px; width: 50%; text-align: left; + margin-top: 2px; } div.ingroups a @@ -878,11 +888,12 @@ div.header div.headertitle { - padding: 5px 5px 5px 7px; + padding: 10px 5px 10px 20px; background: -moz-linear-gradient(90deg, from(#333), to(#444)); background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333)); color: white; text-shadow: -1px -1px black; + min-height: 36px; } div.headertitle h1 { @@ -950,6 +961,7 @@ dl.bug { border: 0px none; max-height: 55px; + padding-left: 5px; } #projectname @@ -984,6 +996,8 @@ dl.bug color: white; font-weight: bold; text-shadow: -1px -1px black; + /*background: -moz-linear-gradient(90deg, from(#B0B0B0), to(#E8E8E8));*/ + /*background: -webkit-gradient(linear, left top, left bottom, from(#84DBFF), to(#62B9ED));*/ } .image @@ -1060,20 +1074,20 @@ dl.citelist dd { /* ADDITIONS */ .tabs, .tabs2, .tabs3 { - background: -moz-linear-gradient(90deg, from(#CCC), to(whiteSmoke)); - background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); + background: -moz-linear-gradient(90deg, from(#eee), to(#fff)); + background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee)); border-bottom: 1px solid #ccc; width: 100%; z-index: 101; font-size: 100%; } -.tabs2 { - font-size: 90%; +.tabs a, .tabs2 a{ + text-align: center; } -.tabs3 { - font-size: 75%; +.tabs2 { + font-size: 90%; } .tablist { @@ -1107,23 +1121,43 @@ dl.citelist dd { background: inherit; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); text-decoration: none; + text-shadow: none; + color: gray; +} +.tabs3 { + font-size: 75%; + max-height: 20px; + line-height: 0px; +} + +.tabs3 li { + padding: 0px; + margin: 0px; + line-height: 20px; } .tabs3 .tablist a { padding: 0 10px; + height: 20px; + padding-top: 0px; + margin-top: 0px; } - .tablist li.current a { - background: -moz-linear-gradient(90deg, from(whiteSmoke), to(#CCC)); - background: -webkit-gradient(linear, left top, left bottom, from(#CCC), to(whiteSmoke)); + background: -moz-linear-gradient(90deg, from(#fff), to(#eee)); + background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#fff)); color: #444; text-shadow: 0px 1px 1px #f2f2f2; } +.tabs2 li{ + padding: 0px; + margin: 0px; + line-height: 30px; +} + -////// #nav-tree .children_ul { margin:0; padding:4px; @@ -1199,7 +1233,7 @@ dl.citelist dd { font-size:14px; overflow:auto; padding-right: 0px !important; - margin-right: -3px !important; + margin-right: -5px !important; background: #E8EAEE !important; } @@ -1227,12 +1261,12 @@ dl.citelist dd { } .ui-resizable-e { - background: none !important; + background: #CCC !important; cursor:e-resize; height:100%; right:0; top:0; - width:3px !important; + width: 1px !important; } .ui-resizable-handle { @@ -1240,15 +1274,8 @@ dl.citelist dd { font-size:0.1px; position:absolute; z-index:1; - background: none !important; } #nav-tree-contents { margin: 6px 0px 0px 0px; } - -#nav-tree { - /*background-image:url('nav_h.png');*/ - background-repeat:repeat-x; - background-color: #F9FAFC; -} From e32489aba154acadeda3cdbca721f5931019922e Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 17:08:50 +0200 Subject: [PATCH 08/15] tiny padding improvment in generated html docs --- Tools/Documentation/doxygen.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index d0116fb6c..ec5c0a80b 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -518,7 +518,7 @@ table.memberdecls { -webkit-border-top-right-radius: 3px; -webkit-border-top-left-radius: 3px; background-color: #E2E2E2; - padding-left: 3px; + padding-left: 9px; } .memdoc > p { @@ -542,7 +542,7 @@ table.memberdecls { -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px; -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.15); - padding: .8em .5em 0; + padding: .8em 12px 0 12px; } .memdoc dl dd td { From dcbe3ee650b875bba8728bd1c173c15ef04bdcd8 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 17:15:12 +0200 Subject: [PATCH 09/15] fix paremeters touching their description in bubbles --- Tools/Documentation/doxygen.css | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index ec5c0a80b..41a7923b1 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -585,22 +585,26 @@ dl.reflist dt { } .params, .retval, .exception, .tparams { - border-spacing: 6px 2px; + border-spacing: 6px 2px; } .params .paramname, .retval .paramname { - font-weight: bold; - vertical-align: top; + font-weight: bold; + vertical-align: top; } .params .paramtype { - font-style: italic; - vertical-align: top; + font-style: italic; + vertical-align: top; +} + +.memdoc .params td { + padding-left: 10px; } .params .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; + font-family: "courier new",courier,monospace; + vertical-align: top; } From 8dab47f4da942e5541743f18c71998a930ea4fa1 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 18:12:32 +0200 Subject: [PATCH 10/15] mozilla compat --- Tools/Documentation/doxygen.css | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Tools/Documentation/doxygen.css b/Tools/Documentation/doxygen.css index 41a7923b1..afb8b6006 100644 --- a/Tools/Documentation/doxygen.css +++ b/Tools/Documentation/doxygen.css @@ -796,7 +796,7 @@ table.fieldtable { .navpath ul { font-size: 11px; - background: -moz-linear-gradient(90deg, from(#CCC), to(whiteSmoke)); + background: -moz-linear-gradient(-90deg, whiteSmoke, #CCC); background: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CCC)); height:30px; line-height:30px; @@ -893,7 +893,8 @@ div.header div.headertitle { padding: 10px 5px 10px 20px; - background: -moz-linear-gradient(90deg, from(#333), to(#444)); + background: #333; + background: -moz-linear-gradient(-90deg, #444, #333); background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333)); color: white; text-shadow: -1px -1px black; @@ -995,13 +996,12 @@ dl.bug margin: 0px; width: 100%; border-bottom: 1px solid #CCC; - background: -moz-linear-gradient(90deg, from(#B0B0B0), to(#E8E8E8)); - background: -webkit-gradient(linear, left top, left bottom, from(#E8E8E8), to(#B0B0B0)); color: white; font-weight: bold; text-shadow: -1px -1px black; - /*background: -moz-linear-gradient(90deg, from(#B0B0B0), to(#E8E8E8));*/ - /*background: -webkit-gradient(linear, left top, left bottom, from(#84DBFF), to(#62B9ED));*/ + background: #485D77; + background: -moz-linear-gradient(-90deg, #485D77, #252D38); + background: -webkit-gradient(linear, left top, left bottom, from(#485D77), to(#252D38)); } .image @@ -1078,7 +1078,7 @@ dl.citelist dd { /* ADDITIONS */ .tabs, .tabs2, .tabs3 { - background: -moz-linear-gradient(90deg, from(#eee), to(#fff)); + background: -moz-linear-gradient(-90deg, #fff, #eee); background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee)); border-bottom: 1px solid #ccc; width: 100%; @@ -1149,7 +1149,7 @@ dl.citelist dd { } .tablist li.current a { - background: -moz-linear-gradient(90deg, from(#fff), to(#eee)); + background: -moz-linear-gradient(-90deg, #eee, #fff); background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#fff)); color: #444; text-shadow: 0px 1px 1px #f2f2f2; @@ -1184,7 +1184,7 @@ dl.citelist dd { } #nav-tree .selected { - background: -moz-linear-gradient(90deg, from(#308CD9), to(#62B9ED)) !important; + background: -moz-linear-gradient(-90deg, #62B9ED, #308CD9) !important; background: -webkit-gradient(linear, left top, left bottom, from(#62B9ED), to(#308CD9)) !important; border-top: 1px solid #308CD9; text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); From 67b2671dad5398eda845a9b3d2e9542e3182f07d Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 15 Sep 2011 16:39:24 +0200 Subject: [PATCH 11/15] improve key view loops - include the window's content view at the start of the key view loop - set the initial first responder to the window's content view (and keep it that way unless it is explicitly changed) - CPWindow should return NO from acceptsFirstResponder (Cocoa compliance). - change the type of setInitialFirstResponder, this is compliant with Cocoa. The new key view loop code will break if initial first responder is anything but a view - change the implementation of selectNextKeyView:, selectPreviousKeyView:, selectKeyViewFollowingView: and selectKeyViewPrecedingView: to follow to Cocoa's documentation --- AppKit/CPWindow/CPWindow.j | 73 +++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 2bed398b6..1e2b05ab2 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -426,6 +426,7 @@ CPTexturedBackgroundWindowMask // Create a generic content view. [self setContentView:[[CPView alloc] initWithFrame:CGRectMakeZero()]]; + [self setInitialFirstResponder:[self contentView]]; _firstResponder = self; @@ -950,6 +951,12 @@ CPTexturedBackgroundWindowMask var bounds = CGRectMake(0.0, 0.0, CGRectGetWidth(_frame), CGRectGetHeight(_frame)); + // During init the initial first responder is set to the contentView + // if it hasn't changed in the mean time we need to update that reference + // to the new contentView + if ([self initialFirstResponder] === _contentView) + [self setInitialFirstResponder:aView]; + _contentView = aView; [_contentView setFrame:[self contentRectForFrameRect:bounds]]; @@ -1274,17 +1281,17 @@ CPTexturedBackgroundWindowMask - (BOOL)acceptsFirstResponder { - return YES; + return NO; } -- (id)initialFirstResponder +- (CPView)initialFirstResponder { return _initialFirstResponder; } -- (void)setInitialFirstResponder:(id)aResponder +- (void)setInitialFirstResponder:(CPView)aView { - _initialFirstResponder = aResponder; + _initialFirstResponder = aView; } /*! @@ -2487,30 +2494,70 @@ CPTexturedBackgroundWindowMask - (void)selectNextKeyView:(id)sender { + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) + [self recalculateKeyViewLoop]; + + var nextValidKeyView = nil; + if ([_firstResponder isKindOfClass:[CPView class]]) - [self selectKeyViewFollowingView:_firstResponder]; + nextValidKeyView = [_firstResponder nextValidKeyView]; + + if (!nextValidKeyView) + { + var initialFirstResponder = [self initialFirstResponder]; + + if ([initialFirstResponder acceptsFirstResponder]) + nextValidKeyView = initialFirstResponder; + else + nextValidKeyView = [initialFirstResponder nextValidKeyView]; + } + + [self makeFirstResponder:nextValidKeyView]; } - (void)selectPreviousKeyView:(id)sender { + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) + [self recalculateKeyViewLoop]; + + var previousValidKeyView = nil; + if ([_firstResponder isKindOfClass:[CPView class]]) - [self selectKeyViewPrecedingView:_firstResponder]; + previousValidKeyView = [_firstResponder previousValidKeyView]; + + if (!previousValidKeyView) + { + var initialFirstResponder = [self initialFirstResponder]; + + if ([initialFirstResponder acceptsFirstResponder]) + previousValidKeyView = initialFirstResponder; + else + previousValidKeyView = [initialFirstResponder previousValidKeyView]; + } + + [self makeFirstResponder:previousValidKeyView]; } - (void)selectKeyViewFollowingView:(CPView)aView { - if (_keyViewLoopIsDirty) + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) [self recalculateKeyViewLoop]; - [self makeFirstResponder:[aView nextValidKeyView]]; + var nextValidKeyView = [aView nextValidKeyView]; + + if ([nextValidKeyView isKindOfClass:[CPView class]]) + [self makeFirstResponder:nextValidKeyView]; } - (void)selectKeyViewPrecedingView:(CPView)aView { - if (_keyViewLoopIsDirty) + if (_keyViewLoopIsDirty && [self autorecalculatesKeyViewLoop]) [self recalculateKeyViewLoop]; - [self makeFirstResponder:[aView previousValidKeyView]]; + var previousValidKeyView = [aView previousValidKeyView]; + + if ([previousValidKeyView isKindOfClass:[CPView class]]) + [self makeFirstResponder:previousValidKeyView]; } /*! @@ -2598,9 +2645,11 @@ CPTexturedBackgroundWindowMask var allViews = function(aWindow) { - var views = [[aWindow contentView] subviews], - index = 0; + var views = [CPArray arrayWithObject:[aWindow contentView]]; + [views addObjectsFromArray:[[aWindow contentView] subviews]]; + + var index = 0; for (; index < views.length; ++index) views = views.concat([views[index] subviews]); From 97b7f0901ebe23d3a5168ef5915e58e19e26068f Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 15 Sep 2011 17:50:37 +0200 Subject: [PATCH 12/15] add tests for key view loop behavior --- Tests/AppKit/CPWindowTest.j | 103 ++++++++++++++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/Tests/AppKit/CPWindowTest.j b/Tests/AppKit/CPWindowTest.j index ca465c673..0ef64e874 100644 --- a/Tests/AppKit/CPWindowTest.j +++ b/Tests/AppKit/CPWindowTest.j @@ -5,15 +5,108 @@ @implementation CPWindowTest : OJTestCase { - CPWindow theWindow; + CPWindow _window @accessors(property=window); } --(void)testCanAllocWindow +- (void)setUp { - theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(0,0,200,150) - styleMask:CPWindowNotSizable]; + _window = [[CPWindow alloc] initWithContentRect:CGRectMake(0.0, 0.0, 1024.0, 768.0) + styleMask:CPWindowNotSizable]; +} - [self assertTrue:!!theWindow]; +- (void)testCanAllocWindow +{ + [self assertTrue:!![self window]]; +} + +- (void)testThatContentViewIsInitialFirstResponder +{ + var contentView = [[self window] contentView]; + [self assert:contentView + equals:[[self window] initialFirstResponder] + message:@"The window's content view must be the initial first responder"]; +} + +- (void)testKeyViewLoop +{ + var contentView = [[self window] contentView], + textField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100.0]; + + [textField setFrame:CGRectMake(100.0, 100.0, 100.0, 26.0)]; + [contentView addSubview:textField]; + [[self window] recalculateKeyViewLoop]; + + var nextTextField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100]; + [nextTextField setFrame:CGRectMake(100.0, 200.0, 100.0, 26.0)]; + [contentView addSubview:nextTextField]; + [[self window] recalculateKeyViewLoop]; + + // Test nextKeyView + [self assert:textField + equals:[contentView nextKeyView] + message:@"textField should be the next key view of contentView"]; + + [self assert:nextTextField + equals:[textField nextKeyView] + message:@"nextTextField should be the next key view of textField"]; + + [self assert:contentView + equals:[nextTextField nextKeyView] + message:@"contentView should be the next key view of nextTextField"]; + + // Test previousKeyView + [self assert:contentView + equals:[textField previousKeyView] + message:@"contentView should be the previous key view of textField"]; + + [self assert:textField + equals:[nextTextField previousKeyView] + message:@"textField should be the previous key view of nextTextField"]; + + [self assert:nextTextField + equals:[contentView previousKeyView] + message:@"nextTextField should be the previous key view of contentView"]; +} + +- (void)testValiKeyViewLoop +{ + var contentView = [[self window] contentView], + textField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100.0]; + + [textField setFrame:CGRectMake(100.0, 100.0, 100.0, 26.0)]; + [contentView addSubview:textField]; + [[self window] recalculateKeyViewLoop]; + + var nextTextField = [CPTextField textFieldWithStringValue:@"" placeholder:@"" width:100]; + [nextTextField setFrame:CGRectMake(100.0, 200.0, 100.0, 26.0)]; + [contentView addSubview:nextTextField]; + [[self window] recalculateKeyViewLoop]; + + // Test nextValidKeyView + [self assert:textField + equals:[contentView nextValidKeyView] + message:@"textField should be the next valid key view of contentView"]; + + [self assert:nextTextField + equals:[textField nextValidKeyView] + message:@"nextTextField should be the next valid key view of textField"]; + + [self assert:textField + equals:[nextTextField nextValidKeyView] + message:@"textField should be the next key valid view of nextTextField"]; + + // Test previousValidKeyView + [self assert:nextTextField + equals:[textField previousValidKeyView] + message:@"nextTextField should be the previous valid key view of textField"]; + + [self assert:textField + equals:[nextTextField previousValidKeyView] + message:@"textField should be the previous key valid view of nextTextField"]; + + [self assert:nextTextField + equals:[contentView previousValidKeyView] + message:@"nextTextField should be the previous valid key view of contentView"]; } @end \ No newline at end of file From 5b00f7f2e8b58d3a4719ccdb06039d7dbf6f3e87 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 15 Sep 2011 22:32:23 +0200 Subject: [PATCH 13/15] improve _CPKVCArray _CPKVCArray now consistently calls both single and multiple indexes accessors consistently Tests that verify the behavior are included --- Foundation/CPArray+KVO.j | 97 +++++++-- Tests/Foundation/CPKVCArrayTest.j | 314 ++++++++++++++++++++++++++++++ 2 files changed, 397 insertions(+), 14 deletions(-) create mode 100644 Tests/Foundation/CPKVCArrayTest.j diff --git a/Foundation/CPArray+KVO.j b/Foundation/CPArray+KVO.j index cba5700cd..8000d2076 100644 --- a/Foundation/CPArray+KVO.j +++ b/Foundation/CPArray+KVO.j @@ -131,7 +131,7 @@ _replaceManySEL = sel_getName(@"replace" + capitalizedKey + "AtIndexes:with" + capitalizedKey + ":"); if ([_proxyObject respondsToSelector:_replaceManySEL]) - _replace = [_proxyObject methodForSelector:_replaceManySEL]; + _replaceMany = [_proxyObject methodForSelector:_replaceManySEL]; _objectAtIndexSEL = sel_getName(@"objectIn" + capitalizedKey + "AtIndex:"); if ([_proxyObject respondsToSelector:_objectAtIndexSEL]) @@ -233,10 +233,25 @@ - (id)objectAtIndex:(unsigned)anIndex { - if (_objectAtIndex) - return _objectAtIndex(_proxyObject, _objectAtIndexSEL, anIndex); + return [[self objectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex]] firstObject]; +} - return [[self _representedObject] objectAtIndex:anIndex]; +- (CPArray)objectsAtIndexes:(CPIndexSet)theIndexes +{ + if (_objectsAtIndexes) + return _objectsAtIndexes(_proxyObject, _objectsAtIndexesSEL, theIndexes); + if (_objectAtIndex) + { + var index = CPNotFound, + objects = []; + + while ((index = [theIndexes indexGreaterThanIndex:index]) !== CPNotFound) + objects.push(_objectAtIndex(_proxyObject, _objectAtIndexSEL, index)); + + return objects; + } + + return [[self _representedObject] objectsAtIndexes:theIndexes]; } - (void)addObject:(id)anObject @@ -288,6 +303,27 @@ [self removeObject:anObject inRange:CPMakeRange(0, [self count])]; } +- (void)removeObject:(id)theObject inRange:(CPRange)theRange +{ + if (_remove) + _remove(_proxyObject, _removeSEL, [self indexOfObject:theObject inRange:theRange]); + else if (_removeMany) + { + var index = [self indexOfObject:theObject inRange:theRange]; + _removeMany(_proxyObject, _removeManySEL, [CPIndexSet indexSetWithIndex:index]); + } + else + { + var index; + + while ((index = [self indexOfObject:theObject inRange:theRange]) !== CPNotFound) + { + [self removeObjectAtIndex:index]; + theRange = CPIntersectionRange(CPMakeRange(index, length - index), theRange); + } + } +} + - (void)removeLastObject { if (_remove) @@ -301,24 +337,57 @@ - (void)removeObjectAtIndex:(unsigned)anIndex { - if (_remove) - return _remove(_proxyObject, _removeSEL, anIndex); + [self removeObjectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex]]; +} - var target = [[self _representedObject] copy]; +- (void)removeObjectsAtIndexes:(CPIndexSet)theIndexes +{ + if (_removeMany) + _removeMany(_proxyObject, _removeManySEL, theIndexes); + else if (_remove) + { + var index = [theIndexes lastIndex]; - [target removeObjectAtIndex:anIndex]; - [self _setRepresentedObject:target]; + while (index !== CPNotFound) + { + _remove(_proxyObject, _removeSEL, index) + index = [theIndexes indexLessThanIndex:index]; + } + } + else + { + var target = [[self _representedObject] copy]; + [target removeObjectsAtIndexes:theIndexes]; + [self _setRepresentedObject:target]; + } } - (void)replaceObjectAtIndex:(unsigned)anIndex withObject:(id)anObject { - if (_replace) - return _replace(_proxyObject, _replaceSEL, anIndex, anObject); + [self replaceObjectsAtIndexes:[CPIndexSet indexSetWithIndex:anIndex] withObjects:[anObject]] +} - var target = [[self _representedObject] copy]; +- (void)replaceObjectsAtIndexes:(CPIndexSet)theIndexes withObjects:(CPArray)theObjects +{ + if (_replaceMany) + return _replaceMany(_proxyObject, _replaceManySEL, theIndexes, theObjects); + else if (_replace) + { + var i = 0, + index = [theIndexes firstIndex]; - [target replaceObjectAtIndex:anIndex withObject:anObject]; - [self _setRepresentedObject:target]; + while (index !== CPNotFound) + { + _replace(_proxyObject, _replaceSEL, index, [theObjects objectAtIndex:i++]); + index = [theIndexes indexGreaterThanIndex:index]; + } + } + else + { + var target = [[self _representedObject] copy]; + [target replaceObjectsAtIndexes:theIndexes withObjects:theObjects]; + [self _setRepresentedObject:target]; + } } @end diff --git a/Tests/Foundation/CPKVCArrayTest.j b/Tests/Foundation/CPKVCArrayTest.j new file mode 100644 index 000000000..f29bd7d91 --- /dev/null +++ b/Tests/Foundation/CPKVCArrayTest.j @@ -0,0 +1,314 @@ +var COUNTER; + +@implementation CPKVCArrayTest : OJTestCase +{ + TestObject _object @accessors(property=object); + ImplementedTestObject _implementedObject @accessors(property=implementedObject); +} + +- (void)setUp +{ + _object = [[TestObject alloc] init]; + _implementedObject = [[ImplementedTestObject alloc] init]; + + COUNTER = 0; +} + +- (void)_patchSelector:(SEL)theSelector +{ + var method = class_getInstanceMethod([[self implementedObject] class], theSelector), + implementation = method_getImplementation(method); + + class_addMethod([[self object] class], theSelector, implementation); +} + +- (void)testUsesCountOfKey +{ + [self _patchSelector:@selector(countOfValues)]; + + var count = [[[self object] mutableArrayValueForKey:@"values"] count]; + + [self assert:10 equals:count message:@"countOfValues should return 10"]; + [self assert:1 equals:COUNTER message:@"countOfValues should have been called once"] +} + +- (void)testObjectAtIndexUsesObjectInKeyAtIndex +{ + [self _patchSelector:@selector(objectInValuesAtIndex:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + object = [values objectAtIndex:0]; + + [self assert:0 equals:object] + [self assert:1 equals:COUNTER message:@"objectInValuesAtIndex: should have been called once"]; +} + +- (void)testObjectsAtIndexesUsesObjectInKeyAtIndex +{ + [self _patchSelector:@selector(objectInValuesAtIndex:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + objects = [values objectsAtIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)]]; + + [self assert:[0, 1] equals:objects] + [self assert:2 equals:COUNTER message:@"objectInValuesAtIndex: should have been called once"]; +} + +- (void)testObjectAtIndexUsesKeyAtIndexes +{ + [self _patchSelector:@selector(valuesAtIndexes:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + object = [values objectAtIndex:0]; + + [self assert:0 equals:object] + [self assert:1 equals:COUNTER message:@"valuesAtIndexes: should have been called once"]; +} + +- (void)testObjectsAtIndexesUsesKeyAtIndexes +{ + [self _patchSelector:@selector(valuesAtIndexes:)]; + + var values = [[self object] mutableArrayValueForKey:@"values"], + objects = [values objectsAtIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)]]; + + [self assert:[0, 1] equals:objects] + [self assert:1 equals:COUNTER message:@"valuesAtIndexes: should have been called once"]; +} + +- (void)testInsertObjectAtIndexUsesInsertKeyAtIndex +{ + [self _patchSelector:@selector(insertObject:inValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] insertObject:11 atIndex:10]; + + [self assert:11 equals:[[[self object] values] objectAtIndex:10]]; + [self assert:1 equals:COUNTER message:@"insertObject:inValuesAtIndex: should have been called once"]; +} + +- (void)testInsertObjectsAtIndexesUsesInsertKeyAtIndex +{ + [self _patchSelector:@selector(insertObject:inValuesAtIndex:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(10, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] insertObjects:[11, 12] atIndexes:indexes]; + + [self assert:[11, 12] equals:[[[self object] values] objectsAtIndexes:indexes]]; + [self assert:2 + equals:COUNTER + message:@"insertValues:atIndexes: should have been called once for each object"]; +} + +- (void)testInsertObjectAtIndexUsesInsertKeyAtIndexes +{ + [self _patchSelector:@selector(insertValues:atIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] insertObject:11 atIndex:10]; + + [self assert:11 equals:[[[self object] values] objectAtIndex:10]]; + [self assert:1 equals:COUNTER message:@"insertValues:atIndexes: should have been called once"]; +} + +- (void)testInsertObjectsAtIndexesUsesInsertKeyAtIndexes +{ + [self _patchSelector:@selector(insertValues:atIndexes:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(10, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] insertObjects:[11, 12] atIndexes:indexes]; + + [self assert:[11, 12] equals:[[[self object] values] objectsAtIndexes:indexes]]; + [self assert:1 + equals:COUNTER + message:@"insertValues:atIndexes: should have been called once for each object"]; +} + +- (void)testRemoveObjectAtIndexUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectAtIndex:0]; + + [self assert:[1, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeObjectFromValuesAtIndex: should have been called once"]; +} + +- (void)testRemoveObjectAtIndexesUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsAtIndexes:indexes]; + + [self assert:[2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:2 equals:COUNTER message:@"removeValuesAtIndex: should have been called once for each object"]; +} + +- (void)testRemoveObjectsAtIndexesUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectAtIndex:0]; + + [self assert:[1, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"removeValuesAtIndexes: should have been once for each object"]; +} + +- (void)testRemoveObjectsAtIndexesUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(3, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsAtIndexes:indexes]; + + [self assert:[0, 1, 2, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testReplaceObjectAtIndexWithObjectUsesReplaceObjectInKeyAtIndexWithObject +{ + [self _patchSelector:@selector(replaceObjectInValuesAtIndex:withObject:)]; + + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectAtIndex:0 withObject:1]; + + [self assert:[1, 1, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"replaceObjectInValuesAtIndex:withObject: should have been called once"]; +} + +- (void)testReplaceObjectsAtIndexesWithObjectsUsesReplaceObjectInKeyAtIndexWithObject +{ + [self _patchSelector:@selector(replaceObjectInValuesAtIndex:withObject:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(5, 3)]; + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectsAtIndexes:indexes withObjects:[1, 2, 3]]; + + [self assert:[0, 1, 2, 3, 4, 1, 2, 3, 8, 9] equals:[[self object] values]]; + [self assert:3 + equals:COUNTER + message:@"replaceObjectInValuesAtIndex:withObject: should have been called once"]; +} + +- (void)testReplaceObjectAtIndexWithObjectUsesReplaceKeyAtIndexesWithKeys +{ + [self _patchSelector:@selector(replaceValuesAtIndexes:withValues:)]; + + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectAtIndex:5 withObject:6]; + + [self assert:[0, 1, 2, 3, 4, 6, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"replaceObjectInValuesAtIndex:withObject: should have been called once"]; +} + +- (void)testReplaceObjectsAtIndexesWithObjectsUsesReplaceKeyAtIndexesWithKeys +{ + [self _patchSelector:@selector(replaceValuesAtIndexes:withValues:)]; + + var indexes = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(6, 2)]; + [[[self object] mutableArrayValueForKey:@"values"] replaceObjectsAtIndexes:indexes withObjects:[7, 8]]; + + [self assert:[0, 1, 2, 3, 4, 5, 7, 8, 8, 9] equals:[[self object] values]]; + [self assert:1 + equals:COUNTER + message:@"replaceObjectInValuesAtIndexes:withValues: should have been called once"]; +} + +@end + +@implementation TestObject : CPObject +{ + CPArray _values @accessors(property=values); +} + +- (id)init +{ + if (self = [super init]) + { + _values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + } + + return self; +} + +@end + +@implementation ImplementedTestObject : TestObject +{ +} + +- (int)countOfValues +{ + // CPLog.warn(@"countOfValues"); + + COUNTER += 1; + return [[self values] count]; +} + +- (id)objectInValuesAtIndex:(int)theIndex +{ + // CPLog.warn(@"objectInValuesAtIndex: %@", theIndex); + + COUNTER += 1; + return [[self values] objectAtIndex:theIndex]; +} + +- (CPArray)valuesAtIndexes:(CPIndexSet)theIndexes +{ + // CPLog.warn(@"valuesAtIndexes: %@", theIndexes); + + COUNTER += 1; + return [[self values] objectsAtIndexes:theIndexes]; +} + +- (void)insertObject:(id)theObject inValuesAtIndex:(int)theIndex +{ + // CPLog.warn(@"insertObject: %@ inValuesAtIndex: %@", theObject, theIndex); + + COUNTER += 1; + [[self values] insertObject:theObject atIndex:theIndex]; +} + +- (void)insertValues:(CPArray)theObjects atIndexes:(CPIndexSet)theIndexes +{ + // CPLog.warn(@"insertValues: %@ atIndexes: %@", theObjects, theIndexes); + + COUNTER += 1; + [[self values] insertObjects:theObjects atIndexes:theIndexes]; +} + +- (void)removeObjectFromValuesAtIndex:(int)theIndex +{ + // CPLog.warn(@"removeObjectFromValuesAtIndex: %@", theIndex); + + COUNTER += 1; + [[self values] removeObjectAtIndex:theIndex]; +} + +- (void)removeValuesAtIndexes:(CPIndexSet)theIndexes +{ + // CPLog.warn(@"removeValuesAtIndexes: %@", theIndexes); + + COUNTER += 1; + [[self values] removeObjectsAtIndexes:theIndexes]; +} + +- (void)replaceObjectInValuesAtIndex:(int)theIndex withObject:(id)theObject +{ + // CPLog.warn(@"replaceObjectInValuesAtIndex: %@ withObject: %@", theIndex, theObject); + + COUNTER += 1; + [[self values] replaceObjectAtIndex:theIndex withObject:theObject]; +} + +- (void)replaceValuesAtIndexes:(CPIndexSet)theIndexes withValues:(id)theObjects +{ + // CPLog.warn(@"replaceValuesAtIndexes: %@ withValues: %@", theIndexes, theObjects); + + COUNTER += 1; + [[self values] replaceObjectsAtIndexes:theIndexes withObjects:theObjects]; +} + +@end \ No newline at end of file From 03d1bb8bce9e742a5956c4f19500e5308316ebc6 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Thu, 15 Sep 2011 17:09:15 -0700 Subject: [PATCH 14/15] Added missing statement separator, concatenated var block, fixed symlink deletion/creation sometimes failing. --- Tools/xcodecapp-cocoa/Jakefile | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Tools/xcodecapp-cocoa/Jakefile b/Tools/xcodecapp-cocoa/Jakefile index efd61bf5b..18becd73d 100644 --- a/Tools/xcodecapp-cocoa/Jakefile +++ b/Tools/xcodecapp-cocoa/Jakefile @@ -1,10 +1,10 @@ require("../../common.jake"); -var OS = require("os"); -var task = require("jake").task -var stream = require("narwhal/term").stream; -var applicationName = "xcodecapp-cocoa.app"; +var OS = require("os"), + task = require("jake").task, + stream = require("narwhal/term").stream, + applicationName = "xcodecapp-cocoa.app"; task ("build", function() { @@ -22,9 +22,7 @@ task ("build", function() cp_r(FILE.join("build", "Release", "xcodecapp-cocoa.app"), supportPath); FILE.chmod(FILE.join(supportPath, "Contents", "MacOS", "xcodecapp-cocoa"), 0755); - if (FILE.exists(installPath)) - FILE.remove(installPath); - FILE.symlink(supportPath, installPath); + OS.system(["ln", "-sf", supportPath, installPath]); } else { From e99e2660e9946c67a233bb45d6a0d4055cd4fb8c Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Fri, 16 Sep 2011 11:43:42 +0200 Subject: [PATCH 15/15] more fixes and tests for _CPKVCArray --- Foundation/CPArray+KVO.j | 34 +++++++++--- Tests/Foundation/CPKVCArrayTest.j | 88 +++++++++++++++++++++++++++++-- 2 files changed, 112 insertions(+), 10 deletions(-) diff --git a/Foundation/CPArray+KVO.j b/Foundation/CPArray+KVO.j index 8000d2076..d58666ff2 100644 --- a/Foundation/CPArray+KVO.j +++ b/Foundation/CPArray+KVO.j @@ -303,6 +303,32 @@ [self removeObject:anObject inRange:CPMakeRange(0, [self count])]; } +- (void)removeObjectsInArray:(CPArray)theObjects +{ + if (_removeMany) + { + var indexes = [CPIndexSet indexSet], + index = [theObjects count]; + + while (index--) + [indexes addIndex:[self indexOfObject:[theObjects objectAtIndex:index]]]; + + _removeMany(_proxyObject, _removeManySEL, indexes); + } + else if (_remove) + { + var index = [theObjects count]; + while (index--) + _remove(_proxyObject, _removeSEL, [self indexOfObject:[theObjects objectAtIndex:index]]); + } + else + { + var target = [[self _representedObject] copy]; + [target removeObjectsInArray:theObjects]; + [self _setRepresentedObject:target]; + } +} + - (void)removeObject:(id)theObject inRange:(CPRange)theRange { if (_remove) @@ -326,13 +352,7 @@ - (void)removeLastObject { - if (_remove) - return _remove(_proxyObject, _removeSEL, [self count] - 1); - - var target = [[self _representedObject] copy]; - - [target removeLastObject]; - [self _setRepresentedObject:target]; + [self removeObjectsAtIndexes:[CPIndexSet indexSetWithIndex:[self count] - 1]]; } - (void)removeObjectAtIndex:(unsigned)anIndex diff --git a/Tests/Foundation/CPKVCArrayTest.j b/Tests/Foundation/CPKVCArrayTest.j index f29bd7d91..52f087856 100644 --- a/Tests/Foundation/CPKVCArrayTest.j +++ b/Tests/Foundation/CPKVCArrayTest.j @@ -16,6 +16,29 @@ var COUNTER; - (void)_patchSelector:(SEL)theSelector { + var method_dtable = [[self object] class].method_dtable, + method_list = [[self object] class].method_list, + selectorsToRemove = [@selector(countOfValues), @selector(objectInValuesAtIndex), + @selector(objectInValuesAtIndex:), @selector(valuesAtIndexes:), + @selector(insertObject:inValuesAtIndex:), @selector(insertValues:atIndexes:), + @selector(removeObjectFromValuesAtIndex:), @selector(removeValuesAtIndexes:), + @selector(removeObjectFromValuesAtIndex:), + @selector(replaceObjectInValuesAtIndex:withObject:), + @selector(replaceValuesAtIndexes:withValues:)], + selectorIndex = [selectorsToRemove count]; + + while (selectorIndex--) + { + var selector = [selectorsToRemove objectAtIndex:selectorIndex], + implementation = method_dtable[selector]; + + if (!implementation) + continue; + + delete method_dtable[selector] + [method_list removeObject:implementation]; + } + var method = class_getInstanceMethod([[self implementedObject] class], theSelector), implementation = method_getImplementation(method); @@ -122,7 +145,7 @@ var COUNTER; message:@"insertValues:atIndexes: should have been called once for each object"]; } -- (void)testRemoveObjectAtIndexUsesRemoveKeyAtIndex +- (void)testRemoveObjectAtIndexUsesRemoveObjectFromKeyAtIndex { [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; @@ -132,7 +155,7 @@ var COUNTER; [self assert:1 equals:COUNTER message:@"removeObjectFromValuesAtIndex: should have been called once"]; } -- (void)testRemoveObjectAtIndexesUsesRemoveKeyAtIndex +- (void)testRemoveObjectAtIndexesUsesRemoveObjectFromKeyAtIndex { [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; @@ -142,7 +165,6 @@ var COUNTER; [self assert:[2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; [self assert:2 equals:COUNTER message:@"removeValuesAtIndex: should have been called once for each object"]; } - - (void)testRemoveObjectsAtIndexesUsesRemoveKeyAtIndex { [self _patchSelector:@selector(removeValuesAtIndexes:)]; @@ -166,6 +188,66 @@ var COUNTER; [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; } +- (void)testRemoveObjectUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObject:1]; + + [self assert:[0, 2, 3, 4, 5, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:"removeObjectFromValuesAtIndex: should have been called once"] +} + +- (void)testeRemoveObjectUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObject:5]; + + [self assert:[0, 1, 2, 3, 4, 6, 7, 8, 9] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testRemoveObjectsInArrayUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsInArray:[3, 6]]; + + [self assert:[0, 1, 2, 4, 5, 7, 8, 9] equals:[[self object] values]]; + [self assert:2 equals:COUNTER message:"removeObjectFromValuesAtIndex: should have been called once"] +} + +- (void)testRemoveObjectsInArrayUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeObjectsInArray:[0, 9]]; + + [self assert:[1, 2, 3, 4, 5, 6, 7, 8] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + +- (void)testRemoveLastObjectUsesRemoveKeyAtIndex +{ + [self _patchSelector:@selector(removeObjectFromValuesAtIndex:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeLastObject]; + + [self assert:[0, 1, 2, 3, 4, 5, 6, 7, 8] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:"removeObjectFromValuesAtIndex: should have been called once"] +} + +- (void)testRemoveLastObjectUsesRemoveKeyAtIndexes +{ + [self _patchSelector:@selector(removeValuesAtIndexes:)]; + + [[[self object] mutableArrayValueForKey:@"values"] removeLastObject]; + + [self assert:[0, 1, 2, 3, 4, 5, 6, 7, 8] equals:[[self object] values]]; + [self assert:1 equals:COUNTER message:@"removeValuesAtIndexes: should have been called once"]; +} + - (void)testReplaceObjectAtIndexWithObjectUsesReplaceObjectInKeyAtIndexWithObject { [self _patchSelector:@selector(replaceObjectInValuesAtIndex:withObject:)];