From be10bcf27a958d9c9b8ae1428e09d66097eac926 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Fri, 2 Sep 2011 12:42:09 +0200 Subject: [PATCH 01/27] Fix CPPlatformWindow's title bug if setTitle: is called on a CPWindow with the primaryPlatformWindow as platformWindow, the main page's title is changed. This patch prevent changing the primaryPlatformWindow's title. This is not optimal, but this is better than changing the title at each window setTitle: call --- AppKit/Platform/CPPlatformWindow.j | 3 ++- AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index 2d47ce96e..90ee33215 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -264,7 +264,8 @@ var PrimaryPlatformWindow = NULL; _title = aTitle; #if PLATFORM(DOM) - if (_DOMWindow && _DOMWindow.document) + if (_DOMWindow && _DOMWindow.document + && (self != [CPPlatformWindow primaryPlatformWindow])) _DOMWindow.document.title = _title; #endif } diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 66b847748..58ab7269e 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -541,7 +541,8 @@ var ModifierKeyCodes = [ // FIXME: cpSetFrame? _DOMWindow.document.write(""); _DOMWindow.document.close(); - _DOMWindow.document.title = _title; + if (self != [CPPlatformWindow primaryPlatformWindow]) + _DOMWindow.document.title = _title; if (![CPPlatform isBrowser]) { From afa691376e2d4a9a41a3538dd422aa3a2b5ab634 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Fri, 2 Sep 2011 14:00:49 +0200 Subject: [PATCH 02/27] fix unable to change mainWindow's title --- AppKit/CPWindow/CPWindow.j | 4 ++-- AppKit/Platform/CPPlatformWindow.j | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 2bed398b6..ba3c39732 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -480,7 +480,7 @@ CPTexturedBackgroundWindowMask [self close]; _platformWindow = aPlatformWindow; - [_platformWindow setTitle:_title]; + [_platformWindow _setTitle:_title window:self]; if (wasVisible) [self orderFront:self]; @@ -1360,7 +1360,7 @@ CPTexturedBackgroundWindowMask _title = aTitle; [_windowView setTitle:aTitle]; - [_platformWindow setTitle:_title]; + [_platformWindow _setTitle:_title window:self]; [self _synchronizeMenuBarTitleWithWindowTitle]; } diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index 90ee33215..4526cbd19 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -259,13 +259,12 @@ var PrimaryPlatformWindow = NULL; return [CPPlatform isBrowser]; } -- (void)setTitle:(CPString)aTitle +- (void)_setTitle:(CPString)aTitle window:(CPWindow)aWindow { _title = aTitle; #if PLATFORM(DOM) - if (_DOMWindow && _DOMWindow.document - && (self != [CPPlatformWindow primaryPlatformWindow])) + if (_DOMWindow && _DOMWindow.document && (aWindow === [CPApp mainWindow])) _DOMWindow.document.title = _title; #endif } From 38f7ea00c2086b464bc9ac3b5d5c49cb9ec93c47 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 00:43:32 +0200 Subject: [PATCH 03/27] 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 04/27] 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 05/27] 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 06/27] 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 07/27] 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 08/27] 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 09/27] 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 10/27] 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 11/27] 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 90d069df2bad6c4dcd55679ccab8cc62808da623 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Thu, 8 Sep 2011 17:02:15 +0100 Subject: [PATCH 12/27] Refs #1343. Remove now obsolete README.md. Everything in the README has been fixed except 3 and 4. 4 is outside of the issue scope and 3 works as intended (nearly). The array controller does not have `setAvoidsEmptySelection:NO` so an empty selection should not be possible unless there are no items. --- Tests/Manual/Bindings/README.md | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 Tests/Manual/Bindings/README.md diff --git a/Tests/Manual/Bindings/README.md b/Tests/Manual/Bindings/README.md deleted file mode 100644 index 0c9922fd9..000000000 --- a/Tests/Manual/Bindings/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Run this application with the current master, and note the following bugs: - -- When you click on any item, there are two selection change notifications instead of one. - -- If you compare the order of the notifications with Cocoa, they are slightly different. - -- The right hand table is configured to allow an empty selection. If you click in the -empty area below the names, there is an empty selection notification, but then the -the current selection changes to the first item and generates another notification. - -- If you select multiple items on the left, there is an error. This is a bug that will -have to be fixed in a later commit. - -If you apply the changes in these commits, the first three bugs are fixed. From 8dab47f4da942e5541743f18c71998a930ea4fa1 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Thu, 8 Sep 2011 18:12:32 +0200 Subject: [PATCH 13/27] 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 043df711857d850e59a8d61f6296da6a89df5df0 Mon Sep 17 00:00:00 2001 From: Samir Gartner Date: Thu, 8 Sep 2011 22:56:52 -0500 Subject: [PATCH 14/27] Enabled tokenField:shouldAddObjects:atIndex delegate method and used on _autocompleteWithDOMEvent method to have some control over tokens. Not sure why wasn't enabled, it was very few code. Maybe no one needed it 'til now --- AppKit/CPTokenField.j | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 61481d970..ac35a1dd6 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -171,6 +171,7 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", - (void)_autocompleteWithDOMEvent:(JSObject)DOMEvent { + var index = 0; if (!_cachedCompletions || ![self hasThemeState:CPThemeStateAutoCompleting]) return; @@ -205,8 +206,11 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // Explicitly remove the last object because the array contains strings and removeObject uses isEqual to compare objects if (shouldRemoveLastObject) [objectValue removeObjectAtIndex:_selectedRange.location]; - - [objectValue insertObject:token atIndex:_selectedRange.location]; + + //confirm with the delegate the token inclusion + if ([[self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index] count]) + [objectValue insertObject:token atIndex:_selectedRange.location]; + var location = _selectedRange.location; [self setObjectValue:objectValue]; _selectedRange = CPMakeRange(location + 1, 0); @@ -1153,7 +1157,19 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // // return an array of represented objects you want to add. // // If you want to reject the add, return an empty array. // // returning nil will cause an error. -// - (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)tokens atIndex:(NSUInteger)index; +- (CPArray)tokenField:(CPTokenField )tokenField shouldAddObjects:(CPArray)tokens atIndex:(NSUInteger)index + { + if ([[self delegate] respondsToSelector:@selector(tokenField:shouldAddObjects:atIndex:)]) + { + var approvedObjects = [[self delegate] tokenField:tokenField shouldAddObjects:tokens atIndex:index]; + if (approvedObjects !== nil) + { + return approvedObjects; + } + } + + return tokens; + } // // // If you return nil or don't implement these delegate methods, we will assume // // editing string = display string = represented object From 662b1ec69684c39af8e6fe1908e6a28224f32da2 Mon Sep 17 00:00:00 2001 From: Samir Gartner Date: Fri, 9 Sep 2011 12:48:18 -0500 Subject: [PATCH 15/27] Submitted the right CPTokenField file, was missing the part to use the delegate approved tokens. Still lacks a way to put the cursor after the last token (if the delegate returns more than one token) --- AppKit/CPTokenField.j | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index ac35a1dd6..481ca298d 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -208,8 +208,14 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", [objectValue removeObjectAtIndex:_selectedRange.location]; //confirm with the delegate the token inclusion - if ([[self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index] count]) - [objectValue insertObject:token atIndex:_selectedRange.location]; + delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index]; + if (delegateApprovedObjects) + { + for(var i = 0; i < [delegateApprovedObjects count]; i++) + { + [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; + } + } var location = _selectedRange.location; [self setObjectValue:objectValue]; From c6403baa04efb2e6f7906097101d01ada3698047 Mon Sep 17 00:00:00 2001 From: Samir Gartner Date: Fri, 9 Sep 2011 13:28:37 -0500 Subject: [PATCH 16/27] Fixed cursor position issue in a little escapade...guess that's all for now folks --- AppKit/CPTokenField.j | 1 + 1 file changed, 1 insertion(+) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 481ca298d..c5eed96ed 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -215,6 +215,7 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", { [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; } + _selectedRange.location += [delegateApprovedObjects count]; } var location = _selectedRange.location; From e5284e9b43a32838016c94fd29ffb7a06b921d96 Mon Sep 17 00:00:00 2001 From: Samir Gartner Date: Fri, 9 Sep 2011 22:31:17 -0500 Subject: [PATCH 17/27] Fixed some possible error of my part where selectedRange is moved beyond bounds --- AppKit/CPTokenField.j | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index c5eed96ed..bd4222449 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -214,13 +214,17 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", for(var i = 0; i < [delegateApprovedObjects count]; i++) { [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; - } - _selectedRange.location += [delegateApprovedObjects count]; + } } var location = _selectedRange.location; + var delegateApprovedObjectsCount = [delegateApprovedObjects count]; [self setObjectValue:objectValue]; - _selectedRange = CPMakeRange(location + 1, 0); + //this part puts the cursor after the last token + if(delegateApprovedObjectsCount > 1) + _selectedRange = CPMakeRange(location + delegateApprovedObjectsCount - 1, 0); + else + _selectedRange = CPMakeRange(location + 1, 0); [self _inputElement].value = @""; [self setNeedsLayout]; @@ -1148,6 +1152,7 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // // If you return nil or do not implement this method, then representedObject is displayed as the string. - (CPString)tokenField:(CPTokenField)tokenField displayStringForRepresentedObject:(id)representedObject { + if ([[self delegate] respondsToSelector:@selector(tokenField:displayStringForRepresentedObject:)]) { var stringForRepresentedObject = [[self delegate] tokenField:tokenField displayStringForRepresentedObject:representedObject]; @@ -1164,7 +1169,7 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // // return an array of represented objects you want to add. // // If you want to reject the add, return an empty array. // // returning nil will cause an error. -- (CPArray)tokenField:(CPTokenField )tokenField shouldAddObjects:(CPArray)tokens atIndex:(NSUInteger)index +- (CPArray)tokenField:(CPTokenField )tokenField shouldAddObjects:(CPArray)tokens atIndex:(int)index { if ([[self delegate] respondsToSelector:@selector(tokenField:shouldAddObjects:atIndex:)]) { From 67b2671dad5398eda845a9b3d2e9542e3182f07d Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 15 Sep 2011 16:39:24 +0200 Subject: [PATCH 18/27] 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 19/27] 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 20/27] 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 21/27] 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 22/27] 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:)]; From 85f8ca9241c9cdb2a86e62d60cbb41390d530180 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 16 Sep 2011 19:29:53 +0100 Subject: [PATCH 23/27] Refs #1360. Format code. --- AppKit/CPTokenField.j | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index bd4222449..0f5c3e843 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -206,23 +206,23 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // Explicitly remove the last object because the array contains strings and removeObject uses isEqual to compare objects if (shouldRemoveLastObject) [objectValue removeObjectAtIndex:_selectedRange.location]; - - //confirm with the delegate the token inclusion + + // Give the delegate a chance to confirm, replace or add to the list of tokens being added. delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index]; if (delegateApprovedObjects) { - for(var i = 0; i < [delegateApprovedObjects count]; i++) + for (var i = 0; i < [delegateApprovedObjects count]; i++) { - [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; - } + [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; + } } - - var location = _selectedRange.location; - var delegateApprovedObjectsCount = [delegateApprovedObjects count]; + + var location = _selectedRange.location, + delegateApprovedObjectsCount = [delegateApprovedObjects count]; [self setObjectValue:objectValue]; //this part puts the cursor after the last token - if(delegateApprovedObjectsCount > 1) - _selectedRange = CPMakeRange(location + delegateApprovedObjectsCount - 1, 0); + if (delegateApprovedObjectsCount > 1) + _selectedRange = CPMakeRange(location + delegateApprovedObjectsCount - 1, 0); else _selectedRange = CPMakeRange(location + 1, 0); @@ -1357,4 +1357,4 @@ var CPTokenFieldTokenizingCharacterSetKey = "CPTokenFieldTokenizingCharacterSe [aCoder encodeDouble:_completionDelay forKey:CPTokenFieldCompletionDelayKey]; } -@end \ No newline at end of file +@end From 2815d462be3fd706ea76523fefa251ece8548d0a Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 16 Sep 2011 20:51:45 +0100 Subject: [PATCH 24/27] Refs #1360. Test for CPTokenField tokenField:shouldAddObjects:atIndex:. --- Tests/Manual/CPTokenFieldTest/AppController.j | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Tests/Manual/CPTokenFieldTest/AppController.j b/Tests/Manual/CPTokenFieldTest/AppController.j index e1ed23d11..ea8fc7038 100644 --- a/Tests/Manual/CPTokenFieldTest/AppController.j +++ b/Tests/Manual/CPTokenFieldTest/AppController.j @@ -15,6 +15,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad CPTokenField tokenFieldD; CPArray allPersons; + CPButton manipulateTokenInsertionButton; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification @@ -53,6 +54,10 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [contentView addSubview:tokenFieldB]; + manipulateTokenInsertionButton = [CPCheckBox checkBoxWithTitle:"Token transformations"]; + [manipulateTokenInsertionButton setFrame:CGRectMake(525, 110, 200, 50)]; + [contentView addSubview:manipulateTokenInsertionButton]; + var tokenFieldC = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 170, 500, 30)], labelC = [[CPTextField alloc] initWithFrame:CGRectMake(15, 150, 500, 24)]; @@ -148,6 +153,25 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad CPLog.info("tokenFieldAction: " + sender); } +- (CPArray)tokenField:tokenField shouldAddObjects:tokens atIndex:index +{ + CPLog.info("tokenField: " + tokenField + " shouldAddObjects: " + tokens + " atIndex: " + index); + + // Texas -> Utah, Michigan -> Michigan & Arkansas, Washington -> nil + + if ([manipulateTokenInsertionButton intValue]) + { + if (tokens[0] == "Texas") + return ["Utah"]; + else if (tokens[0] == "Michigan") + return ["Michigan", "Arkansas"]; + else if (tokens[0] == "Washington") + return []; + } + + return tokens; +} + @end // A sample of a custom Object From a8fae51ea8e59aee5b9752d0ef96e3c6884da19d Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 16 Sep 2011 21:46:20 +0100 Subject: [PATCH 25/27] Refs #1360. Cursor movement fixes, optimisations. Don't move the cursor forward if no token was inserted. Only count new tokens once. --- AppKit/CPTokenField.j | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 0f5c3e843..5828f5626 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -208,23 +208,24 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", [objectValue removeObjectAtIndex:_selectedRange.location]; // Give the delegate a chance to confirm, replace or add to the list of tokens being added. - delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index]; + var delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index], + delegateApprovedObjectsCount = [delegateApprovedObjects count]; if (delegateApprovedObjects) { - for (var i = 0; i < [delegateApprovedObjects count]; i++) + for (var i = 0; i < delegateApprovedObjectsCount; i++) { [objectValue insertObject:[delegateApprovedObjects objectAtIndex:i] atIndex:_selectedRange.location + i]; } } - var location = _selectedRange.location, - delegateApprovedObjectsCount = [delegateApprovedObjects count]; + // Put the cursor after the last inserted token. + var location = _selectedRange.location; + [self setObjectValue:objectValue]; - //this part puts the cursor after the last token - if (delegateApprovedObjectsCount > 1) - _selectedRange = CPMakeRange(location + delegateApprovedObjectsCount - 1, 0); - else - _selectedRange = CPMakeRange(location + 1, 0); + + if (delegateApprovedObjectsCount) + location += delegateApprovedObjectsCount; + _selectedRange = CPMakeRange(location, 0); [self _inputElement].value = @""; [self setNeedsLayout]; @@ -1169,19 +1170,19 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // // return an array of represented objects you want to add. // // If you want to reject the add, return an empty array. // // returning nil will cause an error. -- (CPArray)tokenField:(CPTokenField )tokenField shouldAddObjects:(CPArray)tokens atIndex:(int)index +- (CPArray)tokenField:(CPTokenField)tokenField shouldAddObjects:(CPArray)tokens atIndex:(int)index +{ + var delegate = [self delegate]; + if ([delegate respondsToSelector:@selector(tokenField:shouldAddObjects:atIndex:)]) { - if ([[self delegate] respondsToSelector:@selector(tokenField:shouldAddObjects:atIndex:)]) - { - var approvedObjects = [[self delegate] tokenField:tokenField shouldAddObjects:tokens atIndex:index]; + var approvedObjects = [delegate tokenField:tokenField shouldAddObjects:tokens atIndex:index]; if (approvedObjects !== nil) - { return approvedObjects; - } } return tokens; - } +} + // // // If you return nil or don't implement these delegate methods, we will assume // // editing string = display string = represented object From 48157db973fe84a6451352d9c8bceeb6ab5c358e Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Fri, 16 Sep 2011 21:50:58 +0100 Subject: [PATCH 26/27] Refs #1360. Fixed: index was always 0 in CPTokenField tokenField:shouldAddObjects:atIndex: delegate method. --- AppKit/CPTokenField.j | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 5828f5626..84ee318da 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -171,7 +171,6 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", - (void)_autocompleteWithDOMEvent:(JSObject)DOMEvent { - var index = 0; if (!_cachedCompletions || ![self hasThemeState:CPThemeStateAutoCompleting]) return; @@ -208,7 +207,7 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", [objectValue removeObjectAtIndex:_selectedRange.location]; // Give the delegate a chance to confirm, replace or add to the list of tokens being added. - var delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:index], + var delegateApprovedObjects = [self tokenField:self shouldAddObjects:[CPArray arrayWithObject:token] atIndex:_selectedRange.location], delegateApprovedObjectsCount = [delegateApprovedObjects count]; if (delegateApprovedObjects) { @@ -1153,7 +1152,6 @@ var CPThemeStateAutoCompleting = @"CPThemeStateAutoCompleting", // // If you return nil or do not implement this method, then representedObject is displayed as the string. - (CPString)tokenField:(CPTokenField)tokenField displayStringForRepresentedObject:(id)representedObject { - if ([[self delegate] respondsToSelector:@selector(tokenField:displayStringForRepresentedObject:)]) { var stringForRepresentedObject = [[self delegate] tokenField:tokenField displayStringForRepresentedObject:representedObject]; From 4aec3f74668a578b89bff87e0fc0345fd79b0a01 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sat, 17 Sep 2011 11:04:22 +0100 Subject: [PATCH 27/27] Refs #1355. Manual window title test. In the PlatformWindows test, change the window title both when theWindow is a non platform window and when it is a platform window to verify that the browser window title changes only when it should. --- Tests/Manual/PlatformWindows/AppController.j | 48 ++++++++++---------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/Tests/Manual/PlatformWindows/AppController.j b/Tests/Manual/PlatformWindows/AppController.j index 9dd9883d4..5025379d5 100644 --- a/Tests/Manual/PlatformWindows/AppController.j +++ b/Tests/Manual/PlatformWindows/AppController.j @@ -37,44 +37,46 @@ platformWindow = [[CPPlatformWindow alloc] init]; -// [platformWindow orderFront:self];//console.log(CPStringFromRect([theWindow contentRectForFrameRect:[theWindow frame]])); + // [platformWindow orderFront:self];//console.log(CPStringFromRect([theWindow contentRectForFrameRect:[theWindow frame]])); [platformWindow setContentRect:[theWindow contentRectForFrameRect:[theWindow frame]]]; - // [theWindow setTitle:@"My Custom Title"]; - //[platformWindow orderFront:self]; - // seriously, this test file is dirty :) var slider = [[theWindow contentView] subviews][0]; [slider setTarget:self]; [slider setAction:@selector(randomTitle:)]; [slider setContinuous:NO]; -window.setTimeout(function(){ - [theWindow orderOut:self]; - [theWindow setPlatformWindow:platformWindow]; - [theWindow orderFront:self]; - [theWindow setFullBridge:YES]; - var button = [[theWindow contentView] subviews][2]; + [theWindow setTitle:"Initial title (pop out pending)"]; + window.setTimeout(function() + { + [theWindow orderOut:self]; + [theWindow setPlatformWindow:platformWindow]; + [theWindow orderFront:self]; + [theWindow setFullBridge:YES]; + var button = [[theWindow contentView] subviews][2]; - [button setTarget:self]; - [button setAction:@selector(close)]; + [button setTarget:self]; + [button setAction:@selector(close)]; + [theWindow setTitle:"Title after pop out (red box pending)"]; - window.setTimeout(function(){ - var view = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; - [view setBackgroundColor:[CPColor redColor]]; - - [[theWindow contentView] addSubview:view];},1000); - - }, 1000); - //window.setTimeout(function() { [platformWindow orderOut:self]; [platformWindow orderFront:self]; }, 2000); + window.setTimeout(function() + { + var view = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)]; + [view setBackgroundColor:[CPColor redColor]]; + [[theWindow contentView] addSubview:view]; + [theWindow setTitle:"Title in final stage"]; + }, 1000); + }, 2000); } - (void)close { [[theWindow platformWindow] orderOut:self]; - window.setTimeout(function(){ - [[theWindow platformWindow] orderFront:self];}, 1000); + window.setTimeout(function() + { + [[theWindow platformWindow] orderFront:self]; + }, 1000); } - (void)another:(id)aSender @@ -84,7 +86,7 @@ window.setTimeout(function(){ - (IBAction)randomTitle:(id)aSender { - [theWindow setTitle:@"Window random number " + Math.random(1000)] + [theWindow setTitle:@"Window random number " + Math.random(1000)]; } @end