You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
(23) |
Apr
(254) |
May
(252) |
Jun
(209) |
Jul
(198) |
Aug
(192) |
Sep
(207) |
Oct
(120) |
Nov
(179) |
Dec
(52) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(48) |
Feb
(69) |
Mar
(129) |
Apr
(250) |
May
(113) |
Jun
(177) |
Jul
(228) |
Aug
(155) |
Sep
(218) |
Oct
(185) |
Nov
(109) |
Dec
(88) |
2009 |
Jan
(83) |
Feb
(39) |
Mar
(70) |
Apr
(47) |
May
(48) |
Jun
(67) |
Jul
(61) |
Aug
(97) |
Sep
(221) |
Oct
(141) |
Nov
(70) |
Dec
(61) |
2010 |
Jan
(45) |
Feb
(76) |
Mar
(178) |
Apr
(106) |
May
(57) |
Jun
(32) |
Jul
(64) |
Aug
(98) |
Sep
(96) |
Oct
(19) |
Nov
(34) |
Dec
(117) |
2011 |
Jan
(55) |
Feb
(48) |
Mar
(64) |
Apr
(21) |
May
(39) |
Jun
(53) |
Jul
(99) |
Aug
(56) |
Sep
(39) |
Oct
(26) |
Nov
(19) |
Dec
(69) |
2012 |
Jan
(17) |
Feb
(40) |
Mar
(17) |
Apr
|
May
(2) |
Jun
(8) |
Jul
(2) |
Aug
(10) |
Sep
(10) |
Oct
(38) |
Nov
(48) |
Dec
(70) |
2013 |
Jan
(43) |
Feb
(47) |
Mar
(39) |
Apr
(37) |
May
(25) |
Jun
(6) |
Jul
(20) |
Aug
(49) |
Sep
(33) |
Oct
(34) |
Nov
(75) |
Dec
(6) |
2014 |
Jan
(32) |
Feb
(10) |
Mar
(17) |
Apr
|
May
|
Jun
(26) |
Jul
(5) |
Aug
|
Sep
(4) |
Oct
(23) |
Nov
(80) |
Dec
(48) |
2015 |
Jan
(80) |
Feb
(50) |
Mar
(58) |
Apr
(20) |
May
(11) |
Jun
(16) |
Jul
(24) |
Aug
(27) |
Sep
(56) |
Oct
(30) |
Nov
(16) |
Dec
(6) |
2016 |
Jan
(31) |
Feb
(14) |
Mar
(23) |
Apr
(17) |
May
(40) |
Jun
(12) |
Jul
(17) |
Aug
(9) |
Sep
(32) |
Oct
(36) |
Nov
(23) |
Dec
(9) |
2017 |
Jan
(37) |
Feb
(23) |
Mar
(65) |
Apr
(22) |
May
(6) |
Jun
(3) |
Jul
|
Aug
|
Sep
(3) |
Oct
(22) |
Nov
(63) |
Dec
(71) |
2018 |
Jan
(83) |
Feb
(21) |
Mar
(35) |
Apr
(44) |
May
(14) |
Jun
(12) |
Jul
(8) |
Aug
(18) |
Sep
(10) |
Oct
(145) |
Nov
(144) |
Dec
(76) |
2019 |
Jan
(18) |
Feb
(28) |
Mar
(5) |
Apr
(208) |
May
(291) |
Jun
(158) |
Jul
(27) |
Aug
(8) |
Sep
(10) |
Oct
(83) |
Nov
(41) |
Dec
(31) |
2020 |
Jan
(16) |
Feb
(46) |
Mar
(100) |
Apr
(78) |
May
(69) |
Jun
(71) |
Jul
(28) |
Aug
(131) |
Sep
(176) |
Oct
(89) |
Nov
(147) |
Dec
(19) |
2021 |
Jan
(19) |
Feb
(25) |
Mar
(91) |
Apr
(98) |
May
(14) |
Jun
(44) |
Jul
(8) |
Aug
(3) |
Sep
(38) |
Oct
(57) |
Nov
(97) |
Dec
(74) |
2022 |
Jan
(89) |
Feb
(47) |
Mar
(15) |
Apr
(50) |
May
(54) |
Jun
(56) |
Jul
(80) |
Aug
(12) |
Sep
(11) |
Oct
(60) |
Nov
(48) |
Dec
(4) |
2023 |
Jan
(75) |
Feb
(49) |
Mar
(84) |
Apr
(24) |
May
(13) |
Jun
(74) |
Jul
(32) |
Aug
(66) |
Sep
(50) |
Oct
(38) |
Nov
(105) |
Dec
(181) |
2024 |
Jan
(21) |
Feb
(49) |
Mar
(77) |
Apr
(84) |
May
(20) |
Jun
(71) |
Jul
(53) |
Aug
(33) |
Sep
(54) |
Oct
(124) |
Nov
(151) |
Dec
(73) |
2025 |
Jan
(61) |
Feb
(17) |
Mar
(136) |
Apr
(72) |
May
(200) |
Jun
(238) |
Jul
(91) |
Aug
(8) |
Sep
|
Oct
|
Nov
|
Dec
|
From: <ho...@us...> - 2007-05-30 11:59:30
|
Revision: 2182 http://skim-app.svn.sourceforge.net/skim-app/?rev=2182&view=rev Author: hofman Date: 2007-05-30 04:59:23 -0700 (Wed, 30 May 2007) Log Message: ----------- Tag for release Added Paths: ----------- REL_0_4_1/ Copied: REL_0_4_1 (from rev 2181, trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-30 11:59:04
|
Revision: 2181 http://skim-app.svn.sourceforge.net/skim-app/?rev=2181&view=rev Author: hofman Date: 2007-05-30 04:59:02 -0700 (Wed, 30 May 2007) Log Message: ----------- Update version number for bug-fix release. Modified Paths: -------------- trunk/Dutch.lproj/InfoPlist.strings trunk/Dutch.lproj/Skim Help/version.texi trunk/English.lproj/InfoPlist.strings trunk/English.lproj/Skim Help/version.texi trunk/Info.plist trunk/Italian.lproj/InfoPlist.strings trunk/Italian.lproj/Skim Help/version.texi Modified: trunk/Dutch.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/Dutch.lproj/Skim Help/version.texi =================================================================== --- trunk/Dutch.lproj/Skim Help/version.texi 2007-05-30 11:55:59 UTC (rev 2180) +++ trunk/Dutch.lproj/Skim Help/version.texi 2007-05-30 11:59:02 UTC (rev 2181) @@ -1 +1 @@ -@set VERSION 0.4 +@set VERSION 0.4.1 \ No newline at end of file Modified: trunk/English.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/English.lproj/Skim Help/version.texi =================================================================== --- trunk/English.lproj/Skim Help/version.texi 2007-05-30 11:55:59 UTC (rev 2180) +++ trunk/English.lproj/Skim Help/version.texi 2007-05-30 11:59:02 UTC (rev 2181) @@ -1 +1 @@ -@set VERSION 0.4 +@set VERSION 0.4.1 Modified: trunk/Info.plist =================================================================== --- trunk/Info.plist 2007-05-30 11:55:59 UTC (rev 2180) +++ trunk/Info.plist 2007-05-30 11:59:02 UTC (rev 2181) @@ -286,11 +286,11 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>0.4</string> + <string>0.4.1</string> <key>CFBundleSignature</key> <string>SKIM</string> <key>CFBundleVersion</key> - <string>v4</string> + <string>v5</string> <key>LSMinimumSystemVersion</key> <string>10.4.0</string> <key>NSAppleScriptEnabled</key> Modified: trunk/Italian.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/Italian.lproj/Skim Help/version.texi =================================================================== --- trunk/Italian.lproj/Skim Help/version.texi 2007-05-30 11:55:59 UTC (rev 2180) +++ trunk/Italian.lproj/Skim Help/version.texi 2007-05-30 11:59:02 UTC (rev 2181) @@ -1 +1 @@ -@set VERSION 0.4 +@set VERSION 0.4.1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-30 11:56:01
|
Revision: 2180 http://skim-app.svn.sourceforge.net/skim-app/?rev=2180&view=rev Author: hofman Date: 2007-05-30 04:55:59 -0700 (Wed, 30 May 2007) Log Message: ----------- Update release notes. Modified Paths: -------------- trunk/ReleaseNotes.rtf Modified: trunk/ReleaseNotes.rtf =================================================================== --- trunk/ReleaseNotes.rtf 2007-05-30 11:52:31 UTC (rev 2179) +++ trunk/ReleaseNotes.rtf 2007-05-30 11:55:59 UTC (rev 2180) @@ -82,14 +82,26 @@ {\list\listtemplateid78\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid78} {\list\listtemplateid79\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid79} {\list\listtemplateid80\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid80} -{\list\listtemplateid81\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid81}} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}{\listoverride\listid11\listoverridecount0\ls11}{\listoverride\listid12\listoverridecount0\ls12}{\listoverride\listid13\listoverridecount0\ls13}{\listoverride\listid14\listoverridecount0\ls14}{\listoverride\listid15\listoverridecount0\ls15}{\listoverride\listid16\listoverridecount0\ls16}{\listoverride\listid17\listoverridecount0\ls17}{\listoverride\listid18\listoverridecount0\ls18}{\listoverride\listid19\listoverridecount0\ls19}{\listoverride\listid20\listoverridecount0\ls20}{\listoverride\listid21\listoverridecount0\ls21}{\listoverride\listid22\listoverridecount0\ls22}{\listoverride\listid23\listoverridecount0\ls23}{\listoverride\listid24\listoverridecount0\ls24}{\listoverride\listid25\listoverridecount0\ls25}{\listoverride\listid26\listoverridecount0\ls26}{\listoverride\listid27\listoverridecount0\ls27}{\listoverride\listid28\listoverridecount0\ls28}{\listoverride\listid29\listoverridecount0\ls29}{\listoverride\listid30\listoverridecount0\ls30}{\listoverride\listid31\listoverridecount0\ls31}{\listoverride\listid32\listoverridecount0\ls32}{\listoverride\listid33\listoverridecount0\ls33}{\listoverride\listid34\listoverridecount0\ls34}{\listoverride\listid35\listoverridecount0\ls35}{\listoverride\listid36\listoverridecount0\ls36}{\listoverride\listid37\listoverridecount0\ls37}{\listoverride\listid38\listoverridecount0\ls38}{\listoverride\listid39\listoverridecount0\ls39}{\listoverride\listid40\listoverridecount0\ls40}{\listoverride\listid41\listoverridecount0\ls41}{\listoverride\listid42\listoverridecount0\ls42}{\listoverride\listid43\listoverridecount0\ls43}{\listoverride\listid44\listoverridecount0\ls44}{\listoverride\listid45\listoverridecount0\ls45}{\listoverride\listid46\listoverridecount0\ls46}{\listoverride\listid47\listoverridecount0\ls47}{\listoverride\listid48\listoverridecount0\ls48}{\listoverride\listid49\listoverridecount0\ls49}{\listoverride\listid50\listoverridecount0\ls50}{\listoverride\listid51\listoverridecount0\ls51}{\listoverride\listid52\listoverridecount0\ls52}{\listoverride\listid53\listoverridecount0\ls53}{\listoverride\listid54\listoverridecount0\ls54}{\listoverride\listid55\listoverridecount0\ls55}{\listoverride\listid56\listoverridecount0\ls56}{\listoverride\listid57\listoverridecount0\ls57}{\listoverride\listid58\listoverridecount0\ls58}{\listoverride\listid59\listoverridecount0\ls59}{\listoverride\listid60\listoverridecount0\ls60}{\listoverride\listid61\listoverridecount0\ls61}{\listoverride\listid62\listoverridecount0\ls62}{\listoverride\listid63\listoverridecount0\ls63}{\listoverride\listid64\listoverridecount0\ls64}{\listoverride\listid65\listoverridecount0\ls65}{\listoverride\listid66\listoverridecount0\ls66}{\listoverride\listid67\listoverridecount0\ls67}{\listoverride\listid68\listoverridecount0\ls68}{\listoverride\listid69\listoverridecount0\ls69}{\listoverride\listid70\listoverridecount0\ls70}{\listoverride\listid71\listoverridecount0\ls71}{\listoverride\listid72\listoverridecount0\ls72}{\listoverride\listid73\listoverridecount0\ls73}{\listoverride\listid74\listoverridecount0\ls74}{\listoverride\listid75\listoverridecount0\ls75}{\listoverride\listid76\listoverridecount0\ls76}{\listoverride\listid77\listoverridecount0\ls77}{\listoverride\listid78\listoverridecount0\ls78}{\listoverride\listid79\listoverridecount0\ls79}{\listoverride\listid80\listoverridecount0\ls80}{\listoverride\listid81\listoverridecount0\ls81}} +{\list\listtemplateid81\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid81} +{\list\listtemplateid82\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid82}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}{\listoverride\listid11\listoverridecount0\ls11}{\listoverride\listid12\listoverridecount0\ls12}{\listoverride\listid13\listoverridecount0\ls13}{\listoverride\listid14\listoverridecount0\ls14}{\listoverride\listid15\listoverridecount0\ls15}{\listoverride\listid16\listoverridecount0\ls16}{\listoverride\listid17\listoverridecount0\ls17}{\listoverride\listid18\listoverridecount0\ls18}{\listoverride\listid19\listoverridecount0\ls19}{\listoverride\listid20\listoverridecount0\ls20}{\listoverride\listid21\listoverridecount0\ls21}{\listoverride\listid22\listoverridecount0\ls22}{\listoverride\listid23\listoverridecount0\ls23}{\listoverride\listid24\listoverridecount0\ls24}{\listoverride\listid25\listoverridecount0\ls25}{\listoverride\listid26\listoverridecount0\ls26}{\listoverride\listid27\listoverridecount0\ls27}{\listoverride\listid28\listoverridecount0\ls28}{\listoverride\listid29\listoverridecount0\ls29}{\listoverride\listid30\listoverridecount0\ls30}{\listoverride\listid31\listoverridecount0\ls31}{\listoverride\listid32\listoverridecount0\ls32}{\listoverride\listid33\listoverridecount0\ls33}{\listoverride\listid34\listoverridecount0\ls34}{\listoverride\listid35\listoverridecount0\ls35}{\listoverride\listid36\listoverridecount0\ls36}{\listoverride\listid37\listoverridecount0\ls37}{\listoverride\listid38\listoverridecount0\ls38}{\listoverride\listid39\listoverridecount0\ls39}{\listoverride\listid40\listoverridecount0\ls40}{\listoverride\listid41\listoverridecount0\ls41}{\listoverride\listid42\listoverridecount0\ls42}{\listoverride\listid43\listoverridecount0\ls43}{\listoverride\listid44\listoverridecount0\ls44}{\listoverride\listid45\listoverridecount0\ls45}{\listoverride\listid46\listoverridecount0\ls46}{\listoverride\listid47\listoverridecount0\ls47}{\listoverride\listid48\listoverridecount0\ls48}{\listoverride\listid49\listoverridecount0\ls49}{\listoverride\listid50\listoverridecount0\ls50}{\listoverride\listid51\listoverridecount0\ls51}{\listoverride\listid52\listoverridecount0\ls52}{\listoverride\listid53\listoverridecount0\ls53}{\listoverride\listid54\listoverridecount0\ls54}{\listoverride\listid55\listoverridecount0\ls55}{\listoverride\listid56\listoverridecount0\ls56}{\listoverride\listid57\listoverridecount0\ls57}{\listoverride\listid58\listoverridecount0\ls58}{\listoverride\listid59\listoverridecount0\ls59}{\listoverride\listid60\listoverridecount0\ls60}{\listoverride\listid61\listoverridecount0\ls61}{\listoverride\listid62\listoverridecount0\ls62}{\listoverride\listid63\listoverridecount0\ls63}{\listoverride\listid64\listoverridecount0\ls64}{\listoverride\listid65\listoverridecount0\ls65}{\listoverride\listid66\listoverridecount0\ls66}{\listoverride\listid67\listoverridecount0\ls67}{\listoverride\listid68\listoverridecount0\ls68}{\listoverride\listid69\listoverridecount0\ls69}{\listoverride\listid70\listoverridecount0\ls70}{\listoverride\listid71\listoverridecount0\ls71}{\listoverride\listid72\listoverridecount0\ls72}{\listoverride\listid73\listoverridecount0\ls73}{\listoverride\listid74\listoverridecount0\ls74}{\listoverride\listid75\listoverridecount0\ls75}{\listoverride\listid76\listoverridecount0\ls76}{\listoverride\listid77\listoverridecount0\ls77}{\listoverride\listid78\listoverridecount0\ls78}{\listoverride\listid79\listoverridecount0\ls79}{\listoverride\listid80\listoverridecount0\ls80}{\listoverride\listid81\listoverridecount0\ls81}{\listoverride\listid82\listoverridecount0\ls82}} \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural \f0\fs60 \cf0 Skim Release Notes\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \f1\b\fs28 \cf0 \ +Changes since 0.4\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f2\i\fs26 \cf0 Bugs Fixed\ +\pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural +\ls1\ilvl0 +\f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Fixed installation of new versions by updater.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b\fs28 \cf0 \ Changes since 0.3\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural @@ -97,50 +109,50 @@ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 New Features\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls1\ilvl0 +\ls2\ilvl0 \f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Add a menu item in the Help menu to visit the web site.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls2\ilvl0\cf0 {\listtext \'a5 }Add single-character shortcuts to change the note style in note mode (t, n, c, b, h, u, s, a).\ +\ls3\ilvl0\cf0 {\listtext \'a5 }Add single-character shortcuts to change the note style in note mode (t, n, c, b, h, u, s, a).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls3\ilvl0\cf0 {\listtext \'a5 }Fix PDFSync support to work with file names containing spaces.\ +\ls4\ilvl0\cf0 {\listtext \'a5 }Fix PDFSync support to work with file names containing spaces.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls4\ilvl0\cf0 {\listtext \'a5 }Add hidden default for activation of navigation buttons in presentation mode (SKActivatePresentationNavigationAtBottom).\ +\ls5\ilvl0\cf0 {\listtext \'a5 }Add hidden default for activation of navigation buttons in presentation mode (SKActivatePresentationNavigationAtBottom).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls5\ilvl0\cf0 {\listtext \'a5 }Start search using the find panel at the current page when there is no selection.\ +\ls6\ilvl0\cf0 {\listtext \'a5 }Start search using the find panel at the current page when there is no selection.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls6\ilvl0\cf0 {\listtext \'a5 }Wrap selection using the find panel.\ +\ls7\ilvl0\cf0 {\listtext \'a5 }Wrap selection using the find panel.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls7\ilvl0\cf0 {\listtext \'a5 }Add support for apple remote control. It can be disabled through the hidden default SKEnableAppleRemote.\ +\ls8\ilvl0\cf0 {\listtext \'a5 }Add support for apple remote control. It can be disabled through the hidden default SKEnableAppleRemote.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls8\ilvl0\cf0 {\listtext \'a5 }Hidden defaults for line ending style of arrows (SKArrowNoteStartLineStyle, SKArrowNoteEndLineStyle).\ +\ls9\ilvl0\cf0 {\listtext \'a5 }Hidden defaults for line ending style of arrows (SKArrowNoteStartLineStyle, SKArrowNoteEndLineStyle).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls9\ilvl0\cf0 {\listtext \'a5 }Hidden pref option for reading missing notes from separate .skim file (SKReadMissingNotesFromSkimFileOption). \ +\ls10\ilvl0\cf0 {\listtext \'a5 }Hidden pref option for reading missing notes from separate .skim file (SKReadMissingNotesFromSkimFileOption). \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls10\ilvl0\cf0 {\listtext \'a5 }You can now open the corresponding PDF from a Skim Notes document.\ +\ls11\ilvl0\cf0 {\listtext \'a5 }You can now open the corresponding PDF from a Skim Notes document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls11\ilvl0\cf0 {\listtext \'a5 }Skim can now read TIFF images from the clipboard.\ +\ls12\ilvl0\cf0 {\listtext \'a5 }Skim can now read TIFF images from the clipboard.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls12\ilvl0\cf0 {\listtext \'a5 }New select tool. Allows you to copy PDF and TIFF images from a section of a page.\ +\ls13\ilvl0\cf0 {\listtext \'a5 }New select tool. Allows you to copy PDF and TIFF images from a section of a page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls13\ilvl0\cf0 {\listtext \'a5 }You can now search Skim note files from Spotlight.\ +\ls14\ilvl0\cf0 {\listtext \'a5 }You can now search Skim note files from Spotlight.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls14\ilvl0\cf0 {\listtext \'a5 }New Crop menu items and toolbar button.\ +\ls15\ilvl0\cf0 {\listtext \'a5 }New Crop menu items and toolbar button.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls15\ilvl0\cf0 {\listtext \'a5 }Cropping and page rotation are now undoable.\ +\ls16\ilvl0\cf0 {\listtext \'a5 }Cropping and page rotation are now undoable.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls16\ilvl0\cf0 {\listtext \'a5 }Allow reverting a document when it has changed on disk.\ +\ls17\ilvl0\cf0 {\listtext \'a5 }Allow reverting a document when it has changed on disk.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls17\ilvl0\cf0 {\listtext \'a5 }New menu item to set the selection from the content of the page.\ +\ls18\ilvl0\cf0 {\listtext \'a5 }New menu item to set the selection from the content of the page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls18\ilvl0\cf0 {\listtext \'a5 }Hidden defaults for automatic crop box margins (SKAutoCropBoxMarginWidth, SKAutoCropBoxMarginHeight).\ +\ls19\ilvl0\cf0 {\listtext \'a5 }Hidden defaults for automatic crop box margins (SKAutoCropBoxMarginWidth, SKAutoCropBoxMarginHeight).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls19\ilvl0\cf0 {\listtext \'a5 }New Zoom To Selection menu item and toolbar button.\ +\ls20\ilvl0\cf0 {\listtext \'a5 }New Zoom To Selection menu item and toolbar button.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls20\ilvl0\cf0 {\listtext \'a5 }New preference option to open files fit to the PDF.\ +\ls21\ilvl0\cf0 {\listtext \'a5 }New preference option to open files fit to the PDF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls21\ilvl0\cf0 {\listtext \'a5 }You can now join markup highlights using shift-click, or by selecting a highlight before adding a new one.\ +\ls22\ilvl0\cf0 {\listtext \'a5 }You can now join markup highlights using shift-click, or by selecting a highlight before adding a new one.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls22\ilvl0\cf0 {\listtext \'a5 }You can now supply templates for text export of notes. See the wiki for more information.\ +\ls23\ilvl0\cf0 {\listtext \'a5 }You can now supply templates for text export of notes. See the wiki for more information.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural \f1\b\fs28 \cf0 \ @@ -148,26 +160,26 @@ \f2\i\fs26 \cf0 Bugs Fixed\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls23\ilvl0 +\ls24\ilvl0 \f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Fix links in help.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls24\ilvl0\cf0 {\listtext \'a5 }Don't create a new note in note tool mode on mousedown outside a page.\ +\ls25\ilvl0\cf0 {\listtext \'a5 }Don't create a new note in note tool mode on mousedown outside a page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls25\ilvl0\cf0 {\listtext \'a5 }Don't add new resizable notes in note tool mode when just clicking.\ +\ls26\ilvl0\cf0 {\listtext \'a5 }Don't add new resizable notes in note tool mode when just clicking.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls26\ilvl0\cf0 {\listtext \'a5 }You can now access links that are "hidden" by transparent highlights and arrows.\ +\ls27\ilvl0\cf0 {\listtext \'a5 }You can now access links that are "hidden" by transparent highlights and arrows.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls27\ilvl0\cf0 {\listtext \'a5 }Scroll reading bar to visible when it is shown.\ +\ls28\ilvl0\cf0 {\listtext \'a5 }Scroll reading bar to visible when it is shown.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls28\ilvl0\cf0 {\listtext \'a5 }Scroll to previous position on page when reloading PDF.\ +\ls29\ilvl0\cf0 {\listtext \'a5 }Scroll to previous position on page when reloading PDF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls29\ilvl0\cf0 {\listtext \'a5 }Escape spaces in TeX editor command.\ +\ls30\ilvl0\cf0 {\listtext \'a5 }Escape spaces in TeX editor command.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls30\ilvl0\cf0 {\listtext \'a5 }Thumbnails now use the current display box.\ +\ls31\ilvl0\cf0 {\listtext \'a5 }Thumbnails now use the current display box.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls31\ilvl0\cf0 {\listtext \'a5 }Retry automatic reloading of files changed on disk a few times.\ +\ls32\ilvl0\cf0 {\listtext \'a5 }Retry automatic reloading of files changed on disk a few times.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls31\ilvl0 +\ls32\ilvl0 \f1\b\fs28 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 Changes since 0.2\ @@ -177,74 +189,74 @@ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 New Features\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls32\ilvl0 +\ls33\ilvl0 \f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Add shortcuts for bigger/smaller font sizes.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls33\ilvl0\cf0 {\listtext \'a5 }Command-click a snapshot.\ +\ls34\ilvl0\cf0 {\listtext \'a5 }Command-click a snapshot.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls34\ilvl0\cf0 {\listtext \'a5 }We now print notes and highlights.\ +\ls35\ilvl0\cf0 {\listtext \'a5 }We now print notes and highlights.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls35\ilvl0\cf0 {\listtext \'a5 }Add copy/cut/paste items to the contextual menu, when they apply.\ +\ls36\ilvl0\cf0 {\listtext \'a5 }Add copy/cut/paste items to the contextual menu, when they apply.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls36\ilvl0\cf0 {\listtext \'a5 }You can now make a snapshot of a page by Command-clicking a thumbnail.\ +\ls37\ilvl0\cf0 {\listtext \'a5 }You can now make a snapshot of a page by Command-clicking a thumbnail.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls37\ilvl0\cf0 {\listtext \'a5 }Added Dutch localization.\ +\ls38\ilvl0\cf0 {\listtext \'a5 }Added Dutch localization.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls38\ilvl0\cf0 {\listtext \'a5 }We now do not leave Full Screen when switching to another application.\ +\ls39\ilvl0\cf0 {\listtext \'a5 }We now do not leave Full Screen when switching to another application.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls39\ilvl0\cf0 {\listtext \'a5 }Export notes as RTF.\ +\ls40\ilvl0\cf0 {\listtext \'a5 }Export notes as RTF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls40\ilvl0\cf0 {\listtext \'a5 }Add preference options for default note/highlight colors and text note font.\ +\ls41\ilvl0\cf0 {\listtext \'a5 }Add preference options for default note/highlight colors and text note font.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls41\ilvl0\cf0 {\listtext \'a5 }Add menu item to save the current PDF display settings to be used for new documents.\ +\ls42\ilvl0\cf0 {\listtext \'a5 }Add menu item to save the current PDF display settings to be used for new documents.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls42\ilvl0\cf0 {\listtext \'a5 }Search results from the Find Panel are now also highlighted with a red oval.\ +\ls43\ilvl0\cf0 {\listtext \'a5 }Search results from the Find Panel are now also highlighted with a red oval.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls43\ilvl0\cf0 {\listtext \'a5 }Select search field when opening the Contents pane in full screen mode.\ +\ls44\ilvl0\cf0 {\listtext \'a5 }Select search field when opening the Contents pane in full screen mode.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls44\ilvl0\cf0 {\listtext \'a5 }You can now reset all preferences or all preferences in a pane.\ +\ls45\ilvl0\cf0 {\listtext \'a5 }You can now reset all preferences or all preferences in a pane.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls45\ilvl0\cf0 {\listtext \'a5 }Added Italian localization. (Thanks Andrea Bergia!)\ +\ls46\ilvl0\cf0 {\listtext \'a5 }Added Italian localization. (Thanks Andrea Bergia!)\ {\listtext \'a5 }Screensaver and sleep are now disabled in Presentation mode.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls46\ilvl0\cf0 {\listtext \'a5 }Skim can now return to the last page viewed in a document.\ +\ls47\ilvl0\cf0 {\listtext \'a5 }Skim can now return to the last page viewed in a document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls47\ilvl0\cf0 {\listtext \'a5 }Link tool tips now show the top of the text when the link refers to the (empty) top of a page. \ +\ls48\ilvl0\cf0 {\listtext \'a5 }Link tool tips now show the top of the text when the link refers to the (empty) top of a page. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls48\ilvl0\cf0 {\listtext \'a5 }Skim can now also view separate Skim notes (.skim) files.\ +\ls49\ilvl0\cf0 {\listtext \'a5 }Skim can now also view separate Skim notes (.skim) files.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls49\ilvl0\cf0 {\listtext \'a5 }Using Sparkle for automatic updating. (Thanks Andy Matuschak!)\ +\ls50\ilvl0\cf0 {\listtext \'a5 }Using Sparkle for automatic updating. (Thanks Andy Matuschak!)\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls50\ilvl0\cf0 {\listtext \'a5 }Display the number of pages in the title bar.\ +\ls51\ilvl0\cf0 {\listtext \'a5 }Display the number of pages in the title bar.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls51\ilvl0\cf0 {\listtext \'a5 }Skim can now automatically backup a skim notes file whenever it saves a PDF file.\ +\ls52\ilvl0\cf0 {\listtext \'a5 }Skim can now automatically backup a skim notes file whenever it saves a PDF file.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls52\ilvl0\cf0 {\listtext \'a5 }You can now resize the current note using the arrow keys, when you hold down the Control key.\ +\ls53\ilvl0\cf0 {\listtext \'a5 }You can now resize the current note using the arrow keys, when you hold down the Control key.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls53\ilvl0\cf0 {\listtext \'a5 }Notes are now ordered according to page and location in page.\ +\ls54\ilvl0\cf0 {\listtext \'a5 }Notes are now ordered according to page and location in page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls54\ilvl0\cf0 {\listtext \'a5 }Several improvements of Skim's custom tool-tips.\ +\ls55\ilvl0\cf0 {\listtext \'a5 }Several improvements of Skim's custom tool-tips.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls55\ilvl0\cf0 {\listtext \'a5 }Add a menu item to select the search field.\ +\ls56\ilvl0\cf0 {\listtext \'a5 }Add a menu item to select the search field.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls56\ilvl0\cf0 {\listtext \'a5 }You can now add arrows to a PDF document.\ +\ls57\ilvl0\cf0 {\listtext \'a5 }You can now add arrows to a PDF document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls57\ilvl0\cf0 {\listtext \'a5 }You can now add notes from external .skim files rather than just overwriting them.\ +\ls58\ilvl0\cf0 {\listtext \'a5 }You can now add notes from external .skim files rather than just overwriting them.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls58\ilvl0\cf0 {\listtext \'a5 }PDFSync support. See the Wiki for more information.\ +\ls59\ilvl0\cf0 {\listtext \'a5 }PDFSync support. See the Wiki for more information.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls59\ilvl0\cf0 {\listtext \'a5 }You can now set transparent colors from the color panel. \ +\ls60\ilvl0\cf0 {\listtext \'a5 }You can now set transparent colors from the color panel. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls60\ilvl0\cf0 {\listtext \'a5 }You can now set separate PDF view settigns for full screen mode. \ +\ls61\ilvl0\cf0 {\listtext \'a5 }You can now set separate PDF view settigns for full screen mode. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls61\ilvl0\cf0 {\listtext \'a5 }Add a Look Up in Dictionary item to the contextual menu.\ +\ls62\ilvl0\cf0 {\listtext \'a5 }Add a Look Up in Dictionary item to the contextual menu.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls62\ilvl0\cf0 {\listtext \'a5 }You can now undo edits of notes and highlights.\ +\ls63\ilvl0\cf0 {\listtext \'a5 }You can now undo edits of notes and highlights.\ {\listtext \'a5 }Add a hidden preference (SKActivateFullScreenNavigationAtBottom) to show the navigation buttons in full screen mode only when moving the mouse at the bottom of the screen. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls63\ilvl0\cf0 {\listtext \'a5 }Add hidden preferences for the line widths of circles and boxes (SKCircleNoteLineWidth and SKSquareNoteLineWidth).\ +\ls64\ilvl0\cf0 {\listtext \'a5 }Add hidden preferences for the line widths of circles and boxes (SKCircleNoteLineWidth and SKSquareNoteLineWidth).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls64\ilvl0\cf0 {\listtext \'a5 }New tool modes for ading notes or highlights.\ +\ls65\ilvl0\cf0 {\listtext \'a5 }New tool modes for ading notes or highlights.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural \f1\b\fs28 \cf0 \ @@ -252,40 +264,40 @@ \f2\i\fs26 \cf0 Bugs Fixed\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls65\ilvl0 +\ls66\ilvl0 \f3\i0\b0\fs22 \cf0 {\listtext \'a5 }We now don't edit new text notes, so they can be moved, resized or deleted.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls66\ilvl0\cf0 {\listtext \'a5 }We now make sure new notes are added to a visible page.\ +\ls67\ilvl0\cf0 {\listtext \'a5 }We now make sure new notes are added to a visible page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls67\ilvl0\cf0 {\listtext \'a5 }Disable the TOC menu item when there is no TOC.\ +\ls68\ilvl0\cf0 {\listtext \'a5 }Disable the TOC menu item when there is no TOC.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls68\ilvl0\cf0 {\listtext \'a5 }Return to the location that was viewed when reloading a document.\ +\ls69\ilvl0\cf0 {\listtext \'a5 }Return to the location that was viewed when reloading a document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls69\ilvl0\cf0 {\listtext \'a5 }Search text in a PDf file asynchronously, so it does not block Skim.\ +\ls70\ilvl0\cf0 {\listtext \'a5 }Search text in a PDf file asynchronously, so it does not block Skim.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls70\ilvl0\cf0 {\listtext \'a5 }Fix crashes that can appear for links with missing URLs.\ +\ls71\ilvl0\cf0 {\listtext \'a5 }Fix crashes that can appear for links with missing URLs.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls71\ilvl0\cf0 {\listtext \'a5 }Add separators in the Notes menu for categories.\ +\ls72\ilvl0\cf0 {\listtext \'a5 }Add separators in the Notes menu for categories.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls72\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting a PDF-document.\ +\ls73\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting a PDF-document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls73\ilvl0\cf0 {\listtext \'a5 }Fix typos in the Help and update for new features.\ +\ls74\ilvl0\cf0 {\listtext \'a5 }Fix typos in the Help and update for new features.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls74\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting the document. Unfortunately this disabled tool tips.\ +\ls75\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting the document. Unfortunately this disabled tool tips.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls75\ilvl0\cf0 {\listtext \'a5 }Open the contents pane to display the search term when opening from Spotlight.\ +\ls76\ilvl0\cf0 {\listtext \'a5 }Open the contents pane to display the search term when opening from Spotlight.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls76\ilvl0\cf0 {\listtext \'a5 }Save notes when auto-saving and exporting as PDF.\ +\ls77\ilvl0\cf0 {\listtext \'a5 }Save notes when auto-saving and exporting as PDF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls77\ilvl0\cf0 {\listtext \'a5 }Remember the width of notes pane.\ +\ls78\ilvl0\cf0 {\listtext \'a5 }Remember the width of notes pane.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls78\ilvl0\cf0 {\listtext \'a5 }Fix leaks leading to excessive memory use.\ +\ls79\ilvl0\cf0 {\listtext \'a5 }Fix leaks leading to excessive memory use.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls79\ilvl0\cf0 {\listtext \'a5 }Fix back-tabbing through notes and links.\ +\ls80\ilvl0\cf0 {\listtext \'a5 }Fix back-tabbing through notes and links.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls80\ilvl0\cf0 {\listtext \'a5 }Zooming using the scroll-wheel now only affects the current window.\ +\ls81\ilvl0\cf0 {\listtext \'a5 }Zooming using the scroll-wheel now only affects the current window.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls81\ilvl0\cf0 {\listtext \'a5 }Lazy updating of page thumbnails to avoid slowdown when opening a file.\ +\ls82\ilvl0\cf0 {\listtext \'a5 }Lazy updating of page thumbnails to avoid slowdown when opening a file.\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \f1\b\fs28 \cf0 \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-30 11:52:33
|
Revision: 2179 http://skim-app.svn.sourceforge.net/skim-app/?rev=2179&view=rev Author: hofman Date: 2007-05-30 04:52:31 -0700 (Wed, 30 May 2007) Log Message: ----------- Fix installing of update. Symlinks are not followed by NSDirectoryEnumerator, but are also never interpreted as a directory, even if they link to a directory. Therefore enumeration of the parent directory was stopped. Modified Paths: -------------- trunk/vendorsrc/andymatuschak/Sparkle/SUUpdater.m Modified: trunk/vendorsrc/andymatuschak/Sparkle/SUUpdater.m =================================================================== --- trunk/vendorsrc/andymatuschak/Sparkle/SUUpdater.m 2007-05-30 09:32:25 UTC (rev 2178) +++ trunk/vendorsrc/andymatuschak/Sparkle/SUUpdater.m 2007-05-30 11:52:31 UTC (rev 2179) @@ -614,9 +614,9 @@ NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:[downloadPath stringByDeletingLastPathComponent]]; while ((file = [dirEnum nextObject])) { - // Some DMGs have symlinks into /Applications! That's no good! - if ([[[dirEnum fileAttributes] objectForKey:NSFileType] isEqualToString:NSFileTypeSymbolicLink] || - IsAliasFolderAtPath([[downloadPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:file])) + // Some DMGs have symlinks into /Applications! But symlinks are not followed by NSDirectoryEnumerator, so that's OK + // If someone uses an alias to a folder that can lead to problems though, as it could be resolved to the Applications folder on disk or lead to loops + if (IsAliasFolderAtPath([[downloadPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:file])) [dirEnum skipDescendents]; if ([[file lastPathComponent] isEqualToString:appName]) newAppDownloadPath = [[downloadPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:file]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-30 09:32:26
|
Revision: 2178 http://skim-app.svn.sourceforge.net/skim-app/?rev=2178&view=rev Author: hofman Date: 2007-05-30 02:32:25 -0700 (Wed, 30 May 2007) Log Message: ----------- Tag for release Added Paths: ----------- REL_0_4/ Copied: REL_0_4 (from rev 2177, trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-30 09:30:32
|
Revision: 2177 http://skim-app.svn.sourceforge.net/skim-app/?rev=2177&view=rev Author: hofman Date: 2007-05-30 02:30:31 -0700 (Wed, 30 May 2007) Log Message: ----------- Bump version number for release. Modified Paths: -------------- trunk/Dutch.lproj/InfoPlist.strings trunk/Dutch.lproj/Skim Help/version.texi trunk/English.lproj/InfoPlist.strings trunk/English.lproj/Skim Help/version.texi trunk/Info.plist trunk/Italian.lproj/InfoPlist.strings trunk/Italian.lproj/Skim Help/version.texi trunk/Skim.xcodeproj/project.pbxproj Modified: trunk/Dutch.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/Dutch.lproj/Skim Help/version.texi =================================================================== --- trunk/Dutch.lproj/Skim Help/version.texi 2007-05-30 09:21:47 UTC (rev 2176) +++ trunk/Dutch.lproj/Skim Help/version.texi 2007-05-30 09:30:31 UTC (rev 2177) @@ -1 +1 @@ -@set VERSION 0.3 +@set VERSION 0.4 Modified: trunk/English.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/English.lproj/Skim Help/version.texi =================================================================== --- trunk/English.lproj/Skim Help/version.texi 2007-05-30 09:21:47 UTC (rev 2176) +++ trunk/English.lproj/Skim Help/version.texi 2007-05-30 09:30:31 UTC (rev 2177) @@ -1 +1 @@ -@set VERSION 0.3 +@set VERSION 0.4 Modified: trunk/Info.plist =================================================================== --- trunk/Info.plist 2007-05-30 09:21:47 UTC (rev 2176) +++ trunk/Info.plist 2007-05-30 09:30:31 UTC (rev 2177) @@ -286,11 +286,11 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>0.3</string> + <string>0.4</string> <key>CFBundleSignature</key> <string>SKIM</string> <key>CFBundleVersion</key> - <string>v3</string> + <string>v4</string> <key>LSMinimumSystemVersion</key> <string>10.4.0</string> <key>NSAppleScriptEnabled</key> Modified: trunk/Italian.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/Italian.lproj/Skim Help/version.texi =================================================================== --- trunk/Italian.lproj/Skim Help/version.texi 2007-05-30 09:21:47 UTC (rev 2176) +++ trunk/Italian.lproj/Skim Help/version.texi 2007-05-30 09:30:31 UTC (rev 2177) @@ -1 +1 @@ -@set VERSION 0.3 +@set VERSION 0.4 Modified: trunk/Skim.xcodeproj/project.pbxproj =================================================================== --- trunk/Skim.xcodeproj/project.pbxproj 2007-05-30 09:21:47 UTC (rev 2176) +++ trunk/Skim.xcodeproj/project.pbxproj 2007-05-30 09:30:31 UTC (rev 2177) @@ -319,7 +319,7 @@ 45A3BD380B4F097D002B297F /* InitialUserDefaults.plist */ = {isa = PBXFileReference; explicitFileType = text.xml; fileEncoding = 4; path = InitialUserDefaults.plist; sourceTree = "<group>"; }; 45B113BF0B329A7E00DE0660 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; }; 8D15AC360486D014006FF6A4 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Info.plist; sourceTree = "<group>"; }; - 8D15AC370486D014006FF6A4 /* Skim.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Skim.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D15AC370486D014006FF6A4 /* Skim.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Skim.app; sourceTree = BUILT_PRODUCTS_DIR; }; A489FDBA0BC8E8D100BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/InfoWindow.nib; sourceTree = "<group>"; }; A489FDBD0BC8E8DA00BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/MainMenu.nib; sourceTree = "<group>"; }; A489FDC00BC8E8DF00BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/MainWindow.nib; sourceTree = "<group>"; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-30 09:21:49
|
Revision: 2176 http://skim-app.svn.sourceforge.net/skim-app/?rev=2176&view=rev Author: hofman Date: 2007-05-30 02:21:47 -0700 (Wed, 30 May 2007) Log Message: ----------- Update release notes. Modified Paths: -------------- trunk/ReleaseNotes.rtf Modified: trunk/ReleaseNotes.rtf =================================================================== --- trunk/ReleaseNotes.rtf 2007-05-29 18:34:22 UTC (rev 2175) +++ trunk/ReleaseNotes.rtf 2007-05-30 09:21:47 UTC (rev 2176) @@ -1,7 +1,6 @@ {\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 -{\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fnil\fcharset77 LucidaGrande;\f2\fnil\fcharset77 LucidaSans-Typewriter; -\f3\fswiss\fcharset77 Helvetica-Bold;\f4\fswiss\fcharset77 Helvetica-BoldOblique;\f5\fnil\fcharset77 LucidaGrande-Bold; -} +{\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fswiss\fcharset77 Helvetica-Bold;\f2\fswiss\fcharset77 Helvetica-BoldOblique; +\f3\fnil\fcharset77 LucidaGrande;\f4\fnil\fcharset77 LucidaGrande-Bold;} {\colortbl;\red255\green255\blue255;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid2} @@ -80,29 +79,26 @@ {\list\listtemplateid75\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid75} {\list\listtemplateid76\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid76} {\list\listtemplateid77\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid77} -{\list\listtemplateid78\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid78}} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}{\listoverride\listid11\listoverridecount0\ls11}{\listoverride\listid12\listoverridecount0\ls12}{\listoverride\listid13\listoverridecount0\ls13}{\listoverride\listid14\listoverridecount0\ls14}{\listoverride\listid15\listoverridecount0\ls15}{\listoverride\listid16\listoverridecount0\ls16}{\listoverride\listid17\listoverridecount0\ls17}{\listoverride\listid18\listoverridecount0\ls18}{\listoverride\listid19\listoverridecount0\ls19}{\listoverride\listid20\listoverridecount0\ls20}{\listoverride\listid21\listoverridecount0\ls21}{\listoverride\listid22\listoverridecount0\ls22}{\listoverride\listid23\listoverridecount0\ls23}{\listoverride\listid24\listoverridecount0\ls24}{\listoverride\listid25\listoverridecount0\ls25}{\listoverride\listid26\listoverridecount0\ls26}{\listoverride\listid27\listoverridecount0\ls27}{\listoverride\listid28\listoverridecount0\ls28}{\listoverride\listid29\listoverridecount0\ls29}{\listoverride\listid30\listoverridecount0\ls30}{\listoverride\listid31\listoverridecount0\ls31}{\listoverride\listid32\listoverridecount0\ls32}{\listoverride\listid33\listoverridecount0\ls33}{\listoverride\listid34\listoverridecount0\ls34}{\listoverride\listid35\listoverridecount0\ls35}{\listoverride\listid36\listoverridecount0\ls36}{\listoverride\listid37\listoverridecount0\ls37}{\listoverride\listid38\listoverridecount0\ls38}{\listoverride\listid39\listoverridecount0\ls39}{\listoverride\listid40\listoverridecount0\ls40}{\listoverride\listid41\listoverridecount0\ls41}{\listoverride\listid42\listoverridecount0\ls42}{\listoverride\listid43\listoverridecount0\ls43}{\listoverride\listid44\listoverridecount0\ls44}{\listoverride\listid45\listoverridecount0\ls45}{\listoverride\listid46\listoverridecount0\ls46}{\listoverride\listid47\listoverridecount0\ls47}{\listoverride\listid48\listoverridecount0\ls48}{\listoverride\listid49\listoverridecount0\ls49}{\listoverride\listid50\listoverridecount0\ls50}{\listoverride\listid51\listoverridecount0\ls51}{\listoverride\listid52\listoverridecount0\ls52}{\listoverride\listid53\listoverridecount0\ls53}{\listoverride\listid54\listoverridecount0\ls54}{\listoverride\listid55\listoverridecount0\ls55}{\listoverride\listid56\listoverridecount0\ls56}{\listoverride\listid57\listoverridecount0\ls57}{\listoverride\listid58\listoverridecount0\ls58}{\listoverride\listid59\listoverridecount0\ls59}{\listoverride\listid60\listoverridecount0\ls60}{\listoverride\listid61\listoverridecount0\ls61}{\listoverride\listid62\listoverridecount0\ls62}{\listoverride\listid63\listoverridecount0\ls63}{\listoverride\listid64\listoverridecount0\ls64}{\listoverride\listid65\listoverridecount0\ls65}{\listoverride\listid66\listoverridecount0\ls66}{\listoverride\listid67\listoverridecount0\ls67}{\listoverride\listid68\listoverridecount0\ls68}{\listoverride\listid69\listoverridecount0\ls69}{\listoverride\listid70\listoverridecount0\ls70}{\listoverride\listid71\listoverridecount0\ls71}{\listoverride\listid72\listoverridecount0\ls72}{\listoverride\listid73\listoverridecount0\ls73}{\listoverride\listid74\listoverridecount0\ls74}{\listoverride\listid75\listoverridecount0\ls75}{\listoverride\listid76\listoverridecount0\ls76}{\listoverride\listid77\listoverridecount0\ls77}{\listoverride\listid78\listoverridecount0\ls78}} +{\list\listtemplateid78\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid78} +{\list\listtemplateid79\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid79} +{\list\listtemplateid80\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid80} +{\list\listtemplateid81\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid81}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}{\listoverride\listid11\listoverridecount0\ls11}{\listoverride\listid12\listoverridecount0\ls12}{\listoverride\listid13\listoverridecount0\ls13}{\listoverride\listid14\listoverridecount0\ls14}{\listoverride\listid15\listoverridecount0\ls15}{\listoverride\listid16\listoverridecount0\ls16}{\listoverride\listid17\listoverridecount0\ls17}{\listoverride\listid18\listoverridecount0\ls18}{\listoverride\listid19\listoverridecount0\ls19}{\listoverride\listid20\listoverridecount0\ls20}{\listoverride\listid21\listoverridecount0\ls21}{\listoverride\listid22\listoverridecount0\ls22}{\listoverride\listid23\listoverridecount0\ls23}{\listoverride\listid24\listoverridecount0\ls24}{\listoverride\listid25\listoverridecount0\ls25}{\listoverride\listid26\listoverridecount0\ls26}{\listoverride\listid27\listoverridecount0\ls27}{\listoverride\listid28\listoverridecount0\ls28}{\listoverride\listid29\listoverridecount0\ls29}{\listoverride\listid30\listoverridecount0\ls30}{\listoverride\listid31\listoverridecount0\ls31}{\listoverride\listid32\listoverridecount0\ls32}{\listoverride\listid33\listoverridecount0\ls33}{\listoverride\listid34\listoverridecount0\ls34}{\listoverride\listid35\listoverridecount0\ls35}{\listoverride\listid36\listoverridecount0\ls36}{\listoverride\listid37\listoverridecount0\ls37}{\listoverride\listid38\listoverridecount0\ls38}{\listoverride\listid39\listoverridecount0\ls39}{\listoverride\listid40\listoverridecount0\ls40}{\listoverride\listid41\listoverridecount0\ls41}{\listoverride\listid42\listoverridecount0\ls42}{\listoverride\listid43\listoverridecount0\ls43}{\listoverride\listid44\listoverridecount0\ls44}{\listoverride\listid45\listoverridecount0\ls45}{\listoverride\listid46\listoverridecount0\ls46}{\listoverride\listid47\listoverridecount0\ls47}{\listoverride\listid48\listoverridecount0\ls48}{\listoverride\listid49\listoverridecount0\ls49}{\listoverride\listid50\listoverridecount0\ls50}{\listoverride\listid51\listoverridecount0\ls51}{\listoverride\listid52\listoverridecount0\ls52}{\listoverride\listid53\listoverridecount0\ls53}{\listoverride\listid54\listoverridecount0\ls54}{\listoverride\listid55\listoverridecount0\ls55}{\listoverride\listid56\listoverridecount0\ls56}{\listoverride\listid57\listoverridecount0\ls57}{\listoverride\listid58\listoverridecount0\ls58}{\listoverride\listid59\listoverridecount0\ls59}{\listoverride\listid60\listoverridecount0\ls60}{\listoverride\listid61\listoverridecount0\ls61}{\listoverride\listid62\listoverridecount0\ls62}{\listoverride\listid63\listoverridecount0\ls63}{\listoverride\listid64\listoverridecount0\ls64}{\listoverride\listid65\listoverridecount0\ls65}{\listoverride\listid66\listoverridecount0\ls66}{\listoverride\listid67\listoverridecount0\ls67}{\listoverride\listid68\listoverridecount0\ls68}{\listoverride\listid69\listoverridecount0\ls69}{\listoverride\listid70\listoverridecount0\ls70}{\listoverride\listid71\listoverridecount0\ls71}{\listoverride\listid72\listoverridecount0\ls72}{\listoverride\listid73\listoverridecount0\ls73}{\listoverride\listid74\listoverridecount0\ls74}{\listoverride\listid75\listoverridecount0\ls75}{\listoverride\listid76\listoverridecount0\ls76}{\listoverride\listid77\listoverridecount0\ls77}{\listoverride\listid78\listoverridecount0\ls78}{\listoverride\listid79\listoverridecount0\ls79}{\listoverride\listid80\listoverridecount0\ls80}{\listoverride\listid81\listoverridecount0\ls81}} \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural \f0\fs60 \cf0 Skim Release Notes\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f1\fs22 \cf0 \ -Last update: 25 May 2007 (rev -\f2\fs20 2153) -\f1\fs22 \ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f3\b\fs28 \cf0 \ +\f1\b\fs28 \cf0 \ Changes since 0.3\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\f4\i\fs26 \cf0 \ +\f2\i\fs26 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 New Features\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural \ls1\ilvl0 -\f1\i0\b0\fs22 \cf0 {\listtext \'a5 }Add a menu item in the Help menu to visit the web site.\ +\f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Add a menu item in the Help menu to visit the web site.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural \ls2\ilvl0\cf0 {\listtext \'a5 }Add single-character shortcuts to change the note style in note mode (t, n, c, b, h, u, s, a).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural @@ -140,196 +136,202 @@ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural \ls19\ilvl0\cf0 {\listtext \'a5 }New Zoom To Selection menu item and toolbar button.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural +\ls20\ilvl0\cf0 {\listtext \'a5 }New preference option to open files fit to the PDF.\ +\pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural +\ls21\ilvl0\cf0 {\listtext \'a5 }You can now join markup highlights using shift-click, or by selecting a highlight before adding a new one.\ +\pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural +\ls22\ilvl0\cf0 {\listtext \'a5 }You can now supply templates for text export of notes. See the wiki for more information.\ +\pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\f3\b\fs28 \cf0 \ +\f1\b\fs28 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f4\i\fs26 \cf0 Bugs Fixed\ +\f2\i\fs26 \cf0 Bugs Fixed\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls20\ilvl0 -\f1\i0\b0\fs22 \cf0 {\listtext \'a5 }Fix links in help.\ +\ls23\ilvl0 +\f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Fix links in help.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls21\ilvl0\cf0 {\listtext \'a5 }Don't create a new note in note tool mode on mousedown outside a page.\ +\ls24\ilvl0\cf0 {\listtext \'a5 }Don't create a new note in note tool mode on mousedown outside a page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls22\ilvl0\cf0 {\listtext \'a5 }Don't add new resizable notes in note tool mode when just clicking.\ +\ls25\ilvl0\cf0 {\listtext \'a5 }Don't add new resizable notes in note tool mode when just clicking.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls23\ilvl0\cf0 {\listtext \'a5 }You can now access links that are "hidden" by transparent highlights and arrows.\ +\ls26\ilvl0\cf0 {\listtext \'a5 }You can now access links that are "hidden" by transparent highlights and arrows.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls24\ilvl0\cf0 {\listtext \'a5 }Scroll reading bar to visible when it is shown.\ +\ls27\ilvl0\cf0 {\listtext \'a5 }Scroll reading bar to visible when it is shown.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls25\ilvl0\cf0 {\listtext \'a5 }Scroll to previous position on page when reloading PDF.\ +\ls28\ilvl0\cf0 {\listtext \'a5 }Scroll to previous position on page when reloading PDF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls26\ilvl0\cf0 {\listtext \'a5 }Escape spaces in TeX editor command.\ +\ls29\ilvl0\cf0 {\listtext \'a5 }Escape spaces in TeX editor command.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls27\ilvl0\cf0 {\listtext \'a5 }Thumbnails now use the current display box.\ +\ls30\ilvl0\cf0 {\listtext \'a5 }Thumbnails now use the current display box.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls28\ilvl0\cf0 {\listtext \'a5 }Retry automatic reloading of files changed on disk a few times.\ +\ls31\ilvl0\cf0 {\listtext \'a5 }Retry automatic reloading of files changed on disk a few times.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls28\ilvl0 -\f3\b\fs28 \cf0 \ +\ls31\ilvl0 +\f1\b\fs28 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 Changes since 0.2\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\f4\i\fs26 \cf0 \ +\f2\i\fs26 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 New Features\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls29\ilvl0 -\f1\i0\b0\fs22 \cf0 {\listtext \'a5 }Add shortcuts for bigger/smaller font sizes.\ +\ls32\ilvl0 +\f3\i0\b0\fs22 \cf0 {\listtext \'a5 }Add shortcuts for bigger/smaller font sizes.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls30\ilvl0\cf0 {\listtext \'a5 }Command-click a snapshot.\ +\ls33\ilvl0\cf0 {\listtext \'a5 }Command-click a snapshot.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls31\ilvl0\cf0 {\listtext \'a5 }We now print notes and highlights.\ +\ls34\ilvl0\cf0 {\listtext \'a5 }We now print notes and highlights.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls32\ilvl0\cf0 {\listtext \'a5 }Add copy/cut/paste items to the contextual menu, when they apply.\ +\ls35\ilvl0\cf0 {\listtext \'a5 }Add copy/cut/paste items to the contextual menu, when they apply.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls33\ilvl0\cf0 {\listtext \'a5 }You can now make a snapshot of a page by Command-clicking a thumbnail.\ +\ls36\ilvl0\cf0 {\listtext \'a5 }You can now make a snapshot of a page by Command-clicking a thumbnail.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls34\ilvl0\cf0 {\listtext \'a5 }Added Dutch localization.\ +\ls37\ilvl0\cf0 {\listtext \'a5 }Added Dutch localization.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls35\ilvl0\cf0 {\listtext \'a5 }We now do not leave Full Screen when switching to another application.\ +\ls38\ilvl0\cf0 {\listtext \'a5 }We now do not leave Full Screen when switching to another application.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls36\ilvl0\cf0 {\listtext \'a5 }Export notes as RTF.\ +\ls39\ilvl0\cf0 {\listtext \'a5 }Export notes as RTF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls37\ilvl0\cf0 {\listtext \'a5 }Add preference options for default note/highlight colors and text note font.\ +\ls40\ilvl0\cf0 {\listtext \'a5 }Add preference options for default note/highlight colors and text note font.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls38\ilvl0\cf0 {\listtext \'a5 }Add menu item to save the current PDF display settings to be used for new documents.\ +\ls41\ilvl0\cf0 {\listtext \'a5 }Add menu item to save the current PDF display settings to be used for new documents.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls39\ilvl0\cf0 {\listtext \'a5 }Search results from the Find Panel are now also highlighted with a red oval.\ +\ls42\ilvl0\cf0 {\listtext \'a5 }Search results from the Find Panel are now also highlighted with a red oval.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls40\ilvl0\cf0 {\listtext \'a5 }Select search field when opening the Contents pane in full screen mode.\ +\ls43\ilvl0\cf0 {\listtext \'a5 }Select search field when opening the Contents pane in full screen mode.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls41\ilvl0\cf0 {\listtext \'a5 }You can now reset all preferences or all preferences in a pane.\ +\ls44\ilvl0\cf0 {\listtext \'a5 }You can now reset all preferences or all preferences in a pane.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls42\ilvl0\cf0 {\listtext \'a5 }Added Italian localization. (Thanks Andrea Bergia!)\ +\ls45\ilvl0\cf0 {\listtext \'a5 }Added Italian localization. (Thanks Andrea Bergia!)\ {\listtext \'a5 }Screensaver and sleep are now disabled in Presentation mode.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls43\ilvl0\cf0 {\listtext \'a5 }Skim can now return to the last page viewed in a document.\ +\ls46\ilvl0\cf0 {\listtext \'a5 }Skim can now return to the last page viewed in a document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls44\ilvl0\cf0 {\listtext \'a5 }Link tool tips now show the top of the text when the link refers to the (empty) top of a page. \ +\ls47\ilvl0\cf0 {\listtext \'a5 }Link tool tips now show the top of the text when the link refers to the (empty) top of a page. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls45\ilvl0\cf0 {\listtext \'a5 }Skim can now also view separate Skim notes (.skim) files.\ +\ls48\ilvl0\cf0 {\listtext \'a5 }Skim can now also view separate Skim notes (.skim) files.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls46\ilvl0\cf0 {\listtext \'a5 }Using Sparkle for automatic updating. (Thanks Andy Matuschak!)\ +\ls49\ilvl0\cf0 {\listtext \'a5 }Using Sparkle for automatic updating. (Thanks Andy Matuschak!)\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls47\ilvl0\cf0 {\listtext \'a5 }Display the number of pages in the title bar.\ +\ls50\ilvl0\cf0 {\listtext \'a5 }Display the number of pages in the title bar.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls48\ilvl0\cf0 {\listtext \'a5 }Skim can now automatically backup a skim notes file whenever it saves a PDF file.\ +\ls51\ilvl0\cf0 {\listtext \'a5 }Skim can now automatically backup a skim notes file whenever it saves a PDF file.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls49\ilvl0\cf0 {\listtext \'a5 }You can now resize the current note using the arrow keys, when you hold down the Control key.\ +\ls52\ilvl0\cf0 {\listtext \'a5 }You can now resize the current note using the arrow keys, when you hold down the Control key.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls50\ilvl0\cf0 {\listtext \'a5 }Notes are now ordered according to page and location in page.\ +\ls53\ilvl0\cf0 {\listtext \'a5 }Notes are now ordered according to page and location in page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls51\ilvl0\cf0 {\listtext \'a5 }Several improvements of Skim's custom tool-tips.\ +\ls54\ilvl0\cf0 {\listtext \'a5 }Several improvements of Skim's custom tool-tips.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls52\ilvl0\cf0 {\listtext \'a5 }Add a menu item to select the search field.\ +\ls55\ilvl0\cf0 {\listtext \'a5 }Add a menu item to select the search field.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls53\ilvl0\cf0 {\listtext \'a5 }You can now add arrows to a PDF document.\ +\ls56\ilvl0\cf0 {\listtext \'a5 }You can now add arrows to a PDF document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls54\ilvl0\cf0 {\listtext \'a5 }You can now add notes from external .skim files rather than just overwriting them.\ +\ls57\ilvl0\cf0 {\listtext \'a5 }You can now add notes from external .skim files rather than just overwriting them.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls55\ilvl0\cf0 {\listtext \'a5 }PDFSync support. See the Wiki for more information.\ +\ls58\ilvl0\cf0 {\listtext \'a5 }PDFSync support. See the Wiki for more information.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls56\ilvl0\cf0 {\listtext \'a5 }You can now set transparent colors from the color panel. \ +\ls59\ilvl0\cf0 {\listtext \'a5 }You can now set transparent colors from the color panel. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls57\ilvl0\cf0 {\listtext \'a5 }You can now set separate PDF view settigns for full screen mode. \ +\ls60\ilvl0\cf0 {\listtext \'a5 }You can now set separate PDF view settigns for full screen mode. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls58\ilvl0\cf0 {\listtext \'a5 }Add a Look Up in Dictionary item to the contextual menu.\ +\ls61\ilvl0\cf0 {\listtext \'a5 }Add a Look Up in Dictionary item to the contextual menu.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls59\ilvl0\cf0 {\listtext \'a5 }You can now undo edits of notes and highlights.\ +\ls62\ilvl0\cf0 {\listtext \'a5 }You can now undo edits of notes and highlights.\ {\listtext \'a5 }Add a hidden preference (SKActivateFullScreenNavigationAtBottom) to show the navigation buttons in full screen mode only when moving the mouse at the bottom of the screen. \ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls60\ilvl0\cf0 {\listtext \'a5 }Add hidden preferences for the line widths of circles and boxes (SKCircleNoteLineWidth and SKSquareNoteLineWidth).\ +\ls63\ilvl0\cf0 {\listtext \'a5 }Add hidden preferences for the line widths of circles and boxes (SKCircleNoteLineWidth and SKSquareNoteLineWidth).\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls61\ilvl0\cf0 {\listtext \'a5 }New tool modes for ading notes or highlights.\ +\ls64\ilvl0\cf0 {\listtext \'a5 }New tool modes for ading notes or highlights.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\f3\b\fs28 \cf0 \ +\f1\b\fs28 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f4\i\fs26 \cf0 Bugs Fixed\ +\f2\i\fs26 \cf0 Bugs Fixed\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls62\ilvl0 -\f1\i0\b0\fs22 \cf0 {\listtext \'a5 }We now don't edit new text notes, so they can be moved, resized or deleted.\ +\ls65\ilvl0 +\f3\i0\b0\fs22 \cf0 {\listtext \'a5 }We now don't edit new text notes, so they can be moved, resized or deleted.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls63\ilvl0\cf0 {\listtext \'a5 }We now make sure new notes are added to a visible page.\ +\ls66\ilvl0\cf0 {\listtext \'a5 }We now make sure new notes are added to a visible page.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls64\ilvl0\cf0 {\listtext \'a5 }Disable the TOC menu item when there is no TOC.\ +\ls67\ilvl0\cf0 {\listtext \'a5 }Disable the TOC menu item when there is no TOC.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls65\ilvl0\cf0 {\listtext \'a5 }Return to the location that was viewed when reloading a document.\ +\ls68\ilvl0\cf0 {\listtext \'a5 }Return to the location that was viewed when reloading a document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls66\ilvl0\cf0 {\listtext \'a5 }Search text in a PDf file asynchronously, so it does not block Skim.\ +\ls69\ilvl0\cf0 {\listtext \'a5 }Search text in a PDf file asynchronously, so it does not block Skim.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls67\ilvl0\cf0 {\listtext \'a5 }Fix crashes that can appear for links with missing URLs.\ +\ls70\ilvl0\cf0 {\listtext \'a5 }Fix crashes that can appear for links with missing URLs.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls68\ilvl0\cf0 {\listtext \'a5 }Add separators in the Notes menu for categories.\ +\ls71\ilvl0\cf0 {\listtext \'a5 }Add separators in the Notes menu for categories.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls69\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting a PDF-document.\ +\ls72\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting a PDF-document.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls70\ilvl0\cf0 {\listtext \'a5 }Fix typos in the Help and update for new features.\ +\ls73\ilvl0\cf0 {\listtext \'a5 }Fix typos in the Help and update for new features.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls71\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting the document. Unfortunately this disabled tool tips.\ +\ls74\ilvl0\cf0 {\listtext \'a5 }Fix a crasher when reverting the document. Unfortunately this disabled tool tips.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls72\ilvl0\cf0 {\listtext \'a5 }Open the contents pane to display the search term when opening from Spotlight.\ +\ls75\ilvl0\cf0 {\listtext \'a5 }Open the contents pane to display the search term when opening from Spotlight.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls73\ilvl0\cf0 {\listtext \'a5 }Save notes when auto-saving and exporting as PDF.\ +\ls76\ilvl0\cf0 {\listtext \'a5 }Save notes when auto-saving and exporting as PDF.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls74\ilvl0\cf0 {\listtext \'a5 }Remember the width of notes pane.\ +\ls77\ilvl0\cf0 {\listtext \'a5 }Remember the width of notes pane.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls75\ilvl0\cf0 {\listtext \'a5 }Fix leaks leading to excessive memory use.\ +\ls78\ilvl0\cf0 {\listtext \'a5 }Fix leaks leading to excessive memory use.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls76\ilvl0\cf0 {\listtext \'a5 }Fix back-tabbing through notes and links.\ +\ls79\ilvl0\cf0 {\listtext \'a5 }Fix back-tabbing through notes and links.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls77\ilvl0\cf0 {\listtext \'a5 }Zooming using the scroll-wheel now only affects the current window.\ +\ls80\ilvl0\cf0 {\listtext \'a5 }Zooming using the scroll-wheel now only affects the current window.\ \pard\tx220\tx720\tx1440\tx2880\tx4320\tx5760\tx7200\li720\fi-720\ql\qnatural -\ls78\ilvl0\cf0 {\listtext \'a5 }Lazy updating of page thumbnails to avoid slowdown when opening a file.\ +\ls81\ilvl0\cf0 {\listtext \'a5 }Lazy updating of page thumbnails to avoid slowdown when opening a file.\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f3\b\fs28 \cf0 \ +\f1\b\fs28 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural \f0\b0\fs48 \cf0 Colofon -\f3\b\fs28 \ +\f1\b\fs28 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f1\b0\fs24 \cf0 Thanks for using Skim. \ +\f3\b0\fs24 \cf0 Thanks for using Skim. \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural \fs22 \cf0 \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f3\b\fs28 \cf0 About Skim\ +\f1\b\fs28 \cf0 About Skim\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f1\b0\fs22 \cf0 \ +\f3\b0\fs22 \cf0 \ Skim is a PDF Reader and note-taker for OS X. Skim is designed to help you read and annotate scientific papers in PDF.\ \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f4\i\b\fs26 \cf0 Web Site\ +\f2\i\b\fs26 \cf0 Web Site\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f1\i0\b0\fs22 \cf0 \ +\f3\i0\b0\fs22 \cf0 \ The Skim website is at {\field{\*\fldinst{HYPERLINK "http://skim-app.sourceforge.net/"}}{\fldrslt http://skim-app.sourceforge.net}} - check there for current information and ways to find out more about the program and the development efforts.\ \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f4\i\b\fs26 \cf0 Getting Help\ +\f2\i\b\fs26 \cf0 Getting Help\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f1\i0\b0\fs22 \cf0 \ +\f3\i0\b0\fs22 \cf0 \ If you have a problem with using the program and you'd like to talk with other users about it, there is a mailing list set up for discussing using Skim. Information about it is available at {\field{\*\fldinst{HYPERLINK "http://lists.sourceforge.net/mailman/listinfo/skim-app-users"}}{\fldrslt http://lists.sourceforge.net/mailman/listinfo/skim-app-users}}.\ \ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f4\i\b\fs26 \cf0 Reporting Bugs\ +\f2\i\b\fs26 \cf0 Reporting Bugs\ \pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural -\f1\i0\b0\fs22 \cf0 \ +\f3\i0\b0\fs22 \cf0 \ Bug reports should be submitted to the {\field{\*\fldinst{HYPERLINK "http://sourceforge.net/tracker/?group_id=192583&atid=941981"}}{\fldrslt bug tracker}} on SourceForge. -\f5\b Note: -\f1\b0 If you can, please assign the bug report to someone - if you don't personally know any developers, assign the bug to Mike (username mmcc). If you don't assign the bug to someone, nobody may notice it for a long time. Assigning it to someone sends them an email notification.\ +\f4\b Note: +\f3\b0 If you can, please assign the bug report to someone - if you don't personally know any developers, assign the bug to Mike (username mmcc). If you don't assign the bug to someone, nobody may notice it for a long time. Assigning it to someone sends them an email notification.\ } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-29 18:34:24
|
Revision: 2175 http://skim-app.svn.sourceforge.net/skim-app/?rev=2175&view=rev Author: hofman Date: 2007-05-29 11:34:22 -0700 (Tue, 29 May 2007) Log Message: ----------- Make progress sheet generic; add outlet for text field and set the text programmatically, rename nib. Use it also for cropping all pages. Modified Paths: -------------- trunk/Dutch.lproj/Localizable.strings trunk/Dutch.lproj/ProgressSheet.nib/classes.nib trunk/Dutch.lproj/ProgressSheet.nib/info.nib trunk/Dutch.lproj/ProgressSheet.nib/keyedobjects.nib trunk/English.lproj/Localizable.strings trunk/English.lproj/ProgressSheet.nib/classes.nib trunk/English.lproj/ProgressSheet.nib/info.nib trunk/English.lproj/ProgressSheet.nib/keyedobjects.nib trunk/Italian.lproj/Localizable.strings trunk/Italian.lproj/ProgressSheet.nib/classes.nib trunk/Italian.lproj/ProgressSheet.nib/info.nib trunk/Italian.lproj/ProgressSheet.nib/keyedobjects.nib trunk/SKMainWindowController.h trunk/SKMainWindowController.m trunk/Skim.xcodeproj/project.pbxproj trunk/vendorsrc/andymatuschak/Sparkle/Sparkle.xcodeproj/project.pbxproj Added Paths: ----------- trunk/Dutch.lproj/ProgressSheet.nib/ trunk/English.lproj/ProgressSheet.nib/ trunk/Italian.lproj/ProgressSheet.nib/ Removed Paths: ------------- trunk/Dutch.lproj/SaveProgressSheet.nib/ trunk/English.lproj/SaveProgressSheet.nib/ trunk/Italian.lproj/SaveProgressSheet.nib/ Modified: trunk/Dutch.lproj/Localizable.strings =================================================================== (Binary files differ) Copied: trunk/Dutch.lproj/ProgressSheet.nib (from rev 2159, trunk/Dutch.lproj/SaveProgressSheet.nib) Modified: trunk/Dutch.lproj/ProgressSheet.nib/classes.nib =================================================================== --- trunk/Dutch.lproj/SaveProgressSheet.nib/classes.nib 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/Dutch.lproj/ProgressSheet.nib/classes.nib 2007-05-29 18:34:22 UTC (rev 2175) @@ -67,11 +67,12 @@ pageNumberView = NSView; pdfContentBox = NSBox; pdfView = SKPDFView; + progressBar = NSProgressIndicator; + progressField = NSTextField; + progressSheet = NSWindow; rightSideBox = NSBox; rightSideButton = NSSegmentedControl; rightSideContentBox = NSBox; - saveProgressBar = NSProgressIndicator; - saveProgressSheet = NSWindow; scaleField = NSTextField; searchBox = SKCollapsibleView; searchField = NSSearchField; Modified: trunk/Dutch.lproj/ProgressSheet.nib/info.nib =================================================================== --- trunk/Dutch.lproj/SaveProgressSheet.nib/info.nib 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/Dutch.lproj/ProgressSheet.nib/info.nib 2007-05-29 18:34:22 UTC (rev 2175) @@ -6,10 +6,6 @@ <string>69 58 356 240 0 0 1440 938 </string> <key>IBFramework Version</key> <string>446.1</string> - <key>IBOpenObjects</key> - <array> - <integer>5</integer> - </array> <key>IBSystem Version</key> <string>8P135</string> </dict> Modified: trunk/Dutch.lproj/ProgressSheet.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/English.lproj/Localizable.strings =================================================================== (Binary files differ) Copied: trunk/English.lproj/ProgressSheet.nib (from rev 2174, trunk/English.lproj/SaveProgressSheet.nib) Modified: trunk/English.lproj/ProgressSheet.nib/classes.nib =================================================================== --- trunk/English.lproj/SaveProgressSheet.nib/classes.nib 2007-05-29 15:13:39 UTC (rev 2174) +++ trunk/English.lproj/ProgressSheet.nib/classes.nib 2007-05-29 18:34:22 UTC (rev 2175) @@ -67,11 +67,12 @@ pageNumberView = NSView; pdfContentBox = NSBox; pdfView = SKPDFView; + progressBar = NSProgressIndicator; + progressField = NSTextField; + progressSheet = NSWindow; rightSideBox = NSBox; rightSideButton = NSSegmentedControl; rightSideContentBox = NSBox; - saveProgressBar = NSProgressIndicator; - saveProgressSheet = NSWindow; scaleField = NSTextField; searchBox = SKCollapsibleView; searchField = NSSearchField; Modified: trunk/English.lproj/ProgressSheet.nib/info.nib =================================================================== --- trunk/English.lproj/SaveProgressSheet.nib/info.nib 2007-05-29 15:13:39 UTC (rev 2174) +++ trunk/English.lproj/ProgressSheet.nib/info.nib 2007-05-29 18:34:22 UTC (rev 2175) @@ -11,6 +11,6 @@ <integer>5</integer> </array> <key>IBSystem Version</key> - <string>8L127</string> + <string>8P135</string> </dict> </plist> Modified: trunk/English.lproj/ProgressSheet.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/Italian.lproj/Localizable.strings =================================================================== (Binary files differ) Copied: trunk/Italian.lproj/ProgressSheet.nib (from rev 2159, trunk/Italian.lproj/SaveProgressSheet.nib) Modified: trunk/Italian.lproj/ProgressSheet.nib/classes.nib =================================================================== --- trunk/Italian.lproj/SaveProgressSheet.nib/classes.nib 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/Italian.lproj/ProgressSheet.nib/classes.nib 2007-05-29 18:34:22 UTC (rev 2175) @@ -67,11 +67,12 @@ pageNumberView = NSView; pdfContentBox = NSBox; pdfView = SKPDFView; + progressBar = NSProgressIndicator; + progressField = NSTextField; + progressSheet = NSWindow; rightSideBox = NSBox; rightSideButton = NSSegmentedControl; rightSideContentBox = NSBox; - saveProgressBar = NSProgressIndicator; - saveProgressSheet = NSWindow; scaleField = NSTextField; searchBox = SKCollapsibleView; searchField = NSSearchField; Modified: trunk/Italian.lproj/ProgressSheet.nib/info.nib =================================================================== --- trunk/Italian.lproj/SaveProgressSheet.nib/info.nib 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/Italian.lproj/ProgressSheet.nib/info.nib 2007-05-29 18:34:22 UTC (rev 2175) @@ -3,7 +3,7 @@ <plist version="1.0"> <dict> <key>IBDocumentLocation</key> - <string>130 100 356 240 0 0 1024 746 </string> + <string>211 138 356 240 0 0 1440 938 </string> <key>IBFramework Version</key> <string>446.1</string> <key>IBOpenObjects</key> Modified: trunk/Italian.lproj/ProgressSheet.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/SKMainWindowController.h =================================================================== --- trunk/SKMainWindowController.h 2007-05-29 15:13:39 UTC (rev 2174) +++ trunk/SKMainWindowController.h 2007-05-29 18:34:22 UTC (rev 2175) @@ -151,8 +151,9 @@ IBOutlet NSWindow *bookmarkSheet; IBOutlet NSTextField *bookmarkField; - IBOutlet NSWindow *saveProgressSheet; - IBOutlet NSProgressIndicator *saveProgressBar; + IBOutlet NSWindow *progressSheet; + IBOutlet NSProgressIndicator *progressBar; + IBOutlet NSTextField *progressField; IBOutlet NSWindow *passwordSheet; IBOutlet NSTextField *passwordField; Modified: trunk/SKMainWindowController.m =================================================================== --- trunk/SKMainWindowController.m 2007-05-29 15:13:39 UTC (rev 2174) +++ trunk/SKMainWindowController.m 2007-05-29 18:34:22 UTC (rev 2175) @@ -69,6 +69,7 @@ #import "PDFSelection_SKExtensions.h" #import "SKToolbarItem.h" #import "NSValue_SKExtensions.h" +#import "NSString_SKExtensions.h" #define SEGMENTED_CONTROL_HEIGHT 25.0 #define WINDOW_X_DELTA 0.0 @@ -161,7 +162,7 @@ [toolbarItems release]; [pdfOutlineItems release]; [savedNormalSetup release]; - [saveProgressSheet release]; + [progressSheet release]; [super dealloc]; } @@ -1055,16 +1056,38 @@ NSRect rect[2] = {NSIntegralRect([pdfView currentSelectionRect]), NSZeroRect}; NSArray *rectArray; if (NSIsEmptyRect(rect[0])) { + if (progressSheet == nil) { + if ([NSBundle loadNibNamed:@"ProgressSheet" owner:self]) { + [progressBar setUsesThreadedAnimation:YES]; + } else { + NSLog(@"Failed to load ProgressSheet.nib"); + return; + } + } + int i, j, count = [[pdfView document] pageCount]; rect[0] = rect[1] = NSZeroRect; + + [progressBar setMaxValue:(double)MIN(18, count)]; + [progressBar setDoubleValue:0.0]; + [progressField setStringValue:[NSLocalizedString(@"Cropping Pages", @"Message for progress sheet") stringByAppendingEllipsis]]; + + [NSApp beginSheet:progressSheet modalForWindow:[self window] modalDelegate:self didEndSelector:NULL contextInfo:NULL]; if (count < 18) { - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { rect[i % 2] = NSUnionRect(rect[i % 2], [[[pdfView document] pageAtIndex:i] foregroundBox]); + [progressBar setDoubleValue:(double)i]; + [progressBar displayIfNeeded]; + } } else { int start[3] = {0, count / 2 - 3, count - 6}; - for (j = 0; j < 3; j++) - for (i = start[j]; i < start[j] + 6; i++) + for (j = 0; j < 3; j++) { + for (i = start[j]; i < start[j] + 6; i++) { rect[i % 2] = NSUnionRect(rect[i % 2], [[[pdfView document] pageAtIndex:i] foregroundBox]); + [progressBar setDoubleValue:(double)(3 * j + i)]; + [progressBar displayIfNeeded]; + } + } } float w = fmax(NSWidth(rect[0]), NSWidth(rect[1])); float h = fmax(NSHeight(rect[0]), NSHeight(rect[1])); @@ -1077,14 +1100,41 @@ [self cropPagesToRects:rectArray]; [pdfView setCurrentSelectionRect:NSZeroRect]; + + [NSApp endSheet:progressSheet]; + [progressSheet orderOut:self]; } - (IBAction)autoCropAll:(id)sender { + if (progressSheet == nil) { + if ([NSBundle loadNibNamed:@"ProgressSheet" owner:self]) { + [progressBar setUsesThreadedAnimation:YES]; + } else { + NSLog(@"Failed to load ProgressSheet.nib"); + return; + } + } + NSMutableArray *rectArray = [NSMutableArray array]; int i, iMax = [[pdfView document] pageCount]; - for (i = 0; i < iMax; i++) + + [progressBar setMaxValue:(double)iMax]; + [progressBar setDoubleValue:0.0]; + [progressField setStringValue:[NSLocalizedString(@"Cropping Pages", @"Message for progress sheet") stringByAppendingEllipsis]]; + + [NSApp beginSheet:progressSheet modalForWindow:[self window] modalDelegate:self didEndSelector:NULL contextInfo:NULL]; + + for (i = 0; i < iMax; i++) { [rectArray addObject:[NSValue valueWithRect:[[[pdfView document] pageAtIndex:i] foregroundBox]]]; + [progressBar setDoubleValue:(double)i]; + [progressBar displayIfNeeded]; + if (i && i % 10 == 0) + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + } [self cropPagesToRects:rectArray]; + + [NSApp endSheet:progressSheet]; + [progressSheet orderOut:self]; } - (IBAction)autoSelectContent:(id)sender { @@ -2148,37 +2198,33 @@ } } -- (void)saveProgressSheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { - [saveProgressSheet close]; -} - - (void)handleDocumentBeginWrite:(NSNotification *)notification { - if (saveProgressSheet == nil) { - if (NO == [NSBundle loadNibNamed:@"SaveProgressSheet" owner:self]) { - NSLog(@"Failed to load SaveProgressSheet.nib"); + if (progressSheet == nil) { + if ([NSBundle loadNibNamed:@"ProgressSheet" owner:self]) { + [progressBar setUsesThreadedAnimation:YES]; + } else { + NSLog(@"Failed to load ProgressSheet.nib"); return; } } // Establish maximum and current value for progress bar. - [saveProgressBar setMaxValue: (double)[[pdfView document] pageCount]]; - [saveProgressBar setDoubleValue: 0.0]; + [progressBar setMaxValue:(double)[[pdfView document] pageCount]]; + [progressBar setDoubleValue:0.0]; + [progressField setStringValue:[NSLocalizedString(@"Exporting PDF", @"Message for progress sheet") stringByAppendingEllipsis]]; // Bring up the save panel as a sheet. - [NSApp beginSheet:saveProgressSheet - modalForWindow:[self window] - modalDelegate:self - didEndSelector:@selector(saveProgressSheetDidEnd:returnCode:contextInfo:) - contextInfo:NULL]; + [NSApp beginSheet:progressSheet modalForWindow:[self window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL]; } - (void)handleDocumentEndWrite:(NSNotification *)notification { - [NSApp endSheet:saveProgressSheet]; + [NSApp endSheet:progressSheet]; + [progressSheet orderOut:self]; } - (void)handleDocumentEndPageWrite:(NSNotification *)notification { - [saveProgressBar setDoubleValue: [[[notification userInfo] objectForKey:@"PDFDocumentPageIndex"] floatValue]]; - [saveProgressBar displayIfNeeded]; + [progressBar setDoubleValue: [[[notification userInfo] objectForKey:@"PDFDocumentPageIndex"] floatValue]]; + [progressBar displayIfNeeded]; } #pragma mark KVO Modified: trunk/Skim.xcodeproj/project.pbxproj =================================================================== --- trunk/Skim.xcodeproj/project.pbxproj 2007-05-29 15:13:39 UTC (rev 2174) +++ trunk/Skim.xcodeproj/project.pbxproj 2007-05-29 18:34:22 UTC (rev 2175) @@ -76,7 +76,6 @@ CE2DE4EE0B85DB6300D0DA12 /* NSCursor_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2DE4ED0B85DB6300D0DA12 /* NSCursor_SKExtensions.m */; }; CE2DE4FD0B85DBD400D0DA12 /* SKPDFHoverWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2DE4FC0B85DBD400D0DA12 /* SKPDFHoverWindow.m */; }; CE2DE50D0B85DC4000D0DA12 /* PDFPage_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2DE50C0B85DC4000D0DA12 /* PDFPage_SKExtensions.m */; }; - CE2DEAA30B860A7000D0DA12 /* SaveProgressSheet.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE2DEA9D0B860A7000D0DA12 /* SaveProgressSheet.nib */; }; CE2DEB1C0B8618DE00D0DA12 /* SKFindController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2DEB1B0B8618DE00D0DA12 /* SKFindController.m */; }; CE2DEB920B86206400D0DA12 /* FindPanel.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE2DEB900B86206400D0DA12 /* FindPanel.nib */; }; CE2DED6C0B86334900D0DA12 /* BDSKFindFieldEditor.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2DED6B0B86334900D0DA12 /* BDSKFindFieldEditor.m */; }; @@ -160,6 +159,7 @@ CE7469180B7F40B700CBF969 /* Skim.icns in Resources */ = {isa = PBXBuildFile; fileRef = CE7469170B7F40B600CBF969 /* Skim.icns */; }; CE7C5D050BD8062C0011315D /* ArrowNoteAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE7C5D040BD8062C0011315D /* ArrowNoteAdorn.tiff */; }; CE7C5D190BD8086C0011315D /* ToolbarArrowNote.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE7C5D180BD8086C0011315D /* ToolbarArrowNote.tiff */; }; + CE9A87930C0C9E9A004F1F97 /* ProgressSheet.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE9A878D0C0C9E9A004F1F97 /* ProgressSheet.nib */; }; CE9C423C0B8B5633004AD8CF /* PreferenceWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = CE9C42360B8B5633004AD8CF /* PreferenceWindow.nib */; }; CE9DC2E90B9F131900D64F28 /* HighlightNoteAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE9DC2E70B9F131800D64F28 /* HighlightNoteAdorn.tiff */; }; CE9DC2EA0B9F131900D64F28 /* ToolbarHighlightNote.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE9DC2E80B9F131800D64F28 /* ToolbarHighlightNote.tiff */; }; @@ -329,7 +329,6 @@ A489FDCC0BC8E90100BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/FindPanel.nib; sourceTree = "<group>"; }; A489FDCF0BC8E90700BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/ReleaseNotes.nib; sourceTree = "<group>"; }; A489FDD20BC8E90C00BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/ConversionProgressWindow.nib; sourceTree = "<group>"; }; - A489FDD50BC8E91100BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/SaveProgressSheet.nib; sourceTree = "<group>"; }; A489FDD80BC8E91700BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/BookmarksWindow.nib; sourceTree = "<group>"; }; A489FDDB0BC8E91B00BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Italian; path = Italian.lproj/Credits.rtf; sourceTree = "<group>"; }; A489FDE10BC8E93100BA14DD /* Italian */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Italian; path = Italian.lproj/InfoPlist.strings; sourceTree = "<group>"; }; @@ -381,7 +380,6 @@ CE2DE4FC0B85DBD400D0DA12 /* SKPDFHoverWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKPDFHoverWindow.m; sourceTree = "<group>"; }; CE2DE50B0B85DC4000D0DA12 /* PDFPage_SKExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PDFPage_SKExtensions.h; sourceTree = "<group>"; }; CE2DE50C0B85DC4000D0DA12 /* PDFPage_SKExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PDFPage_SKExtensions.m; sourceTree = "<group>"; }; - CE2DEA9E0B860A7000D0DA12 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/SaveProgressSheet.nib; sourceTree = "<group>"; }; CE2DEB1A0B8618DE00D0DA12 /* SKFindController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKFindController.h; sourceTree = "<group>"; }; CE2DEB1B0B8618DE00D0DA12 /* SKFindController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKFindController.m; sourceTree = "<group>"; }; CE2DEB910B86206400D0DA12 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/FindPanel.nib; sourceTree = "<group>"; }; @@ -433,7 +431,6 @@ CE485B8A0BC4429700FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Dutch; path = Dutch.lproj/FindPanel.nib; sourceTree = "<group>"; }; CE485B8D0BC4429C00FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Dutch; path = Dutch.lproj/ReleaseNotes.nib; sourceTree = "<group>"; }; CE485B900BC442A200FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Dutch; path = Dutch.lproj/ConversionProgressWindow.nib; sourceTree = "<group>"; }; - CE485B930BC442A800FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Dutch; path = Dutch.lproj/SaveProgressSheet.nib; sourceTree = "<group>"; }; CE485B960BC442BA00FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Dutch; path = Dutch.lproj/InfoPlist.strings; sourceTree = "<group>"; }; CE485B990BC442C000FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Dutch; path = Dutch.lproj/Localizable.strings; sourceTree = "<group>"; }; CE485B9C0BC442CB00FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Dutch; path = Dutch.lproj/BookmarksWindow.nib; sourceTree = "<group>"; }; @@ -512,6 +509,9 @@ CE7C5D040BD8062C0011315D /* ArrowNoteAdorn.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = ArrowNoteAdorn.tiff; path = Images/ArrowNoteAdorn.tiff; sourceTree = "<group>"; }; CE7C5D180BD8086C0011315D /* ToolbarArrowNote.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = ToolbarArrowNote.tiff; path = Images/ToolbarArrowNote.tiff; sourceTree = "<group>"; }; CE87EF690BA9FF5A0027BBDD /* skimhelp.css */ = {isa = PBXFileReference; explicitFileType = text; fileEncoding = 30; name = skimhelp.css; path = "English.lproj/Skim Help/sty/skimhelp.css"; sourceTree = "<group>"; }; + CE9A878E0C0C9E9A004F1F97 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/ProgressSheet.nib; sourceTree = "<group>"; }; + CE9A87960C0C9EA3004F1F97 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Dutch; path = Dutch.lproj/ProgressSheet.nib; sourceTree = "<group>"; }; + CE9A87970C0C9EA7004F1F97 /* Italian */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path = Italian.lproj/ProgressSheet.nib; sourceTree = "<group>"; }; CE9C42370B8B5633004AD8CF /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/PreferenceWindow.nib; sourceTree = "<group>"; }; CE9DC2E70B9F131800D64F28 /* HighlightNoteAdorn.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = HighlightNoteAdorn.tiff; path = Images/HighlightNoteAdorn.tiff; sourceTree = "<group>"; }; CE9DC2E80B9F131800D64F28 /* ToolbarHighlightNote.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = ToolbarHighlightNote.tiff; path = Images/ToolbarHighlightNote.tiff; sourceTree = "<group>"; }; @@ -672,7 +672,7 @@ CE1E25660BDA61E80011D9DD /* ReadNotesAccessoryView.nib */, CEF717560B90DEEF003A2771 /* ReleaseNotes.nib */, F977515E0B37460100DF673B /* ConversionProgressWindow.nib */, - CE2DEA9D0B860A7000D0DA12 /* SaveProgressSheet.nib */, + CE9A878D0C0C9E9A004F1F97 /* ProgressSheet.nib */, CE4A65CA0BAB1E2E004AD07D /* BookmarksWindow.nib */, 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */, CE54AA8E0BBC037400008750 /* ReleaseNotes.rtf */, @@ -1156,7 +1156,6 @@ CE7468810B7F3C0000CBF969 /* zoomInCursor.tiff in Resources */, CE7468820B7F3C0000CBF969 /* zoomOutCursor.tiff in Resources */, CE15832F0BA0740000D5B03F /* UnderlineNoteAdorn.tiff in Resources */, - CE2DEAA30B860A7000D0DA12 /* SaveProgressSheet.nib in Resources */, CE2DEB920B86206400D0DA12 /* FindPanel.nib in Resources */, CE9C423C0B8B5633004AD8CF /* PreferenceWindow.nib in Resources */, CEF707240B8F8EFC003A2771 /* SnapshotWindow.nib in Resources */, @@ -1185,6 +1184,7 @@ CE01D08C0C07157200FA32EF /* ToolbarZoomToSelection.tiff in Resources */, CE48BBB60C08AD7000A166C6 /* notesTemplate.txt in Resources */, CE48BBB70C08AD7000A166C6 /* notesTemplate.rtf in Resources */, + CE9A87930C0C9E9A004F1F97 /* ProgressSheet.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1442,16 +1442,6 @@ name = ReadNotesAccessoryView.nib; sourceTree = "<group>"; }; - CE2DEA9D0B860A7000D0DA12 /* SaveProgressSheet.nib */ = { - isa = PBXVariantGroup; - children = ( - CE2DEA9E0B860A7000D0DA12 /* English */, - CE485B930BC442A800FA7109 /* Dutch */, - A489FDD50BC8E91100BA14DD /* Italian */, - ); - name = SaveProgressSheet.nib; - sourceTree = "<group>"; - }; CE2DEB900B86206400D0DA12 /* FindPanel.nib */ = { isa = PBXVariantGroup; children = ( @@ -1522,6 +1512,16 @@ name = ZoomValues.strings; sourceTree = "<group>"; }; + CE9A878D0C0C9E9A004F1F97 /* ProgressSheet.nib */ = { + isa = PBXVariantGroup; + children = ( + CE9A878E0C0C9E9A004F1F97 /* English */, + CE9A87960C0C9EA3004F1F97 /* Dutch */, + CE9A87970C0C9EA7004F1F97 /* Italian */, + ); + name = ProgressSheet.nib; + sourceTree = "<group>"; + }; CE9C42360B8B5633004AD8CF /* PreferenceWindow.nib */ = { isa = PBXVariantGroup; children = ( Modified: trunk/vendorsrc/andymatuschak/Sparkle/Sparkle.xcodeproj/project.pbxproj =================================================================== --- trunk/vendorsrc/andymatuschak/Sparkle/Sparkle.xcodeproj/project.pbxproj 2007-05-29 15:13:39 UTC (rev 2174) +++ trunk/vendorsrc/andymatuschak/Sparkle/Sparkle.xcodeproj/project.pbxproj 2007-05-29 18:34:22 UTC (rev 2175) @@ -103,7 +103,7 @@ 61B5F8E409C4CE3C00B25A18 /* SUUpdater.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SUUpdater.m; sourceTree = "<group>"; }; 61B5F8E509C4CE3C00B25A18 /* NSFileManager+Authentication.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+Authentication.m"; sourceTree = "<group>"; }; 61B5F8F609C4CEB300B25A18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; }; - 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sparkle Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 61B5F90209C4CEE200B25A18 /* Sparkle Test App.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "Sparkle Test App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 61B5F90409C4CEE200B25A18 /* Test Application-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "Test Application-Info.plist"; path = "Test Application/Test Application-Info.plist"; sourceTree = "<group>"; }; 61B5F92409C4CFC900B25A18 /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Test Application/main.m"; sourceTree = "<group>"; }; 61B5F92B09C4CFD800B25A18 /* English */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.strings; name = English; path = "Test Application/English.lproj/InfoPlist.strings"; sourceTree = "<group>"; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-29 15:13:50
|
Revision: 2174 http://skim-app.svn.sourceforge.net/skim-app/?rev=2174&view=rev Author: hofman Date: 2007-05-29 08:13:39 -0700 (Tue, 29 May 2007) Log Message: ----------- Don't copy headers (why does xcode add them?) Modified Paths: -------------- trunk/Skim.xcodeproj/project.pbxproj Modified: trunk/Skim.xcodeproj/project.pbxproj =================================================================== --- trunk/Skim.xcodeproj/project.pbxproj 2007-05-28 22:47:33 UTC (rev 2173) +++ trunk/Skim.xcodeproj/project.pbxproj 2007-05-29 15:13:39 UTC (rev 2174) @@ -96,9 +96,7 @@ CE4190C40B94963A00ECF819 /* ToolbarCircleNote.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE4190C20B94963A00ECF819 /* ToolbarCircleNote.tiff */; }; CE4190C50B94963A00ECF819 /* ToolbarTextNote.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE4190C30B94963A00ECF819 /* ToolbarTextNote.tiff */; }; CE41A6CC0B975E5000ECF819 /* Skim.sdef in Resources */ = {isa = PBXBuildFile; fileRef = CE41A6CB0B975E5000ECF819 /* Skim.sdef */; }; - CE41B2A60C08CFA900E36EB7 /* NSArray_SKExtensions.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE41B2A40C08CFA900E36EB7 /* NSArray_SKExtensions.h */; }; CE41B2A70C08CFA900E36EB7 /* NSArray_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41B2A50C08CFA900E36EB7 /* NSArray_SKExtensions.m */; }; - CE41B2CB0C08D17100E36EB7 /* NSValue_SKExtensions.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE41B2C90C08D17100E36EB7 /* NSValue_SKExtensions.h */; }; CE41B2CC0C08D17100E36EB7 /* NSValue_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41B2CA0C08D17100E36EB7 /* NSValue_SKExtensions.m */; }; CE4294A30BBD29120016FDC2 /* SKReadingBar.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4294A20BBD29120016FDC2 /* SKReadingBar.m */; }; CE4373B40BB5440E00A56987 /* PSDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = CE4373B30BB5440E00A56987 /* PSDocument.icns */; }; @@ -110,7 +108,6 @@ CE468C460BF1F0F60007AA12 /* SquareNoteToolAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE468C3E0BF1F0F60007AA12 /* SquareNoteToolAdorn.tiff */; }; CE468C470BF1F0F60007AA12 /* TextNoteToolAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE468C3F0BF1F0F60007AA12 /* TextNoteToolAdorn.tiff */; }; CE468C480BF1F0F60007AA12 /* AnchoredNoteToolAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE468C400BF1F0F60007AA12 /* AnchoredNoteToolAdorn.tiff */; }; - CE48BAD70C089EA300A166C6 /* SKTemplateParser.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE48BAD50C089EA300A166C6 /* SKTemplateParser.h */; }; CE48BAD80C089EA300A166C6 /* SKTemplateParser.m in Sources */ = {isa = PBXBuildFile; fileRef = CE48BAD60C089EA300A166C6 /* SKTemplateParser.m */; }; CE48BBB60C08AD7000A166C6 /* notesTemplate.txt in Resources */ = {isa = PBXBuildFile; fileRef = CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */; }; CE48BBB70C08AD7000A166C6 /* notesTemplate.rtf in Resources */ = {isa = PBXBuildFile; fileRef = CE48BBB50C08AD7000A166C6 /* notesTemplate.rtf */; }; @@ -266,9 +263,6 @@ dstSubfolderSpec = 10; files = ( CE2BD8450BD4135600A5F4DB /* Sparkle.framework in CopyFiles */, - CE48BAD70C089EA300A166C6 /* SKTemplateParser.h in CopyFiles */, - CE41B2A60C08CFA900E36EB7 /* NSArray_SKExtensions.h in CopyFiles */, - CE41B2CB0C08D17100E36EB7 /* NSValue_SKExtensions.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-28 22:47:41
|
Revision: 2173 http://skim-app.svn.sourceforge.net/skim-app/?rev=2173&view=rev Author: hofman Date: 2007-05-28 15:47:33 -0700 (Mon, 28 May 2007) Log Message: ----------- Add credits for apple remote controller. Modified Paths: -------------- trunk/Dutch.lproj/Credits.rtf trunk/English.lproj/Credits.rtf trunk/Italian.lproj/Credits.rtf Modified: trunk/Dutch.lproj/Credits.rtf =================================================================== --- trunk/Dutch.lproj/Credits.rtf 2007-05-28 16:22:03 UTC (rev 2172) +++ trunk/Dutch.lproj/Credits.rtf 2007-05-28 22:47:33 UTC (rev 2173) @@ -25,6 +25,7 @@ Met speciale dank \f1\b0 \ Andy Matuschak voor {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org"}}{\fldrslt Sparkle}}\ +Martin Kahr voor {\field{\*\fldinst{HYPERLINK "http://www.martinkahr.com/source-code"}}{\fldrslt Apple Remote Controller}}\ \ \f0\b Garantieinformation\ Modified: trunk/English.lproj/Credits.rtf =================================================================== --- trunk/English.lproj/Credits.rtf 2007-05-28 16:22:03 UTC (rev 2172) +++ trunk/English.lproj/Credits.rtf 2007-05-28 22:47:33 UTC (rev 2173) @@ -2,6 +2,7 @@ {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 ArialMT; } {\colortbl;\red255\green255\blue255;} +\vieww10500\viewh9000\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc \f0\b\fs24 \cf0 Website @@ -25,6 +26,7 @@ With special thanks \f1\b0 \ Andy Matuschak for {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org"}}{\fldrslt Sparkle}}\ +Martin Kahr for {\field{\*\fldinst{HYPERLINK "http://www.martinkahr.com/source-code"}}{\fldrslt Apple Remote Controller}}\ \ \f0\b Warranty Information\ Modified: trunk/Italian.lproj/Credits.rtf =================================================================== --- trunk/Italian.lproj/Credits.rtf 2007-05-28 16:22:03 UTC (rev 2172) +++ trunk/Italian.lproj/Credits.rtf 2007-05-28 22:47:33 UTC (rev 2173) @@ -25,6 +25,7 @@ Ringraziamenti speciali \f1\b0 \ Andy Matuschak per {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org"}}{\fldrslt Sparkle}}\ +Martin Kahr per {\field{\*\fldinst{HYPERLINK "http://www.martinkahr.com/source-code"}}{\fldrslt Apple Remote Controller}}\ \ \f0\b Informazioni Garanzia\ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-28 16:22:06
|
Revision: 2172 http://skim-app.svn.sourceforge.net/skim-app/?rev=2172&view=rev Author: hofman Date: 2007-05-28 09:22:03 -0700 (Mon, 28 May 2007) Log Message: ----------- Use only ascii characters in text template. Modified Paths: -------------- trunk/notesTemplate.txt Modified: trunk/notesTemplate.txt =================================================================== --- trunk/notesTemplate.txt 2007-05-28 14:52:29 UTC (rev 2171) +++ trunk/notesTemplate.txt 2007-05-28 16:22:03 UTC (rev 2172) @@ -1,5 +1,5 @@ <$notes> -• <$type.typeName/>, page <$pageIndex.numberByAddingOne/> +* <$type.typeName/>, page <$pageIndex.numberByAddingOne/> <$contents?> <$contents/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-28 14:52:30
|
Revision: 2171 http://skim-app.svn.sourceforge.net/skim-app/?rev=2171&view=rev Author: hofman Date: 2007-05-28 07:52:29 -0700 (Mon, 28 May 2007) Log Message: ----------- Fix typos. Modified Paths: -------------- trunk/NSString_SKExtensions.m trunk/NSValue_SKExtensions.m Modified: trunk/NSString_SKExtensions.m =================================================================== --- trunk/NSString_SKExtensions.m 2007-05-28 11:19:13 UTC (rev 2170) +++ trunk/NSString_SKExtensions.m 2007-05-28 14:52:29 UTC (rev 2171) @@ -263,7 +263,7 @@ } - (float)rectY { - return NSRectFromString(self).origin.x; + return NSRectFromString(self).origin.y; } - (float)rectWidth { Modified: trunk/NSValue_SKExtensions.m =================================================================== --- trunk/NSValue_SKExtensions.m 2007-05-28 11:19:13 UTC (rev 2170) +++ trunk/NSValue_SKExtensions.m 2007-05-28 14:52:29 UTC (rev 2171) @@ -59,7 +59,7 @@ } - (float)rectY { - return [self rectValue].origin.x; + return [self rectValue].origin.y; } - (float)rectWidth { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-28 11:19:14
|
Revision: 2170 http://skim-app.svn.sourceforge.net/skim-app/?rev=2170&view=rev Author: hofman Date: 2007-05-28 04:19:13 -0700 (Mon, 28 May 2007) Log Message: ----------- Rename method so it will be used implicitly in templates. Modified Paths: -------------- trunk/SKTemplateParser.h trunk/SKTemplateParser.m Modified: trunk/SKTemplateParser.h =================================================================== --- trunk/SKTemplateParser.h 2007-05-28 10:27:18 UTC (rev 2169) +++ trunk/SKTemplateParser.h 2007-05-28 11:19:13 UTC (rev 2170) @@ -81,5 +81,4 @@ @interface NSData (SKTemplateParser) - (NSString *)xmlString; -- (NSString *)utf8String; @end Modified: trunk/SKTemplateParser.m =================================================================== --- trunk/SKTemplateParser.m 2007-05-28 10:27:18 UTC (rev 2169) +++ trunk/SKTemplateParser.m 2007-05-28 11:19:13 UTC (rev 2170) @@ -689,7 +689,7 @@ @implementation NSData (SKTemplateParser) -- (NSString *)utf8String { +- (NSString *)stringDescription { return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-28 10:27:23
|
Revision: 2169 http://skim-app.svn.sourceforge.net/skim-app/?rev=2169&view=rev Author: hofman Date: 2007-05-28 03:27:18 -0700 (Mon, 28 May 2007) Log Message: ----------- Fix xmlString method for templating. Add method to represent raw data as a string. Modified Paths: -------------- trunk/SKTemplateParser.h trunk/SKTemplateParser.m Modified: trunk/SKTemplateParser.h =================================================================== --- trunk/SKTemplateParser.h 2007-05-27 21:55:44 UTC (rev 2168) +++ trunk/SKTemplateParser.h 2007-05-28 10:27:18 UTC (rev 2169) @@ -81,4 +81,5 @@ @interface NSData (SKTemplateParser) - (NSString *)xmlString; +- (NSString *)utf8String; @end Modified: trunk/SKTemplateParser.m =================================================================== --- trunk/SKTemplateParser.m 2007-05-27 21:55:44 UTC (rev 2168) +++ trunk/SKTemplateParser.m 2007-05-28 10:27:18 UTC (rev 2169) @@ -680,7 +680,7 @@ } - (NSData *)RTFRepresentation { - return [self dataFromRange:NSMakeRange(0, [self length]) documentAttributes:nil error:NULL]; + return [self RTFFromRange:NSMakeRange(0, [self length]) documentAttributes:nil]; } @end @@ -689,15 +689,21 @@ @implementation NSData (SKTemplateParser) +- (NSString *)utf8String { + return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease]; +} + - (NSString *)xmlString { NSData *data = [NSPropertyListSerialization dataFromPropertyList:self format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL]; NSMutableString *string = [[[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; - int start = NSMaxRange([string rangeOfString:@"<data>"]); - int end = [string rangeOfString:@"</data>" options:NSBackwardsSearch].location; - if (start == NSNotFound || end == NSNotFound) + int loc = NSMaxRange([string rangeOfString:@"<data>"]); + if (loc == NSNotFound) return nil; - [string deleteCharactersInRange:NSMakeRange(0, start)]; - [string deleteCharactersInRange:NSMakeRange(end, [string length] - end)]; + [string deleteCharactersInRange:NSMakeRange(0, loc)]; + loc = [string rangeOfString:@"</data>" options:NSBackwardsSearch].location; + if (loc == NSNotFound) + return nil; + [string deleteCharactersInRange:NSMakeRange(loc, [string length] - loc)]; return string; } @@ -718,12 +724,14 @@ - (NSString *)xmlString { NSData *data = [NSPropertyListSerialization dataFromPropertyList:self format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL]; NSMutableString *string = [[[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; - int start = NSMaxRange([string rangeOfString:@"<string>"]); - int end = [string rangeOfString:@"</string>" options:NSBackwardsSearch].location; - if (start == NSNotFound || end == NSNotFound) + int loc = NSMaxRange([string rangeOfString:@"<string>"]); + if (loc == NSNotFound) return self; - [string deleteCharactersInRange:NSMakeRange(0, start)]; - [string deleteCharactersInRange:NSMakeRange(end, [string length] - end)]; + [string deleteCharactersInRange:NSMakeRange(0, loc)]; + loc = [string rangeOfString:@"</string>" options:NSBackwardsSearch].location; + if (loc == NSNotFound) + return self; + [string deleteCharactersInRange:NSMakeRange(loc, [string length] - loc)]; return string; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-27 21:55:52
|
Revision: 2168 http://skim-app.svn.sourceforge.net/skim-app/?rev=2168&view=rev Author: hofman Date: 2007-05-27 14:55:44 -0700 (Sun, 27 May 2007) Log Message: ----------- Fix xmlString methods. Modified Paths: -------------- trunk/SKTemplateParser.m Modified: trunk/SKTemplateParser.m =================================================================== --- trunk/SKTemplateParser.m 2007-05-27 09:28:07 UTC (rev 2167) +++ trunk/SKTemplateParser.m 2007-05-27 21:55:44 UTC (rev 2168) @@ -692,12 +692,12 @@ - (NSString *)xmlString { NSData *data = [NSPropertyListSerialization dataFromPropertyList:self format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL]; NSMutableString *string = [[[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; - NSRange range = [string rangeOfString:@"<data>"]; - if (range.location != NSNotFound) - [string deleteCharactersInRange:NSMakeRange(0, range.location)]; - range = [string rangeOfString:@"</data>" options:NSBackwardsSearch]; - if (range.location != NSNotFound) - [string deleteCharactersInRange:NSMakeRange(range.location, [string length] - range.location)]; + int start = NSMaxRange([string rangeOfString:@"<data>"]); + int end = [string rangeOfString:@"</data>" options:NSBackwardsSearch].location; + if (start == NSNotFound || end == NSNotFound) + return nil; + [string deleteCharactersInRange:NSMakeRange(0, start)]; + [string deleteCharactersInRange:NSMakeRange(end, [string length] - end)]; return string; } @@ -718,12 +718,12 @@ - (NSString *)xmlString { NSData *data = [NSPropertyListSerialization dataFromPropertyList:self format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL]; NSMutableString *string = [[[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; - NSRange range = [string rangeOfString:@"<string>"]; - if (range.location != NSNotFound) - [string deleteCharactersInRange:NSMakeRange(0, range.location)]; - range = [string rangeOfString:@"</string>" options:NSBackwardsSearch]; - if (range.location != NSNotFound) - [string deleteCharactersInRange:NSMakeRange(range.location, [string length] - range.location)]; + int start = NSMaxRange([string rangeOfString:@"<string>"]); + int end = [string rangeOfString:@"</string>" options:NSBackwardsSearch].location; + if (start == NSNotFound || end == NSNotFound) + return self; + [string deleteCharactersInRange:NSMakeRange(0, start)]; + [string deleteCharactersInRange:NSMakeRange(end, [string length] - end)]; return string; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-27 09:28:09
|
Revision: 2167 http://skim-app.svn.sourceforge.net/skim-app/?rev=2167&view=rev Author: hofman Date: 2007-05-27 02:28:07 -0700 (Sun, 27 May 2007) Log Message: ----------- Fix setting of undo action names. Action names for inverted actions should not be set in the undoable method. Modified Paths: -------------- trunk/Dutch.lproj/Localizable.strings trunk/English.lproj/Localizable.strings trunk/Italian.lproj/Localizable.strings trunk/NSArray_SKExtensions.m trunk/PDFPage_SKExtensions.m trunk/SKDocument.m trunk/SKMainWindowController.m trunk/SKPDFView.m Modified: trunk/Dutch.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/English.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/Italian.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/NSArray_SKExtensions.m =================================================================== --- trunk/NSArray_SKExtensions.m 2007-05-27 08:47:16 UTC (rev 2166) +++ trunk/NSArray_SKExtensions.m 2007-05-27 09:28:07 UTC (rev 2167) @@ -37,6 +37,7 @@ */ #import "NSArray_SKExtensions.h" +#import "NSValue_SKExtensions.h" @implementation NSArray (SKExtensions) Modified: trunk/PDFPage_SKExtensions.m =================================================================== --- trunk/PDFPage_SKExtensions.m 2007-05-27 08:47:16 UTC (rev 2166) +++ trunk/PDFPage_SKExtensions.m 2007-05-27 09:28:07 UTC (rev 2167) @@ -298,18 +298,21 @@ } - (void)insertInNotes:(id)newNote { - SKDocument *document = [self containingDocument]; + SKPDFView *pdfView = [[self containingDocument] pdfView]; - [[document pdfView] addAnnotation:newNote toPage:self]; + [pdfView addAnnotation:newNote toPage:self]; + [[pdfView undoManager] setActionName:NSLocalizedString(@"Add Note", @"Undo action name")]; - [[NSNotificationCenter defaultCenter] postNotificationName:SKPDFViewDidAddAnnotationNotification object:[document pdfView] + [[NSNotificationCenter defaultCenter] postNotificationName:SKPDFViewDidAddAnnotationNotification object:pdfView userInfo:[NSDictionary dictionaryWithObjectsAndKeys:newNote, @"annotation", self, @"page", nil]]; } - (void)removeFromNotesAtIndex:(unsigned int)index { PDFAnnotation *note = [[self notes] objectAtIndex:index]; + SKPDFView *pdfView = [[self containingDocument] pdfView]; - [[[self containingDocument] pdfView] removeAnnotation:note]; + [pdfView removeAnnotation:note]; + [[pdfView undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; } Modified: trunk/SKDocument.m =================================================================== --- trunk/SKDocument.m 2007-05-27 08:47:16 UTC (rev 2166) +++ trunk/SKDocument.m 2007-05-27 09:28:07 UTC (rev 2167) @@ -803,6 +803,7 @@ PDFAnnotation *note = [[self notes] objectAtIndex:index]; [[self pdfView] removeAnnotation:note]; + [[self undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; } - (PDFPage *)currentPage { Modified: trunk/SKMainWindowController.m =================================================================== --- trunk/SKMainWindowController.m 2007-05-27 08:47:16 UTC (rev 2166) +++ trunk/SKMainWindowController.m 2007-05-27 09:28:07 UTC (rev 2167) @@ -2431,6 +2431,7 @@ - (void)outlineViewDeleteSelectedRows:(NSOutlineView *)ov { if ([ov isEqual:noteOutlineView] && [ov selectedRow] != -1) { [pdfView removeAnnotation:[self selectedNote]]; + [[[self document] undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; } } Modified: trunk/SKPDFView.m =================================================================== --- trunk/SKPDFView.m 2007-05-27 08:47:16 UTC (rev 2166) +++ trunk/SKPDFView.m 2007-05-27 09:28:07 UTC (rev 2167) @@ -621,6 +621,7 @@ } [self addAnnotation:newAnnotation toPage:page]; + [[self undoManager] setActionName:NSLocalizedString(@"Add Note", @"Undo action name")]; [self setActiveAnnotation:newAnnotation]; } @@ -1298,6 +1299,7 @@ [newAnnotation setContents:text]; [self addAnnotation:newAnnotation toPage:page]; + [[self undoManager] setActionName:NSLocalizedString(@"Add Note", @"Undo action name")]; [self setActiveAnnotation:newAnnotation]; [newAnnotation release]; @@ -1309,22 +1311,25 @@ - (void)addAnnotation:(PDFAnnotation *)annotation toPage:(PDFPage *)page { [[[self undoManager] prepareWithInvocationTarget:self] removeAnnotation:annotation]; - [[self undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; [page addAnnotation:annotation]; [self setNeedsDisplayForAnnotation:annotation]; [[NSNotificationCenter defaultCenter] postNotificationName:SKPDFViewDidAddAnnotationNotification object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:page, @"page", annotation, @"annotation", nil]]; } - (void)removeActiveAnnotation:(id)sender{ - if ([activeAnnotation isNoteAnnotation]) + if ([activeAnnotation isNoteAnnotation]) { [self removeAnnotation:activeAnnotation]; + [[self undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; + } } - (void)removeThisAnnotation:(id)sender{ PDFAnnotation *annotation = [sender representedObject]; - if (annotation) + if (annotation) { [self removeAnnotation:annotation]; + [[self undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; + } } - (void)removeAnnotation:(PDFAnnotation *)annotation{ @@ -1332,7 +1337,7 @@ PDFPage *page = [wasAnnotation page]; [[[self undoManager] prepareWithInvocationTarget:self] addAnnotation:wasAnnotation toPage:page]; - [[self undoManager] setActionName:NSLocalizedString(@"Add Note", @"Undo action name")]; + [[self undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")]; if (editAnnotation && activeAnnotation == annotation) [self endAnnotationEdit:self]; @@ -2262,6 +2267,7 @@ [[self undoManager] beginUndoGrouping]; didBeginUndoGrouping = YES; [self addAnnotation:newAnnotation toPage:page]; + [[self undoManager] setActionName:NSLocalizedString(@"Add Note", @"Undo action name")]; newActiveAnnotation = newAnnotation; [newAnnotation release]; } else if (toolMode == SKNoteToolMode && newActiveAnnotation == nil && @@ -2287,6 +2293,7 @@ newActiveAnnotation = [[[SKPDFAnnotationMarkup alloc] initWithSelection:sel markupType:markupType] autorelease]; [newActiveAnnotation setContents:[[sel string] stringByCollapsingWhitespaceAndNewlinesAndRemovingSurroundingWhitespaceAndNewlines]]; [self addAnnotation:newActiveAnnotation toPage:page]; + [[self undoManager] setActionName:NSLocalizedString(@"Join Notes", @"Undo action name")]; } if (activeAnnotation != newActiveAnnotation) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-27 08:47:28
|
Revision: 2166 http://skim-app.svn.sourceforge.net/skim-app/?rev=2166&view=rev Author: hofman Date: 2007-05-27 01:47:16 -0700 (Sun, 27 May 2007) Log Message: ----------- Add some more keys for templating, in particular xml cleaning. Modified Paths: -------------- trunk/NSString_SKExtensions.h trunk/NSString_SKExtensions.m trunk/NSValue_SKExtensions.h trunk/NSValue_SKExtensions.m trunk/SKTemplateParser.h trunk/SKTemplateParser.m Modified: trunk/NSString_SKExtensions.h =================================================================== --- trunk/NSString_SKExtensions.h 2007-05-26 23:45:15 UTC (rev 2165) +++ trunk/NSString_SKExtensions.h 2007-05-27 08:47:16 UTC (rev 2166) @@ -57,6 +57,12 @@ - (NSString *)originString; - (NSString *)sizeString; - (NSString *)midPointString; +- (float)rectX; +- (float)rectY; +- (float)rectWidth; +- (float)rectHeight; +- (float)pointX; +- (float)pointY; - (NSString *)stringBySurroundingWithSpacesIfNotEmpty; - (NSString *)stringByAppendingSpaceIfNotEmpty; Modified: trunk/NSString_SKExtensions.m =================================================================== --- trunk/NSString_SKExtensions.m 2007-05-26 23:45:15 UTC (rev 2165) +++ trunk/NSString_SKExtensions.m 2007-05-27 08:47:16 UTC (rev 2166) @@ -258,6 +258,30 @@ return NSStringFromPoint(NSMakePoint(NSMidX(rect), NSMidY(rect))); } +- (float)rectX { + return NSRectFromString(self).origin.x; +} + +- (float)rectY { + return NSRectFromString(self).origin.x; +} + +- (float)rectWidth { + return NSRectFromString(self).size.width; +} + +- (float)rectHeight { + return NSRectFromString(self).size.height; +} + +- (float)pointX { + return NSPointFromString(self).x; +} + +- (float)pointY { + return NSPointFromString(self).y; +} + - (NSString *)stringBySurroundingWithSpacesIfNotEmpty { return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@ ", self]; } Modified: trunk/NSValue_SKExtensions.h =================================================================== --- trunk/NSValue_SKExtensions.h 2007-05-26 23:45:15 UTC (rev 2165) +++ trunk/NSValue_SKExtensions.h 2007-05-27 08:47:16 UTC (rev 2166) @@ -18,5 +18,11 @@ - (NSString *)originString; - (NSString *)sizeString; - (NSString *)midPointString; +- (float)rectX; +- (float)rectY; +- (float)rectWidth; +- (float)rectHeight; +- (float)pointX; +- (float)pointY; @end Modified: trunk/NSValue_SKExtensions.m =================================================================== --- trunk/NSValue_SKExtensions.m 2007-05-26 23:45:15 UTC (rev 2165) +++ trunk/NSValue_SKExtensions.m 2007-05-27 08:47:16 UTC (rev 2166) @@ -54,4 +54,28 @@ return NSStringFromPoint(NSMakePoint(NSMidX(rect), NSMidY(rect))); } +- (float)rectX { + return [self rectValue].origin.x; +} + +- (float)rectY { + return [self rectValue].origin.x; +} + +- (float)rectWidth { + return [self rectValue].size.width; +} + +- (float)rectHeight { + return [self rectValue].size.height; +} + +- (float)pointX { + return [self pointValue].x; +} + +- (float)pointY { + return [self pointValue].y; +} + @end Modified: trunk/SKTemplateParser.h =================================================================== --- trunk/SKTemplateParser.h 2007-05-26 23:45:15 UTC (rev 2165) +++ trunk/SKTemplateParser.h 2007-05-27 08:47:16 UTC (rev 2166) @@ -70,4 +70,15 @@ @interface NSAttributedString (SKTemplateParser) - (id)initWithAttributedString:(NSAttributedString *)attributedString attributes:(NSDictionary *)attributes; +- (NSString *)xmlString; +- (NSData *)RTFRepresentation; @end + +@interface NSString (SKTemplateParser) +- (NSString *)xmlString; +@end + + +@interface NSData (SKTemplateParser) +- (NSString *)xmlString; +@end Modified: trunk/SKTemplateParser.m =================================================================== --- trunk/SKTemplateParser.m 2007-05-26 23:45:15 UTC (rev 2165) +++ trunk/SKTemplateParser.m 2007-05-27 08:47:16 UTC (rev 2166) @@ -675,8 +675,34 @@ return [self length] > 0; } +- (NSString *)xmlString { + return [[self string] xmlString]; +} + +- (NSData *)RTFRepresentation { + return [self dataFromRange:NSMakeRange(0, [self length]) documentAttributes:nil error:NULL]; +} + @end +#pragma mark + +@implementation NSData (SKTemplateParser) + +- (NSString *)xmlString { + NSData *data = [NSPropertyListSerialization dataFromPropertyList:self format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL]; + NSMutableString *string = [[[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; + NSRange range = [string rangeOfString:@"<data>"]; + if (range.location != NSNotFound) + [string deleteCharactersInRange:NSMakeRange(0, range.location)]; + range = [string rangeOfString:@"</data>" options:NSBackwardsSearch]; + if (range.location != NSNotFound) + [string deleteCharactersInRange:NSMakeRange(range.location, [string length] - range.location)]; + return string; +} + +@end + #pragma mark - @implementation NSString (SKTemplateParser) @@ -689,6 +715,18 @@ return [self isEqualToString:@""] == NO; } +- (NSString *)xmlString { + NSData *data = [NSPropertyListSerialization dataFromPropertyList:self format:NSPropertyListXMLFormat_v1_0 errorDescription:NULL]; + NSMutableString *string = [[[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; + NSRange range = [string rangeOfString:@"<string>"]; + if (range.location != NSNotFound) + [string deleteCharactersInRange:NSMakeRange(0, range.location)]; + range = [string rangeOfString:@"</string>" options:NSBackwardsSearch]; + if (range.location != NSNotFound) + [string deleteCharactersInRange:NSMakeRange(range.location, [string length] - range.location)]; + return string; +} + @end #pragma mark - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-26 23:45:17
|
Revision: 2165 http://skim-app.svn.sourceforge.net/skim-app/?rev=2165&view=rev Author: hofman Date: 2007-05-26 16:45:15 -0700 (Sat, 26 May 2007) Log Message: ----------- Add new export document type for notes as text. Export also text from notes document. Fix encoding of text template file (UTF8). Modified Paths: -------------- trunk/Dutch.lproj/InfoPlist.strings trunk/English.lproj/InfoPlist.strings trunk/Info.plist trunk/Italian.lproj/InfoPlist.strings trunk/SKDocument.m trunk/SKDocumentController.h trunk/SKDocumentController.m trunk/SKNotesDocument.h trunk/SKNotesDocument.m trunk/Skim.xcodeproj/project.pbxproj trunk/notesTemplate.txt Modified: trunk/Dutch.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/English.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/Info.plist =================================================================== --- trunk/Info.plist 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/Info.plist 2007-05-26 23:45:15 UTC (rev 2165) @@ -41,6 +41,7 @@ <string>PDF Without Notes</string> <string>Skim Notes</string> <string>Notes as RTF</string> + <string>Notes as Text</string> </array> </dict> <dict> @@ -65,6 +66,7 @@ <key>NSExportableAs</key> <array> <string>Notes as RTF</string> + <string>Notes as Text</string> </array> <key>NSPersistentStoreTypeKey</key> <string>Binary</string> @@ -246,6 +248,26 @@ <key>NSPersistentStoreTypeKey</key> <string>Binary</string> </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>txt</string> + </array> + <key>CFBundleTypeMIMETypes</key> + <array> + <string>text/plain</string> + </array> + <key>CFBundleTypeName</key> + <string>Notes as Text</string> + <key>CFBundleTypeRole</key> + <string>None</string> + <key>LSTypeIsPackage</key> + <false/> + <key>NSDocumentClass</key> + <string>SKDocument</string> + <key>NSPersistentStoreTypeKey</key> + <string>Binary</string> + </dict> </array> <key>CFBundleExecutable</key> <string>${EXECUTABLE_NAME}</string> Modified: trunk/Italian.lproj/InfoPlist.strings =================================================================== (Binary files differ) Modified: trunk/SKDocument.m =================================================================== --- trunk/SKDocument.m 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/SKDocument.m 2007-05-26 23:45:15 UTC (rev 2165) @@ -205,6 +205,12 @@ didWrite = [data writeToURL:absoluteURL options:NSAtomicWrite error:outError]; else if (outError != NULL) *outError = [NSError errorWithDomain:SKDocumentErrorDomain code:1 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Unable to write notes as RTF", @"Error description"), NSLocalizedDescriptionKey, nil]]; + } else if ([typeName isEqualToString:SKNotesTextDocumentType]) { + NSString *string = [self notesString]; + if (string) + didWrite = [string writeToURL:absoluteURL atomically:YES encoding:NSUTF8StringEncoding error:outError]; + else if (outError != NULL) + *outError = [NSError errorWithDomain:SKDocumentErrorDomain code:1 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Unable to write notes as text", @"Error description"), NSLocalizedDescriptionKey, nil]]; } return didWrite; } @@ -761,8 +767,11 @@ - (NSString *)notesString { NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"notesTemplate" ofType:@"txt"]; - NSString *templateString = [[NSString alloc] initWithContentsOfFile:templatePath encoding:NSUTF8StringEncoding error:NULL]; + NSStringEncoding encoding = NSUTF8StringEncoding; + NSError *error = nil; + NSString *templateString = [[NSString alloc] initWithContentsOfFile:templatePath encoding:encoding error:&error]; NSString *string = [SKTemplateParser stringByParsingTemplate:templateString usingObject:self]; + [templateString release]; return string; } Modified: trunk/SKDocumentController.h =================================================================== --- trunk/SKDocumentController.h 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/SKDocumentController.h 2007-05-26 23:45:15 UTC (rev 2165) @@ -43,6 +43,7 @@ extern NSString *SKBarePDFDocumentType; extern NSString *SKNotesDocumentType; extern NSString *SKNotesRTFDocumentType; +extern NSString *SKNotesTextDocumentType; extern NSString *SKPostScriptDocumentType; Modified: trunk/SKDocumentController.m =================================================================== --- trunk/SKDocumentController.m 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/SKDocumentController.m 2007-05-26 23:45:15 UTC (rev 2165) @@ -44,6 +44,7 @@ NSString *SKBarePDFDocumentType = @"PDF Without Notes"; NSString *SKNotesDocumentType = @"Skim Notes"; NSString *SKNotesRTFDocumentType = @"Notes as RTF"; +NSString *SKNotesTextDocumentType = @"Notes as Text"; NSString *SKPostScriptDocumentType = @"PostScript document"; Modified: trunk/SKNotesDocument.h =================================================================== --- trunk/SKNotesDocument.h 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/SKNotesDocument.h 2007-05-26 23:45:15 UTC (rev 2165) @@ -54,6 +54,7 @@ - (void)insertObject:(id)obj inNotesAtIndex:(unsigned)index; - (void)removeObjectFromNotesAtIndex:(unsigned)index; +- (NSString *)notesString; - (NSData *)notesRTFData; @end Modified: trunk/SKNotesDocument.m =================================================================== --- trunk/SKNotesDocument.m 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/SKNotesDocument.m 2007-05-26 23:45:15 UTC (rev 2165) @@ -79,6 +79,8 @@ data = [NSKeyedArchiver archivedDataWithRootObject:[notes valueForKey:@"dictionaryValue"]]; } else if ([typeName isEqualToString:SKNotesRTFDocumentType]) { data = [self notesRTFData]; + } else if ([typeName isEqualToString:SKNotesTextDocumentType]) { + data = [[self notesString] dataUsingEncoding:NSUTF8StringEncoding]; } if (data == nil && outError != NULL) @@ -119,6 +121,13 @@ return didRead; } +- (NSString *)notesString { + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"notesTemplate" ofType:@"txt"]; + NSString *templateString = [[NSString alloc] initWithContentsOfFile:templatePath encoding:NSUTF8StringEncoding error:NULL]; + NSString *string = [SKTemplateParser stringByParsingTemplate:templateString usingObject:self]; + return string; +} + - (NSData *)notesRTFData { NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"notesTemplate" ofType:@"rtf"]; NSDictionary *docAttributes = nil; Modified: trunk/Skim.xcodeproj/project.pbxproj =================================================================== --- trunk/Skim.xcodeproj/project.pbxproj 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/Skim.xcodeproj/project.pbxproj 2007-05-26 23:45:15 UTC (rev 2165) @@ -446,7 +446,7 @@ CE485BF00BC4443B00FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Dutch; path = Dutch.lproj/Credits.rtf; sourceTree = "<group>"; }; CE48BAD50C089EA300A166C6 /* SKTemplateParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKTemplateParser.h; sourceTree = "<group>"; }; CE48BAD60C089EA300A166C6 /* SKTemplateParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKTemplateParser.m; sourceTree = "<group>"; }; - CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = notesTemplate.txt; sourceTree = "<group>"; }; + CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = notesTemplate.txt; sourceTree = "<group>"; }; CE48BBB50C08AD7000A166C6 /* notesTemplate.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = notesTemplate.rtf; sourceTree = "<group>"; }; CE49724E0BDE898F00D7F1D2 /* SKMainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKMainWindow.h; sourceTree = "<group>"; }; CE49724F0BDE898F00D7F1D2 /* SKMainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKMainWindow.m; sourceTree = "<group>"; }; Modified: trunk/notesTemplate.txt =================================================================== --- trunk/notesTemplate.txt 2007-05-26 23:11:24 UTC (rev 2164) +++ trunk/notesTemplate.txt 2007-05-26 23:45:15 UTC (rev 2165) @@ -1,5 +1,5 @@ <$notes> -\xA5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/> +• <$type.typeName/>, page <$pageIndex.numberByAddingOne/> <$contents?> <$contents/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-26 23:11:26
|
Revision: 2164 http://skim-app.svn.sourceforge.net/skim-app/?rev=2164&view=rev Author: hofman Date: 2007-05-26 16:11:24 -0700 (Sat, 26 May 2007) Log Message: ----------- fix templates Modified Paths: -------------- trunk/notesTemplate.rtf trunk/notesTemplate.txt Modified: trunk/notesTemplate.rtf =================================================================== --- trunk/notesTemplate.rtf 2007-05-26 20:49:09 UTC (rev 2163) +++ trunk/notesTemplate.rtf 2007-05-26 23:11:24 UTC (rev 2164) @@ -3,7 +3,7 @@ {\colortbl;\red255\green255\blue255;} \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural -\f0\fs24 \cf0 <notes>\ +\f0\fs24 \cf0 <$notes>\ \'a5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/>\ \ <$contents?>\ @@ -14,5 +14,5 @@ <$text/>\ \ </$text?>\ -</notes>\ +</$notes>\ } \ No newline at end of file Modified: trunk/notesTemplate.txt =================================================================== --- trunk/notesTemplate.txt 2007-05-26 20:49:09 UTC (rev 2163) +++ trunk/notesTemplate.txt 2007-05-26 23:11:24 UTC (rev 2164) @@ -1,4 +1,4 @@ -<notes> +<$notes> \xA5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/> <$contents?> @@ -9,4 +9,4 @@ <$text/> </$text?> -</notes> +</$notes> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-26 20:49:11
|
Revision: 2163 http://skim-app.svn.sourceforge.net/skim-app/?rev=2163&view=rev Author: hofman Date: 2007-05-26 13:49:09 -0700 (Sat, 26 May 2007) Log Message: ----------- Add some more convenience keys for templating, such as for sorting arrays. Move some categories to separate files. Modified Paths: -------------- trunk/NSString_SKExtensions.h trunk/NSString_SKExtensions.m trunk/PDFPage_SKExtensions.h trunk/PDFPage_SKExtensions.m trunk/SKDocument.m trunk/SKMainWindowController.m trunk/SKNotesDocument.m trunk/SKTemplateParser.m trunk/Skim.xcodeproj/project.pbxproj Added Paths: ----------- trunk/NSArray_SKExtensions.h trunk/NSArray_SKExtensions.m trunk/NSValue_SKExtensions.h trunk/NSValue_SKExtensions.m Added: trunk/NSArray_SKExtensions.h =================================================================== --- trunk/NSArray_SKExtensions.h (rev 0) +++ trunk/NSArray_SKExtensions.h 2007-05-26 20:49:09 UTC (rev 2163) @@ -0,0 +1,47 @@ +// +// NSArray_SKExtensions.h +// Skim +// +// Created by Christiaan Hofman on 5/26/07. +/* + This software is Copyright (c) 2007 + Christiaan Hofman. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Christiaan Hofman nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import <Cocoa/Cocoa.h> + + +@interface NSArray (SKExtensions) +- (NSArray *)arraySortedByPageIndex; +- (NSArray *)arraySortedByBounds; +- (NSArray *)arraySortedByType; +- (NSArray *)arraySortedByContents; +@end Added: trunk/NSArray_SKExtensions.m =================================================================== --- trunk/NSArray_SKExtensions.m (rev 0) +++ trunk/NSArray_SKExtensions.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -0,0 +1,60 @@ +// +// NSArray_SKExtensions.m +// Skim +// +// Created by Christiaan Hofman on 5/26/07. +/* + This software is Copyright (c) 2007 + Christiaan Hofman. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Christiaan Hofman nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "NSArray_SKExtensions.h" + + +@implementation NSArray (SKExtensions) + +- (NSArray *)arraySortedByPageIndex { + return [self sortedArrayUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"pageIndex" ascending:YES selector:@selector(compare:)] autorelease]]]; +} + +- (NSArray *)arraySortedByBounds { + return [self sortedArrayUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"bounds" ascending:YES selector:@selector(boundsCompare:)] autorelease]]]; +} + +- (NSArray *)arraySortedByType { + return [self sortedArrayUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease]]]; +} + +- (NSArray *)arraySortedByContents { + return [self sortedArrayUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"contents" ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease]]]; +} + +@end Modified: trunk/NSString_SKExtensions.h =================================================================== --- trunk/NSString_SKExtensions.h 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/NSString_SKExtensions.h 2007-05-26 20:49:09 UTC (rev 2163) @@ -52,4 +52,22 @@ - (NSRange)rangeOfTrailingEmptyLine; - (NSRange)rangeOfTrailingEmptyLineInRange:(NSRange)range; +- (NSString *)rectString; +- (NSString *)pointString; +- (NSString *)originString; +- (NSString *)sizeString; +- (NSString *)midPointString; + +- (NSString *)stringBySurroundingWithSpacesIfNotEmpty; +- (NSString *)stringByAppendingSpaceIfNotEmpty; +- (NSString *)stringByAppendingDoubleSpaceIfNotEmpty; +- (NSString *)stringByPrependingSpaceIfNotEmpty; +- (NSString *)stringByAppendingCommaIfNotEmpty; +- (NSString *)stringByAppendingFullStopIfNotEmpty; +- (NSString *)stringByAppendingCommaAndSpaceIfNotEmpty; +- (NSString *)stringByAppendingFullStopAndSpaceIfNotEmpty; +- (NSString *)stringByPrependingCommaAndSpaceIfNotEmpty; +- (NSString *)stringByPrependingFullStopAndSpaceIfNotEmpty; +- (NSString *)parenthesizedStringIfNotEmpty; + @end Modified: trunk/NSString_SKExtensions.m =================================================================== --- trunk/NSString_SKExtensions.m 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/NSString_SKExtensions.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -236,5 +236,70 @@ else return self; } - + +- (NSString *)rectString { + return NSStringFromRect(NSRectFromString(self)); +} + +- (NSString *)pointString { + return NSStringFromPoint(NSPointFromString(self)); +} + +- (NSString *)originString { + return NSStringFromPoint(NSRectFromString(self).origin); +} + +- (NSString *)sizeString { + return NSStringFromSize(NSRectFromString(self).size); +} + +- (NSString *)midPointString { + NSRect rect = NSRectFromString(self); + return NSStringFromPoint(NSMakePoint(NSMidX(rect), NSMidY(rect))); +} + +- (NSString *)stringBySurroundingWithSpacesIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@ ", self]; +} + +- (NSString *)stringByAppendingSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@" "]; +} + +- (NSString *)stringByAppendingDoubleSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@" "]; +} + +- (NSString *)stringByPrependingSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@", self]; +} + +- (NSString *)stringByAppendingCommaIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@","]; +} + +- (NSString *)stringByAppendingFullStopIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@"."]; +} + +- (NSString *)stringByAppendingCommaAndSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@", "]; +} + +- (NSString *)stringByAppendingFullStopAndSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@". "]; +} + +- (NSString *)stringByPrependingCommaAndSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@", %@", self]; +} + +- (NSString *)stringByPrependingFullStopAndSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@". %@", self]; +} + +- (NSString *)parenthesizedStringIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@"(%@)", self]; +} + @end Added: trunk/NSValue_SKExtensions.h =================================================================== --- trunk/NSValue_SKExtensions.h (rev 0) +++ trunk/NSValue_SKExtensions.h 2007-05-26 20:49:09 UTC (rev 2163) @@ -0,0 +1,22 @@ +// +// NSValue_SKExtensions.h +// Skim +// +// Created by Christiaan Hofman on 26/5/07. +// Copyright 2007 __MyCompanyName__. All rights reserved. +// + +#import <Cocoa/Cocoa.h> + + +@interface NSValue (SKExtensions) + +- (NSComparisonResult)boundsCompare:(NSValue *)aValue; + +- (NSString *)rectString; +- (NSString *)pointString; +- (NSString *)originString; +- (NSString *)sizeString; +- (NSString *)midPointString; + +@end Added: trunk/NSValue_SKExtensions.m =================================================================== --- trunk/NSValue_SKExtensions.m (rev 0) +++ trunk/NSValue_SKExtensions.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -0,0 +1,57 @@ +// +// NSValue_SKExtensions.m +// Skim +// +// Created by Christiaan Hofman on 26/5/07. +// Copyright 2007 __MyCompanyName__. All rights reserved. +// + +#import "NSValue_SKExtensions.h" + + +@implementation NSValue (SKExtensions) + +- (NSComparisonResult)boundsCompare:(NSValue *)aValue { + NSRect rect1 = [self rectValue]; + NSRect rect2 = [aValue rectValue]; + float y1 = NSMaxY(rect1); + float y2 = NSMaxY(rect2); + + if (y1 > y2) + return NSOrderedAscending; + else if (y1 < y2) + return NSOrderedDescending; + + float x1 = NSMinX(rect1); + float x2 = NSMinX(rect2); + + if (x1 < x2) + return NSOrderedAscending; + else if (x1 > x2) + return NSOrderedDescending; + else + return NSOrderedSame; +} + +- (NSString *)rectString { + return NSStringFromRect([self rectValue]); +} + +- (NSString *)pointString { + return NSStringFromPoint([self pointValue]); +} + +- (NSString *)originString { + return NSStringFromPoint([self rectValue].origin); +} + +- (NSString *)sizeString { + return NSStringFromSize([self rectValue].size); +} + +- (NSString *)midPointString { + NSRect rect = [self rectValue]; + return NSStringFromPoint(NSMakePoint(NSMidX(rect), NSMidY(rect))); +} + +@end Modified: trunk/PDFPage_SKExtensions.h =================================================================== --- trunk/PDFPage_SKExtensions.h 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/PDFPage_SKExtensions.h 2007-05-26 20:49:09 UTC (rev 2163) @@ -38,6 +38,7 @@ #import <Cocoa/Cocoa.h> #import <Quartz/Quartz.h> +#import "NSValue_SKExtensions.h" @class SKDocument; @@ -62,8 +63,3 @@ - (id)handleGoToScriptCommand:(NSScriptCommand *)command; @end - - -@interface NSValue (SKExtensions) -- (NSComparisonResult)boundsCompare:(NSValue *)aValue; -@end Modified: trunk/PDFPage_SKExtensions.m =================================================================== --- trunk/PDFPage_SKExtensions.m 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/PDFPage_SKExtensions.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -319,31 +319,3 @@ } @end - -#pragma mark - - -@implementation NSValue (SKExtensions) - -- (NSComparisonResult)boundsCompare:(NSValue *)aValue { - NSRect rect1 = [self rectValue]; - NSRect rect2 = [aValue rectValue]; - float y1 = NSMaxY(rect1); - float y2 = NSMaxY(rect2); - - if (y1 > y2) - return NSOrderedAscending; - else if (y1 < y2) - return NSOrderedDescending; - - float x1 = NSMinX(rect1); - float x2 = NSMinX(rect2); - - if (x1 < x2) - return NSOrderedAscending; - else if (x1 > x2) - return NSOrderedDescending; - else - return NSOrderedSame; -} - -@end Modified: trunk/SKDocument.m =================================================================== --- trunk/SKDocument.m 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/SKDocument.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -771,7 +771,7 @@ NSDictionary *docAttributes = nil; NSAttributedString *templateAttrString = [[NSAttributedString alloc] initWithPath:templatePath documentAttributes:&docAttributes]; NSAttributedString *attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:self]; - NSData *data = [attrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; + NSData *data = [attrString RTFFromRange:NSMakeRange(0, [attrString length]) documentAttributes:docAttributes]; [templateAttrString release]; return data; } Modified: trunk/SKMainWindowController.m =================================================================== --- trunk/SKMainWindowController.m 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/SKMainWindowController.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -68,6 +68,7 @@ #import "SKPDFHoverWindow.h" #import "PDFSelection_SKExtensions.h" #import "SKToolbarItem.h" +#import "NSValue_SKExtensions.h" #define SEGMENTED_CONTROL_HEIGHT 25.0 #define WINDOW_X_DELTA 0.0 Modified: trunk/SKNotesDocument.m =================================================================== --- trunk/SKNotesDocument.m 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/SKNotesDocument.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -124,7 +124,7 @@ NSDictionary *docAttributes = nil; NSAttributedString *templateAttrString = [[NSAttributedString alloc] initWithPath:templatePath documentAttributes:&docAttributes]; NSAttributedString *attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:self]; - NSData *data = [attrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; + NSData *data = [attrString RTFFromRange:NSMakeRange(0, [attrString length]) documentAttributes:docAttributes]; [templateAttrString release]; return data; } Modified: trunk/SKTemplateParser.m =================================================================== --- trunk/SKTemplateParser.m 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/SKTemplateParser.m 2007-05-26 20:49:09 UTC (rev 2163) @@ -685,106 +685,14 @@ return self; } -- (NSString *)stringBySurroundingWithSpacesIfNotEmpty { - return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@ ", self]; -} - -- (NSString *)stringByAppendingSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [self stringByAppendingString:@" "]; -} - -- (NSString *)stringByAppendingDoubleSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [self stringByAppendingString:@" "]; -} - -- (NSString *)stringByPrependingSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@", self]; -} - -- (NSString *)stringByAppendingCommaIfNotEmpty { - return [self isEqualToString:@""] ? self : [self stringByAppendingString:@","]; -} - -- (NSString *)stringByAppendingFullStopIfNotEmpty { - return [self isEqualToString:@""] ? self : [self stringByAppendingString:@"."]; -} - -- (NSString *)stringByAppendingCommaAndSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [self stringByAppendingString:@", "]; -} - -- (NSString *)stringByAppendingFullStopAndSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [self stringByAppendingString:@". "]; -} - -- (NSString *)stringByPrependingCommaAndSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@", %@", self]; -} - -- (NSString *)stringByPrependingFullStopAndSpaceIfNotEmpty { - return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@". %@", self]; -} - -- (NSString *)parenthesizedStringIfNotEmpty { - return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@"(%@)", self]; -} - - (BOOL)isNotEmpty { return [self isEqualToString:@""] == NO; } -- (NSString *)rectString { - return NSStringFromRect(NSRectFromString(self)); -} - -- (NSString *)pointString { - return NSStringFromPoint(NSPointFromString(self)); -} - -- (NSString *)originString { - return NSStringFromPoint(NSRectFromString(self).origin); -} - -- (NSString *)sizeString { - return NSStringFromSize(NSRectFromString(self).size); -} - -- (NSString *)midPointString { - NSRect rect = NSRectFromString(self); - return NSStringFromPoint(NSMakePoint(NSMidX(rect), NSMidY(rect))); -} - @end #pragma mark - -@implementation NSValue (SKTemplateParser) - -- (NSString *)rectString { - return NSStringFromRect([self rectValue]); -} - -- (NSString *)pointString { - return NSStringFromPoint([self pointValue]); -} - -- (NSString *)originString { - return NSStringFromPoint([self rectValue].origin); -} - -- (NSString *)sizeString { - return NSStringFromSize([self rectValue].size); -} - -- (NSString *)midPointString { - NSRect rect = [self rectValue]; - return NSStringFromPoint(NSMakePoint(NSMidX(rect), NSMidY(rect))); -} - -@end - -#pragma mark - - @implementation NSNumber (SKTemplateParser) - (NSNumber *)numberByAddingOne { @@ -801,13 +709,7 @@ @implementation NSArray (SKTemplateParser) -- (NSString *)componentsJoinedByAnd -{ - return [self componentsJoinedByString:@" and "]; -} - -- (BOOL)isNotEmpty -{ +- (BOOL)isNotEmpty { return [self count] > 0; } @@ -817,8 +719,7 @@ @implementation NSDictionary (SKTemplateParser) -- (BOOL)isNotEmpty -{ +- (BOOL)isNotEmpty { return [self count] > 0; } Modified: trunk/Skim.xcodeproj/project.pbxproj =================================================================== --- trunk/Skim.xcodeproj/project.pbxproj 2007-05-26 20:26:19 UTC (rev 2162) +++ trunk/Skim.xcodeproj/project.pbxproj 2007-05-26 20:49:09 UTC (rev 2163) @@ -96,6 +96,10 @@ CE4190C40B94963A00ECF819 /* ToolbarCircleNote.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE4190C20B94963A00ECF819 /* ToolbarCircleNote.tiff */; }; CE4190C50B94963A00ECF819 /* ToolbarTextNote.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE4190C30B94963A00ECF819 /* ToolbarTextNote.tiff */; }; CE41A6CC0B975E5000ECF819 /* Skim.sdef in Resources */ = {isa = PBXBuildFile; fileRef = CE41A6CB0B975E5000ECF819 /* Skim.sdef */; }; + CE41B2A60C08CFA900E36EB7 /* NSArray_SKExtensions.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE41B2A40C08CFA900E36EB7 /* NSArray_SKExtensions.h */; }; + CE41B2A70C08CFA900E36EB7 /* NSArray_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41B2A50C08CFA900E36EB7 /* NSArray_SKExtensions.m */; }; + CE41B2CB0C08D17100E36EB7 /* NSValue_SKExtensions.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE41B2C90C08D17100E36EB7 /* NSValue_SKExtensions.h */; }; + CE41B2CC0C08D17100E36EB7 /* NSValue_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE41B2CA0C08D17100E36EB7 /* NSValue_SKExtensions.m */; }; CE4294A30BBD29120016FDC2 /* SKReadingBar.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4294A20BBD29120016FDC2 /* SKReadingBar.m */; }; CE4373B40BB5440E00A56987 /* PSDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = CE4373B30BB5440E00A56987 /* PSDocument.icns */; }; CE468C410BF1F0F60007AA12 /* ArrowNoteToolAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE468C390BF1F0F60007AA12 /* ArrowNoteToolAdorn.tiff */; }; @@ -263,6 +267,8 @@ files = ( CE2BD8450BD4135600A5F4DB /* Sparkle.framework in CopyFiles */, CE48BAD70C089EA300A166C6 /* SKTemplateParser.h in CopyFiles */, + CE41B2A60C08CFA900E36EB7 /* NSArray_SKExtensions.h in CopyFiles */, + CE41B2CB0C08D17100E36EB7 /* NSValue_SKExtensions.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -408,6 +414,10 @@ CE4190C20B94963A00ECF819 /* ToolbarCircleNote.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = ToolbarCircleNote.tiff; path = Images/ToolbarCircleNote.tiff; sourceTree = "<group>"; }; CE4190C30B94963A00ECF819 /* ToolbarTextNote.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = ToolbarTextNote.tiff; path = Images/ToolbarTextNote.tiff; sourceTree = "<group>"; }; CE41A6CB0B975E5000ECF819 /* Skim.sdef */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.sdef; path = Skim.sdef; sourceTree = "<group>"; }; + CE41B2A40C08CFA900E36EB7 /* NSArray_SKExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSArray_SKExtensions.h; sourceTree = "<group>"; }; + CE41B2A50C08CFA900E36EB7 /* NSArray_SKExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSArray_SKExtensions.m; sourceTree = "<group>"; }; + CE41B2C90C08D17100E36EB7 /* NSValue_SKExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSValue_SKExtensions.h; sourceTree = "<group>"; }; + CE41B2CA0C08D17100E36EB7 /* NSValue_SKExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSValue_SKExtensions.m; sourceTree = "<group>"; }; CE4294A10BBD29120016FDC2 /* SKReadingBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKReadingBar.h; sourceTree = "<group>"; }; CE4294A20BBD29120016FDC2 /* SKReadingBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKReadingBar.m; sourceTree = "<group>"; }; CE4373B30BB5440E00A56987 /* PSDocument.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = PSDocument.icns; path = Images/PSDocument.icns; sourceTree = "<group>"; }; @@ -707,6 +717,8 @@ children = ( CE4EC8810B7E6E920091F228 /* CIImage_BDSKExtensions.h */, CE4EC8820B7E6E920091F228 /* CIImage_BDSKExtensions.m */, + CE41B2A40C08CFA900E36EB7 /* NSArray_SKExtensions.h */, + CE41B2A50C08CFA900E36EB7 /* NSArray_SKExtensions.m */, CE3A45510B7A04A4006B64D3 /* NSBezierPath_BDSKExtensions.h */, CE3A45520B7A04A4006B64D3 /* NSBezierPath_BDSKExtensions.m */, CE4EC87D0B7E6E110091F228 /* NSBezierPath_CoreImageExtensions.h */, @@ -719,6 +731,8 @@ CE2DE4ED0B85DB6300D0DA12 /* NSCursor_SKExtensions.m */, CE5487BA0B35A20A00F8AFB6 /* NSFileManager_ExtendedAttributes.h */, CE5487BB0B35A20A00F8AFB6 /* NSFileManager_ExtendedAttributes.m */, + CE6C03EE0BEDF759007BF0B5 /* NSParagraphStyle_SKExtensions.h */, + CE6C03EF0BEDF759007BF0B5 /* NSParagraphStyle_SKExtensions.m */, CE1E301A0BDB9D5C0011D9DD /* NSScanner_SKExtensions.h */, CE1E301B0BDB9D5C0011D9DD /* NSScanner_SKExtensions.m */, CE070EA00B89039700733CC8 /* NSScrollView_SKExtensions.h */, @@ -727,14 +741,14 @@ CE38ECD20B8093B200A1B779 /* NSString_SKExtensions.m */, CEF7119F0B90B714003A2771 /* NSUserDefaultsController_SKExtensions.h */, CEF711A00B90B714003A2771 /* NSUserDefaultsController_SKExtensions.m */, + CE41B2C90C08D17100E36EB7 /* NSValue_SKExtensions.h */, + CE41B2CA0C08D17100E36EB7 /* NSValue_SKExtensions.m */, CE4A8BA00BB1597F004AD07D /* NSWindowController_SKExtensions.h */, CE4A8BA10BB15980004AD07D /* NSWindowController_SKExtensions.m */, CE2DE50B0B85DC4000D0DA12 /* PDFPage_SKExtensions.h */, CE2DE50C0B85DC4000D0DA12 /* PDFPage_SKExtensions.m */, CE49726A0BDE8A7400D7F1D2 /* PDFSelection_SKExtensions.h */, CE49726B0BDE8A7400D7F1D2 /* PDFSelection_SKExtensions.m */, - CE6C03EE0BEDF759007BF0B5 /* NSParagraphStyle_SKExtensions.h */, - CE6C03EF0BEDF759007BF0B5 /* NSParagraphStyle_SKExtensions.m */, ); name = Categories; sourceTree = "<group>"; @@ -1339,6 +1353,8 @@ CE31A6180C01FC45003612A9 /* SKDocumentController.m in Sources */, F968C5A30C036E9D000BD1B2 /* NSBitmapImageRep_SKExtensions.m in Sources */, CE48BAD80C089EA300A166C6 /* SKTemplateParser.m in Sources */, + CE41B2A70C08CFA900E36EB7 /* NSArray_SKExtensions.m in Sources */, + CE41B2CC0C08D17100E36EB7 /* NSValue_SKExtensions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-26 20:26:20
|
Revision: 2162 http://skim-app.svn.sourceforge.net/skim-app/?rev=2162&view=rev Author: hofman Date: 2007-05-26 13:26:19 -0700 (Sat, 26 May 2007) Log Message: ----------- Lift templates to document level. More flexibility, such as adding document properties and sorting. Modified Paths: -------------- trunk/SKDocument.m trunk/SKNotesDocument.m trunk/Skim.xcodeproj/project.pbxproj Added Paths: ----------- trunk/notesTemplate.rtf trunk/notesTemplate.txt Removed Paths: ------------- trunk/noteTemplate.rtf trunk/noteTemplate.txt Modified: trunk/SKDocument.m =================================================================== --- trunk/SKDocument.m 2007-05-26 18:56:53 UTC (rev 2161) +++ trunk/SKDocument.m 2007-05-26 20:26:19 UTC (rev 2162) @@ -760,40 +760,19 @@ } - (NSString *)notesString { - NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"noteTemplate" ofType:@"txt"]; + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"notesTemplate" ofType:@"txt"]; NSString *templateString = [[NSString alloc] initWithContentsOfFile:templatePath encoding:NSUTF8StringEncoding error:NULL]; - NSEnumerator *noteEnum = [[[self mainWindowController] notes] objectEnumerator]; - PDFAnnotation *note; - NSMutableString *mutableString = [NSMutableString stringWithCapacity:2048]; - NSString *string; - - while (note = [noteEnum nextObject]) { - if (string = [SKTemplateParser stringByParsingTemplate:templateString usingObject:note]) - [mutableString appendString:string]; - } - [templateString release]; - - return mutableString; + NSString *string = [SKTemplateParser stringByParsingTemplate:templateString usingObject:self]; + return string; } - (NSData *)notesRTFData { - NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"noteTemplate" ofType:@"txt"]; + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"notesTemplate" ofType:@"rtf"]; NSDictionary *docAttributes = nil; NSAttributedString *templateAttrString = [[NSAttributedString alloc] initWithPath:templatePath documentAttributes:&docAttributes]; - NSEnumerator *noteEnum = [[[self mainWindowController] notes] objectEnumerator]; - PDFAnnotation *note; - NSMutableAttributedString *mutableAttrString = [[NSMutableAttributedString alloc] init]; - NSAttributedString *attrString; - - while (note = [noteEnum nextObject]) { - if (attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:note]) - [mutableAttrString appendAttributedString:attrString]; - } - - NSData *data = [mutableAttrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; - [mutableAttrString release]; + NSAttributedString *attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:self]; + NSData *data = [attrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; [templateAttrString release]; - return data; } Modified: trunk/SKNotesDocument.m =================================================================== --- trunk/SKNotesDocument.m 2007-05-26 18:56:53 UTC (rev 2161) +++ trunk/SKNotesDocument.m 2007-05-26 20:26:19 UTC (rev 2162) @@ -120,23 +120,12 @@ } - (NSData *)notesRTFData { - NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"noteTemplate" ofType:@"txt"]; + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"notesTemplate" ofType:@"rtf"]; NSDictionary *docAttributes = nil; NSAttributedString *templateAttrString = [[NSAttributedString alloc] initWithPath:templatePath documentAttributes:&docAttributes]; - NSEnumerator *noteEnum = [notes objectEnumerator]; - PDFAnnotation *note; - NSMutableAttributedString *mutableAttrString = [[NSMutableAttributedString alloc] init]; - NSAttributedString *attrString; - - while (note = [noteEnum nextObject]) { - if (attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:note]) - [mutableAttrString appendAttributedString:attrString]; - } - - NSData *data = [mutableAttrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; - [mutableAttrString release]; + NSAttributedString *attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:self]; + NSData *data = [attrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; [templateAttrString release]; - return data; } Modified: trunk/Skim.xcodeproj/project.pbxproj =================================================================== --- trunk/Skim.xcodeproj/project.pbxproj 2007-05-26 18:56:53 UTC (rev 2161) +++ trunk/Skim.xcodeproj/project.pbxproj 2007-05-26 20:26:19 UTC (rev 2162) @@ -108,10 +108,10 @@ CE468C480BF1F0F60007AA12 /* AnchoredNoteToolAdorn.tiff in Resources */ = {isa = PBXBuildFile; fileRef = CE468C400BF1F0F60007AA12 /* AnchoredNoteToolAdorn.tiff */; }; CE48BAD70C089EA300A166C6 /* SKTemplateParser.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE48BAD50C089EA300A166C6 /* SKTemplateParser.h */; }; CE48BAD80C089EA300A166C6 /* SKTemplateParser.m in Sources */ = {isa = PBXBuildFile; fileRef = CE48BAD60C089EA300A166C6 /* SKTemplateParser.m */; }; - CE48BBB60C08AD7000A166C6 /* noteTemplate.txt in Resources */ = {isa = PBXBuildFile; fileRef = CE48BBB40C08AD7000A166C6 /* noteTemplate.txt */; }; - CE48BBB70C08AD7000A166C6 /* noteTemplate.rtf in Resources */ = {isa = PBXBuildFile; fileRef = CE48BBB50C08AD7000A166C6 /* noteTemplate.rtf */; }; - CE48BC320C08B58700A166C6 /* noteTemplate.rtf in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE48BBB50C08AD7000A166C6 /* noteTemplate.rtf */; }; - CE48BC330C08B58700A166C6 /* noteTemplate.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE48BBB40C08AD7000A166C6 /* noteTemplate.txt */; }; + CE48BBB60C08AD7000A166C6 /* notesTemplate.txt in Resources */ = {isa = PBXBuildFile; fileRef = CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */; }; + CE48BBB70C08AD7000A166C6 /* notesTemplate.rtf in Resources */ = {isa = PBXBuildFile; fileRef = CE48BBB50C08AD7000A166C6 /* notesTemplate.rtf */; }; + CE48BC320C08B58700A166C6 /* notesTemplate.rtf in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE48BBB50C08AD7000A166C6 /* notesTemplate.rtf */; }; + CE48BC330C08B58700A166C6 /* notesTemplate.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */; }; CE4972510BDE898F00D7F1D2 /* SKMainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49724F0BDE898F00D7F1D2 /* SKMainWindow.m */; }; CE49726D0BDE8A7400D7F1D2 /* PDFSelection_SKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE49726B0BDE8A7400D7F1D2 /* PDFSelection_SKExtensions.m */; }; CE49728B0BDE8B2900D7F1D2 /* SKToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4972890BDE8B2900D7F1D2 /* SKToolbarItem.m */; }; @@ -274,8 +274,8 @@ files = ( CEE22EA30BFB8672002B746B /* displayline in CopyFiles */, CEE22EA40BFB8684002B746B /* skimnotes in CopyFiles */, - CE48BC320C08B58700A166C6 /* noteTemplate.rtf in CopyFiles */, - CE48BC330C08B58700A166C6 /* noteTemplate.txt in CopyFiles */, + CE48BC320C08B58700A166C6 /* notesTemplate.rtf in CopyFiles */, + CE48BC330C08B58700A166C6 /* notesTemplate.txt in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -436,8 +436,8 @@ CE485BF00BC4443B00FA7109 /* Dutch */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Dutch; path = Dutch.lproj/Credits.rtf; sourceTree = "<group>"; }; CE48BAD50C089EA300A166C6 /* SKTemplateParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKTemplateParser.h; sourceTree = "<group>"; }; CE48BAD60C089EA300A166C6 /* SKTemplateParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKTemplateParser.m; sourceTree = "<group>"; }; - CE48BBB40C08AD7000A166C6 /* noteTemplate.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = noteTemplate.txt; sourceTree = "<group>"; }; - CE48BBB50C08AD7000A166C6 /* noteTemplate.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = noteTemplate.rtf; sourceTree = "<group>"; }; + CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = notesTemplate.txt; sourceTree = "<group>"; }; + CE48BBB50C08AD7000A166C6 /* notesTemplate.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = notesTemplate.rtf; sourceTree = "<group>"; }; CE49724E0BDE898F00D7F1D2 /* SKMainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKMainWindow.h; sourceTree = "<group>"; }; CE49724F0BDE898F00D7F1D2 /* SKMainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKMainWindow.m; sourceTree = "<group>"; }; CE49726A0BDE8A7400D7F1D2 /* PDFSelection_SKExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PDFSelection_SKExtensions.h; sourceTree = "<group>"; }; @@ -960,8 +960,8 @@ isa = PBXGroup; children = ( CE1E2F120BDB86A10011D9DD /* displayline */, - CE48BBB50C08AD7000A166C6 /* noteTemplate.rtf */, - CE48BBB40C08AD7000A166C6 /* noteTemplate.txt */, + CE48BBB50C08AD7000A166C6 /* notesTemplate.rtf */, + CE48BBB40C08AD7000A166C6 /* notesTemplate.txt */, ); name = "Shared Support"; sourceTree = "<group>"; @@ -1175,8 +1175,8 @@ CECBA5910BFCEE260030AB59 /* SelectToolAdorn.tiff in Resources */, CE31AC4E0C02E919003612A9 /* ToolbarCrop.tiff in Resources */, CE01D08C0C07157200FA32EF /* ToolbarZoomToSelection.tiff in Resources */, - CE48BBB60C08AD7000A166C6 /* noteTemplate.txt in Resources */, - CE48BBB70C08AD7000A166C6 /* noteTemplate.rtf in Resources */, + CE48BBB60C08AD7000A166C6 /* notesTemplate.txt in Resources */, + CE48BBB70C08AD7000A166C6 /* notesTemplate.rtf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; Deleted: trunk/noteTemplate.rtf =================================================================== --- trunk/noteTemplate.rtf 2007-05-26 18:56:53 UTC (rev 2161) +++ trunk/noteTemplate.rtf 2007-05-26 20:26:19 UTC (rev 2162) @@ -1,16 +0,0 @@ -{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 -{\fonttbl\f0\fswiss\fcharset77 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural - -\f0\fs24 \cf0 \'a5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/>\ -\ -<$contents?>\ -<$contents/>\ -\ -</$contents?>\ -<$text?>\ -<$text/>\ -\ -</$text?>\ -} \ No newline at end of file Deleted: trunk/noteTemplate.txt =================================================================== --- trunk/noteTemplate.txt 2007-05-26 18:56:53 UTC (rev 2161) +++ trunk/noteTemplate.txt 2007-05-26 20:26:19 UTC (rev 2162) @@ -1,10 +0,0 @@ -\xA5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/> - -<$contents?> -<$contents/> - -</$contents?> -<$text?> -<$text/> - -</$text?> Copied: trunk/notesTemplate.rtf (from rev 2161, trunk/noteTemplate.rtf) =================================================================== --- trunk/notesTemplate.rtf (rev 0) +++ trunk/notesTemplate.rtf 2007-05-26 20:26:19 UTC (rev 2162) @@ -0,0 +1,18 @@ +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 <notes>\ +\'a5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/>\ +\ +<$contents?>\ +<$contents/>\ +\ +</$contents?>\ +<$text?>\ +<$text/>\ +\ +</$text?>\ +</notes>\ +} \ No newline at end of file Copied: trunk/notesTemplate.txt (from rev 2161, trunk/noteTemplate.txt) =================================================================== --- trunk/notesTemplate.txt (rev 0) +++ trunk/notesTemplate.txt 2007-05-26 20:26:19 UTC (rev 2162) @@ -0,0 +1,12 @@ +<notes> +\xA5 <$type.typeName/>, page <$pageIndex.numberByAddingOne/> + +<$contents?> +<$contents/> + +</$contents?> +<$text?> +<$text/> + +</$text?> +</notes> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-26 18:56:58
|
Revision: 2161 http://skim-app.svn.sourceforge.net/skim-app/?rev=2161&view=rev Author: hofman Date: 2007-05-26 11:56:53 -0700 (Sat, 26 May 2007) Log Message: ----------- Use templates for notes text export. Template parser copied and modified from BibDesk project. Modified Paths: -------------- trunk/NSCharacterSet_SKExtensions.h trunk/NSCharacterSet_SKExtensions.m trunk/NSString_SKExtensions.h trunk/NSString_SKExtensions.m trunk/SKApplicationController.h trunk/SKApplicationController.m trunk/SKDocument.m trunk/SKNotesDocument.m trunk/Skim.xcodeproj/project.pbxproj Added Paths: ----------- trunk/SKTemplateParser.h trunk/SKTemplateParser.m trunk/noteTemplate.rtf trunk/noteTemplate.txt Modified: trunk/NSCharacterSet_SKExtensions.h =================================================================== --- trunk/NSCharacterSet_SKExtensions.h 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/NSCharacterSet_SKExtensions.h 2007-05-26 18:56:53 UTC (rev 2161) @@ -41,4 +41,5 @@ @interface NSCharacterSet (SKExtensions) + (NSCharacterSet *)newlineCharacterSet; ++ (NSCharacterSet *)nonWhitespaceCharacterSet; @end Modified: trunk/NSCharacterSet_SKExtensions.m =================================================================== --- trunk/NSCharacterSet_SKExtensions.m 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/NSCharacterSet_SKExtensions.m 2007-05-26 18:56:53 UTC (rev 2161) @@ -53,4 +53,11 @@ return newlineCharacterSet; } ++ (NSCharacterSet *)nonWhitespaceCharacterSet { + static NSCharacterSet *nonWhitespaceCharacterSet = nil; + if (nonWhitespaceCharacterSet == nil) + nonWhitespaceCharacterSet = [[[NSCharacterSet whitespaceCharacterSet] invertedSet] copy]; + return nonWhitespaceCharacterSet; +} + @end Modified: trunk/NSString_SKExtensions.h =================================================================== --- trunk/NSString_SKExtensions.h 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/NSString_SKExtensions.h 2007-05-26 18:56:53 UTC (rev 2161) @@ -42,7 +42,14 @@ @interface NSString (SKExtensions) - (NSString *)stringByCollapsingWhitespaceAndNewlinesAndRemovingSurroundingWhitespaceAndNewlines; + - (NSString *)stringByAppendingEllipsis; + - (NSArray *)shellScriptArgumentsArray; +- (NSRange)rangeOfLeadingEmptyLine; +- (NSRange)rangeOfLeadingEmptyLineInRange:(NSRange)range; +- (NSRange)rangeOfTrailingEmptyLine; +- (NSRange)rangeOfTrailingEmptyLineInRange:(NSRange)range; + @end Modified: trunk/NSString_SKExtensions.m =================================================================== --- trunk/NSString_SKExtensions.m 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/NSString_SKExtensions.m 2007-05-26 18:56:53 UTC (rev 2161) @@ -168,4 +168,73 @@ return arguments; } +#pragma mark Empty lines + +// whitespace at the beginning of the string up to the end or until (and including) a newline +- (NSRange)rangeOfLeadingEmptyLine { + return [self rangeOfLeadingEmptyLineInRange:NSMakeRange(0, [self length])]; +} + +- (NSRange)rangeOfLeadingEmptyLineInRange:(NSRange)range { + NSRange firstCharRange = [self rangeOfCharacterFromSet:[NSCharacterSet nonWhitespaceCharacterSet] options:0 range:range]; + NSRange wsRange = NSMakeRange(NSNotFound, 0); + unsigned int start = range.location; + if (firstCharRange.location == NSNotFound) { + wsRange = range; + } else { + unichar firstChar = [self characterAtIndex:firstCharRange.location]; + unsigned int rangeEnd = NSMaxRange(firstCharRange); + if([[NSCharacterSet newlineCharacterSet] characterIsMember:firstChar]) { + if (firstChar == '\r' && rangeEnd < NSMaxRange(range) && [self characterAtIndex:rangeEnd] == '\n') + wsRange = NSMakeRange(start, rangeEnd + 1 - start); + else + wsRange = NSMakeRange(start, rangeEnd - start); + } + } + return wsRange; +} + +// whitespace at the end of the string from the beginning or after a newline +- (NSRange)rangeOfTrailingEmptyLine { + return [self rangeOfTrailingEmptyLineInRange:NSMakeRange(0, [self length])]; +} + +- (NSRange)rangeOfTrailingEmptyLineInRange:(NSRange)range { + NSRange lastCharRange = [self rangeOfCharacterFromSet:[NSCharacterSet nonWhitespaceCharacterSet] options:NSBackwardsSearch range:range]; + NSRange wsRange = NSMakeRange(NSNotFound, 0); + unsigned int end = NSMaxRange(range); + if (lastCharRange.location == NSNotFound) { + wsRange = range; + } else { + unichar lastChar = [self characterAtIndex:lastCharRange.location]; + unsigned int rangeEnd = NSMaxRange(lastCharRange); + if (rangeEnd < end && [[NSCharacterSet newlineCharacterSet] characterIsMember:lastChar]) + wsRange = NSMakeRange(rangeEnd, end - rangeEnd); + } + return wsRange; +} + +#pragma mark Templating support + +- (NSString *)typeName { + if ([self isEqualToString:@"FreeText"]) + return NSLocalizedString(@"Text Note", @"Description for export"); + else if ([self isEqualToString:@"Note"]) + return NSLocalizedString(@"Anchored Note", @"Description for export"); + else if ([self isEqualToString:@"Circle"]) + return NSLocalizedString(@"Circle", @"Description for export"); + else if ([self isEqualToString:@"Square"]) + return NSLocalizedString(@"Box", @"Description for export"); + else if ([self isEqualToString:@"MarkUp"] || [self isEqualToString:@"Highlight"]) + return NSLocalizedString(@"Highlight", @"Description for export"); + else if ([self isEqualToString:@"Underline"]) + return NSLocalizedString(@"Underline", @"Description for export"); + else if ([self isEqualToString:@"StrikeOut"]) + return NSLocalizedString(@"Strike Out", @"Description for export"); + else if ([self isEqualToString:@"Arrow"]) + return NSLocalizedString(@"Arrow", @"Description for export"); + else + return self; +} + @end Modified: trunk/SKApplicationController.h =================================================================== --- trunk/SKApplicationController.h 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/SKApplicationController.h 2007-05-26 18:56:53 UTC (rev 2161) @@ -58,4 +58,7 @@ - (void)doSpotlightImportIfNeeded; +- (NSString *)applicationSupportPathForDomain:(int)domain create:(BOOL)create; +- (NSString *)pathForApplicationSupportFile:(NSString *)file ofType:(NSString *)extension; + @end Modified: trunk/SKApplicationController.m =================================================================== --- trunk/SKApplicationController.m 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/SKApplicationController.m 2007-05-26 18:56:53 UTC (rev 2161) @@ -308,4 +308,79 @@ } } +- (NSString *)applicationSupportPathForDomain:(int)domain create:(BOOL)create { + static NSString *path = nil; + + if (path == nil) { + FSRef foundRef; + OSStatus err = noErr; + + err = FSFindFolder(domain, kApplicationSupportFolderType, create ? kCreateFolder : kDontCreateFolder, &foundRef); + if (err != noErr) { + if (create) + NSLog(@"Error %d: the system was unable to find your Application Support folder.", err); + return nil; + } + + CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &foundRef); + + if (url != nil) { + path = [(NSURL *)url path]; + CFRelease(url); + } + + NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleExecutableKey]; + + if(appName == nil) + [NSException raise:NSObjectNotAvailableException format:NSLocalizedString(@"Unable to find CFBundleIdentifier for %@", @"Exception message"), [NSApp description]]; + + path = [[path stringByAppendingPathComponent:appName] copy]; + + // the call to FSFindFolder creates the parent hierarchy, but not the directory we're looking for + static BOOL dirExists = NO; + if (dirExists == NO && create) { + BOOL pathIsDir; + dirExists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&pathIsDir]; + if (dirExists == NO || pathIsDir == NO) + [[NSFileManager defaultManager] createDirectoryAtPath:path attributes:nil]; + // make sure it was created + dirExists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&pathIsDir]; + NSAssert1(dirExists && pathIsDir, @"Unable to create folder %@", path); + } + } + + return path; +} + +- (NSString *)pathForApplicationSupportFile:(NSString *)file ofType:(NSString *)extension { + NSFileManager *fm = [NSFileManager defaultManager]; + NSString *filename = [file stringByAppendingPathExtension:extension]; + NSString *fullPath = nil; + NSString *appSupportPath = nil; + if (appSupportPath = [self applicationSupportPathForDomain:kUserDomain create:NO]) { + fullPath = [appSupportPath stringByAppendingPathComponent:filename]; + if ([fm fileExistsAtPath:fullPath] == NO) { + fullPath = nil; + if (appSupportPath = [self applicationSupportPathForDomain:kLocalDomain create:NO]) { + fullPath = [appSupportPath stringByAppendingPathComponent:filename]; + if ([fm fileExistsAtPath:fullPath] == NO) { + fullPath = nil; + if (appSupportPath = [self applicationSupportPathForDomain:kNetworkDomain create:NO]) { + fullPath = [appSupportPath stringByAppendingPathComponent:filename]; + if ([fm fileExistsAtPath:fullPath] == NO) { + fullPath = nil; + if (appSupportPath = [[NSBundle mainBundle] sharedSupportPath]) { + fullPath = [appSupportPath stringByAppendingPathComponent:filename]; + if ([fm fileExistsAtPath:fullPath] == NO) + fullPath = nil; + } + } + } + } + } + } + } + return fullPath; +} + @end Modified: trunk/SKDocument.m =================================================================== --- trunk/SKDocument.m 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/SKDocument.m 2007-05-26 18:56:53 UTC (rev 2161) @@ -51,6 +51,8 @@ #import "SKPDFSynchronizer.h" #import "NSString_SKExtensions.h" #import "SKDocumentController.h" +#import "SKTemplateParser.h" +#import "SKApplicationController.h" // maximum length of xattr value recommended by Apple #define MAX_XATTR_LENGTH 2048 @@ -758,106 +760,39 @@ } - (NSString *)notesString { + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"noteTemplate" ofType:@"txt"]; + NSString *templateString = [[NSString alloc] initWithContentsOfFile:templatePath encoding:NSUTF8StringEncoding error:NULL]; NSEnumerator *noteEnum = [[[self mainWindowController] notes] objectEnumerator]; PDFAnnotation *note; NSMutableString *mutableString = [NSMutableString stringWithCapacity:2048]; + NSString *string; while (note = [noteEnum nextObject]) { - NSString *type = [note type]; - NSString *contents = [note contents]; - NSString *textString = [[note text] string]; - NSString *tmpString = nil; - - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"SKExcludeNoteDescriptionFromNotesAsText"] == NO) { - if ([type isEqualToString:@"FreeText"]) - tmpString = NSLocalizedString(@"Text Note", @"Description for export"); - else if ([type isEqualToString:@"Note"]) - tmpString = NSLocalizedString(@"Anchored Note", @"Description for export"); - else if ([type isEqualToString:@"Circle"]) - tmpString = NSLocalizedString(@"Circle", @"Description for export"); - else if ([type isEqualToString:@"Square"]) - tmpString = NSLocalizedString(@"Box", @"Description for export"); - else if ([type isEqualToString:@"MarkUp"] || [type isEqualToString:@"Highlight"]) - tmpString = NSLocalizedString(@"Highlight", @"Description for export"); - else if ([type isEqualToString:@"Underline"]) - tmpString = NSLocalizedString(@"Underline", @"Description for export"); - else if ([type isEqualToString:@"StrikeOut"]) - tmpString = NSLocalizedString(@"Strike Out", @"Description for export"); - else if ([type isEqualToString:@"Arrow"]) - tmpString = NSLocalizedString(@"Arrow", @"Description for export"); - [mutableString appendFormat:NSLocalizedString(@"%C %@, page %i", @"Description for export"), 0x2022, tmpString, [note pageIndex] + 1]; - [mutableString appendString:@"\n\n"]; - } - - if (contents) { - [mutableString appendString:contents]; - [mutableString appendString:@"\n\n"]; - } - - if (textString) { - [mutableString appendString:textString]; - [mutableString appendString:@"\n\n"]; - } + if (string = [SKTemplateParser stringByParsingTemplate:templateString usingObject:note]) + [mutableString appendString:string]; } + [templateString release]; + return mutableString; } - (NSData *)notesRTFData { - NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] init]; + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"noteTemplate" ofType:@"txt"]; + NSDictionary *docAttributes = nil; + NSAttributedString *templateAttrString = [[NSAttributedString alloc] initWithPath:templatePath documentAttributes:&docAttributes]; NSEnumerator *noteEnum = [[[self mainWindowController] notes] objectEnumerator]; PDFAnnotation *note; - NSData *data; - NSFont *standardFont = [NSFont systemFontOfSize:12.0]; - NSAttributedString *newlinesAttrString = [[NSAttributedString alloc] initWithString:@"\n\n" attributes:[NSDictionary dictionaryWithObjectsAndKeys:standardFont, NSFontAttributeName, nil]]; + NSMutableAttributedString *mutableAttrString = [[NSMutableAttributedString alloc] init]; + NSAttributedString *attrString; while (note = [noteEnum nextObject]) { - NSString *type = [note type]; - NSString *contents = [note contents]; - NSFont *font = [note respondsToSelector:@selector(font)] ? [(PDFAnnotationFreeText *)note font] : standardFont; - NSAttributedString *tmpAttrString = nil; - NSString *tmpString = nil; - - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"SKExcludeNoteDescriptionFromNotesAsText"] == NO) { - if ([type isEqualToString:@"FreeText"]) - tmpString = NSLocalizedString(@"Text Note", @"Description for export"); - else if ([type isEqualToString:@"Note"]) - tmpString = NSLocalizedString(@"Anchored Note", @"Description for export"); - else if ([type isEqualToString:@"Circle"]) - tmpString = NSLocalizedString(@"Circle", @"Description for export"); - else if ([type isEqualToString:@"Square"]) - tmpString = NSLocalizedString(@"Box", @"Description for export"); - else if ([type isEqualToString:@"MarkUp"] || [type isEqualToString:@"Highlight"]) - tmpString = NSLocalizedString(@"Highlight", @"Description for export"); - else if ([type isEqualToString:@"Underline"]) - tmpString = NSLocalizedString(@"Underline", @"Description for export"); - else if ([type isEqualToString:@"StrikeOut"]) - tmpString = NSLocalizedString(@"Strike Out", @"Description for export"); - else if ([type isEqualToString:@"Arrow"]) - tmpString = NSLocalizedString(@"Arrow", @"Description for export"); - tmpString = [NSString stringWithFormat:NSLocalizedString(@"%C %@, page %i", @"Description for export"), 0x2022, tmpString, [note pageIndex] + 1]; - tmpAttrString = [[NSAttributedString alloc] initWithString:tmpString attributes:[NSDictionary dictionaryWithObjectsAndKeys:standardFont, NSFontAttributeName, nil]]; - [attrString appendAttributedString:tmpAttrString]; - [tmpAttrString release]; - [attrString appendAttributedString:newlinesAttrString]; - } - - if ([contents length]) { - tmpAttrString = [[NSAttributedString alloc] initWithString:contents ? contents : @"" attributes:[NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil]]; - [attrString appendAttributedString:tmpAttrString]; - [tmpAttrString release]; - [attrString appendAttributedString:newlinesAttrString]; - } - - tmpAttrString = [note text]; - if ([tmpAttrString length]) { - [attrString appendAttributedString:tmpAttrString]; - [attrString appendAttributedString:newlinesAttrString]; - } + if (attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:note]) + [mutableAttrString appendAttributedString:attrString]; } - data = [attrString RTFFromRange:NSMakeRange(0, [attrString length]) documentAttributes:nil]; - [attrString release]; - [newlinesAttrString release]; + NSData *data = [mutableAttrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; + [mutableAttrString release]; + [templateAttrString release]; return data; } Modified: trunk/SKNotesDocument.m =================================================================== --- trunk/SKNotesDocument.m 2007-05-26 16:35:52 UTC (rev 2160) +++ trunk/SKNotesDocument.m 2007-05-26 18:56:53 UTC (rev 2161) @@ -41,6 +41,8 @@ #import "SKNoteOutlineView.h" #import "BDAlias.h" #import "SKDocumentController.h" +#import "SKTemplateParser.h" +#import "SKApplicationController.h" @implementation SKNotesDocument @@ -118,59 +120,22 @@ } - (NSData *)notesRTFData { - NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] init]; + NSString *templatePath = [[NSApp delegate] pathForApplicationSupportFile:@"noteTemplate" ofType:@"txt"]; + NSDictionary *docAttributes = nil; + NSAttributedString *templateAttrString = [[NSAttributedString alloc] initWithPath:templatePath documentAttributes:&docAttributes]; NSEnumerator *noteEnum = [notes objectEnumerator]; - NSDictionary *note; - NSData *data; - NSFont *standardFont = [NSFont systemFontOfSize:12.0]; - NSAttributedString *newlinesAttrString = [[NSAttributedString alloc] initWithString:@"\n\n" attributes:[NSDictionary dictionaryWithObjectsAndKeys:standardFont, NSFontAttributeName, nil]]; + PDFAnnotation *note; + NSMutableAttributedString *mutableAttrString = [[NSMutableAttributedString alloc] init]; + NSAttributedString *attrString; while (note = [noteEnum nextObject]) { - NSString *type = [note valueForKey:@"type"]; - NSString *contents = [note valueForKey:@"contents"]; - NSFont *font = [note valueForKey:@"font"]; - NSAttributedString *tmpAttrString = nil; - NSString *tmpString = nil; - - if ([type isEqualToString:@"FreeText"]) - tmpString = NSLocalizedString(@"Text Note", @"Description for export"); - else if ([type isEqualToString:@"Note"]) - tmpString = NSLocalizedString(@"Anchored Note", @"Description for export"); - else if ([type isEqualToString:@"Circle"]) - tmpString = NSLocalizedString(@"Circle", @"Description for export"); - else if ([type isEqualToString:@"Square"]) - tmpString = NSLocalizedString(@"Box", @"Description for export"); - else if ([type isEqualToString:@"MarkUp"] || [type isEqualToString:@"Highlight"]) - tmpString = NSLocalizedString(@"Highlight", @"Description for export"); - else if ([type isEqualToString:@"Underline"]) - tmpString = NSLocalizedString(@"Underline", @"Description for export"); - else if ([type isEqualToString:@"StrikeOut"]) - tmpString = NSLocalizedString(@"Strike Out", @"Description for export"); - else if ([type isEqualToString:@"Arrow"]) - tmpString = NSLocalizedString(@"Arrow", @"Description for export"); - tmpString = [NSString stringWithFormat:NSLocalizedString(@"%C %@, page %i", @"Description for export"), 0x2022, tmpString, [[note valueForKey:@"pageIndex"] unsignedIntValue] + 1]; - tmpAttrString = [[NSAttributedString alloc] initWithString:tmpString attributes:[NSDictionary dictionaryWithObjectsAndKeys:standardFont, NSFontAttributeName, nil]]; - [attrString appendAttributedString:tmpAttrString]; - [tmpAttrString release]; - [attrString appendAttributedString:newlinesAttrString]; - - if ([contents length]) { - tmpAttrString = [[NSAttributedString alloc] initWithString:contents ? contents : @"" attributes:[NSDictionary dictionaryWithObjectsAndKeys:font ? font : standardFont, NSFontAttributeName, nil]]; - [attrString appendAttributedString:tmpAttrString]; - [tmpAttrString release]; - [attrString appendAttributedString:newlinesAttrString]; - } - - tmpAttrString = [note valueForKey:@"text"]; - if ([tmpAttrString length]) { - [attrString appendAttributedString:tmpAttrString]; - [attrString appendAttributedString:newlinesAttrString]; - } + if (attrString = [SKTemplateParser attributedStringByParsingTemplate:templateAttrString usingObject:note]) + [mutableAttrString appendAttributedString:attrString]; } - data = [attrString RTFFromRange:NSMakeRange(0, [attrString length]) documentAttributes:nil]; - [attrString release]; - [newlinesAttrString release]; + NSData *data = [mutableAttrString RTFFromRange:NSMakeRange(0, [mutableAttrString length]) documentAttributes:docAttributes]; + [mutableAttrString release]; + [templateAttrString release]; return data; } Added: trunk/SKTemplateParser.h =================================================================== --- trunk/SKTemplateParser.h (rev 0) +++ trunk/SKTemplateParser.h 2007-05-26 18:56:53 UTC (rev 2161) @@ -0,0 +1,73 @@ +// +// SKTemplateParser.h +// Skim +// +// Created by Christiaan Hofman on 5/26/07. +/* + This software is Copyright (c) 2007 + Christiaan Hofman. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Christiaan Hofman nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import <Cocoa/Cocoa.h> + + +@protocol SKTemplateParserDelegate + +- (void)templateParserWillParseTemplate:(id)template usingObject:(id)object isAttributed:(BOOL)flag; +- (void)templateParserDidParseTemplate:(id)template usingObject:(id)object isAttributed:(BOOL)flag; + +@end + + +@interface SKTemplateParser : NSObject + ++ (NSString *)stringByParsingTemplate:(NSString *)template usingObject:(id)object; ++ (NSString *)stringByParsingTemplate:(NSString *)template usingObject:(id)object delegate:(id <SKTemplateParserDelegate>)delegate; ++ (NSAttributedString *)attributedStringByParsingTemplate:(NSAttributedString *)template usingObject:(id)object; ++ (NSAttributedString *)attributedStringByParsingTemplate:(NSAttributedString *)template usingObject:(id)object delegate:(id <SKTemplateParserDelegate>)delegate; + +@end + + +@interface NSObject (SKTemplateParser) +- (NSString *)stringDescription; +- (BOOL)isNotEmpty; +@end + + +@interface NSScanner (SKTemplateParser) +- (BOOL)scanEmptyLine; +@end + + +@interface NSAttributedString (SKTemplateParser) +- (id)initWithAttributedString:(NSAttributedString *)attributedString attributes:(NSDictionary *)attributes; +@end Added: trunk/SKTemplateParser.m =================================================================== --- trunk/SKTemplateParser.m (rev 0) +++ trunk/SKTemplateParser.m 2007-05-26 18:56:53 UTC (rev 2161) @@ -0,0 +1,836 @@ +// +// SKTemplateParser.m +// Skim +// +// Created by Christiaan Hofman on 5/26/07. +/* + This software is Copyright (c) 2007 + Christiaan Hofman. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of Christiaan Hofman nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SKTemplateParser.h" +#import "NSCharacterSet_SKExtensions.h" +#import "NSString_SKExtensions.h" + +#define STARTTAG_OPEN_DELIM @"<$" +#define ENDTAG_OPEN_DELIM @"</$" +#define SEPTAG_OPEN_DELIM @"<?$" +#define SINGLETAG_CLOSE_DELIM @"/>" +#define MULTITAG_CLOSE_DELIM @">" +#define CONDITIONTAG_CLOSE_DELIM @"?>" +#define CONDITIONTAG_EQUAL @"=" +#define CONDITIONTAG_CONTAIN @"~" + +/* + single tag: <$key/> + multi tag: <$key> </$key> + or: <$key> <?$key> </$key> + condition tag: <$key?> </$key?> + or: <$key?> <?$key?> </$key?> + or: <$key=value?> </$key?> + or: <$key=value?> <?$key?> </$key?> + or: <$key~value?> </$key?> + or: <$key~value?> <?$key?> </$key?> +*/ + +@implementation SKTemplateParser + + +static NSCharacterSet *keyCharacterSet = nil; +static NSCharacterSet *invertedKeyCharacterSet = nil; + ++ (void)initialize { + + NSMutableCharacterSet *tmpSet = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; + [tmpSet addCharactersInString:@".-:;@"]; + keyCharacterSet = [tmpSet copy]; + [tmpSet release]; + + invertedKeyCharacterSet = [[keyCharacterSet invertedSet] copy]; +} + +static NSMutableDictionary *endMultiDict = nil; +static inline NSString *endMultiTagWithTag(NSString *tag){ + if(nil == endMultiDict) + endMultiDict = [[NSMutableDictionary alloc] init]; + + NSString *endTag = [endMultiDict objectForKey:tag]; + if(nil == endTag){ + endTag = [NSString stringWithFormat:@"%@%@%@", ENDTAG_OPEN_DELIM, tag, MULTITAG_CLOSE_DELIM]; + [endMultiDict setObject:endTag forKey:tag]; + } + return endTag; +} + +static NSMutableDictionary *sepMultiDict = nil; +static inline NSString *sepMultiTagWithTag(NSString *tag){ + if(nil == sepMultiDict) + sepMultiDict = [[NSMutableDictionary alloc] init]; + + NSString *altTag = [sepMultiDict objectForKey:tag]; + if(nil == altTag){ + altTag = [NSString stringWithFormat:@"%@%@%@", SEPTAG_OPEN_DELIM, tag, MULTITAG_CLOSE_DELIM]; + [sepMultiDict setObject:altTag forKey:tag]; + } + return altTag; +} + +static NSMutableDictionary *endConditionDict = nil; +static inline NSString *endConditionTagWithTag(NSString *tag){ + if(nil == endConditionDict) + endConditionDict = [[NSMutableDictionary alloc] init]; + + NSString *endTag = [endConditionDict objectForKey:tag]; + if(nil == endTag){ + endTag = [NSString stringWithFormat:@"%@%@%@", ENDTAG_OPEN_DELIM, tag, CONDITIONTAG_CLOSE_DELIM]; + [endConditionDict setObject:endTag forKey:tag]; + } + return endTag; +} + +static NSMutableDictionary *altConditionDict = nil; +static inline NSString *altConditionTagWithTag(NSString *tag){ + if(nil == altConditionDict) + altConditionDict = [[NSMutableDictionary alloc] init]; + + NSString *altTag = [altConditionDict objectForKey:tag]; + if(nil == altTag){ + altTag = [NSString stringWithFormat:@"%@%@%@", SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_CLOSE_DELIM]; + [altConditionDict setObject:altTag forKey:tag]; + } + return altTag; +} + +static NSMutableDictionary *equalConditionDict = nil; +static inline NSString *equalConditionTagWithTag(NSString *tag){ + if(nil == equalConditionDict) + equalConditionDict = [[NSMutableDictionary alloc] init]; + + NSString *equalTag = [equalConditionDict objectForKey:tag]; + if(nil == equalTag){ + equalTag = [NSString stringWithFormat:@"%@%@%@", SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_EQUAL]; + [equalConditionDict setObject:equalTag forKey:tag]; + } + return equalTag; +} + +static NSMutableDictionary *containConditionDict = nil; +static inline NSString *containConditionTagWithTag(NSString *tag){ + if(nil == containConditionDict) + containConditionDict = [[NSMutableDictionary alloc] init]; + + NSString *containTag = [containConditionDict objectForKey:tag]; + if(nil == containTag){ + containTag = [NSString stringWithFormat:@"%@%@%@", SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_CONTAIN]; + [containConditionDict setObject:containTag forKey:tag]; + } + return containTag; +} + +static inline NSRange altTemplateTagRange(NSString *template, NSString *altTag, NSString *endDelim, NSString **argString){ + NSRange altTagRange = [template rangeOfString:altTag]; + if (altTagRange.location != NSNotFound) { + // ignore whitespaces before the tag + NSRange wsRange = [template rangeOfTrailingEmptyLineInRange:NSMakeRange(0, altTagRange.location)]; + if (wsRange.location != NSNotFound) + altTagRange = NSMakeRange(wsRange.location, NSMaxRange(altTagRange) - wsRange.location); + if (nil != endDelim) { + // find the end tag and the argument (match string) + NSRange endRange = [template rangeOfString:endDelim options:0 range:NSMakeRange(NSMaxRange(altTagRange), [template length] - NSMaxRange(altTagRange))]; + if (endRange.location != NSNotFound) { + *argString = [template substringWithRange:NSMakeRange(NSMaxRange(altTagRange), endRange.location - NSMaxRange(altTagRange))]; + altTagRange.length = NSMaxRange(endRange) - altTagRange.location; + } else { + *argString = @""; + } + } + // ignore whitespaces after the tag, including a trailing newline + wsRange = [template rangeOfLeadingEmptyLineInRange:NSMakeRange(NSMaxRange(altTagRange), [template length] - NSMaxRange(altTagRange))]; + if (wsRange.location != NSNotFound) + altTagRange.length = NSMaxRange(wsRange) - altTagRange.location; + } + return altTagRange; +} + ++ (NSString *)stringByParsingTemplate:(NSString *)template usingObject:(id)object { + return [self stringByParsingTemplate:template usingObject:object delegate:nil]; +} + ++ (NSString *)stringByParsingTemplate:(NSString *)template usingObject:(id)object delegate:(id <SKTemplateParserDelegate>)delegate { + NSScanner *scanner = [[NSScanner alloc] initWithString:template]; + NSMutableString *result = [[NSMutableString alloc] init]; + + [scanner setCharactersToBeSkipped:nil]; + + while (![scanner isAtEnd]) { + NSString *beforeText = nil; + NSString *tag = nil; + id keyValue = nil; + int start; + + if ([scanner scanUpToString:STARTTAG_OPEN_DELIM intoString:&beforeText]) + [result appendString:beforeText]; + + if ([scanner scanString:STARTTAG_OPEN_DELIM intoString:nil]) { + + start = [scanner scanLocation]; + + // scan the key, must be letters and dots. We don't allow extra spaces + // scanUpToCharactersFromSet is used for efficiency instead of scanCharactersFromSet + [scanner scanUpToCharactersFromSet:invertedKeyCharacterSet intoString:&tag]; + + if ([scanner scanString:SINGLETAG_CLOSE_DELIM intoString:nil]) { + + // simple template tag + @try{ keyValue = [object valueForKeyPath:tag]; } + @catch (id exception) { keyValue = nil; } + if (keyValue != nil) + [result appendString:[keyValue stringDescription]]; + + } else if ([scanner scanString:MULTITAG_CLOSE_DELIM intoString:nil]) { + + NSString *itemTemplate = nil, *lastItemTemplate = nil; + NSMutableString *tmpString; + NSString *endTag; + NSRange sepTagRange, wsRange; + + // collection template tag + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [result rangeOfTrailingEmptyLine]; + if (wsRange.location != NSNotFound) + [result deleteCharactersInRange:wsRange]; + + endTag = endMultiTagWithTag(tag); + // ignore the rest of an empty line after the tag + [scanner scanEmptyLine]; + if ([scanner scanString:endTag intoString:nil]) + continue; + if ([scanner scanUpToString:endTag intoString:&itemTemplate] && [scanner scanString:endTag intoString:nil]) { + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [itemTemplate rangeOfTrailingEmptyLine]; + if (wsRange.location != NSNotFound) + itemTemplate = [itemTemplate substringToIndex:wsRange.location]; + + sepTagRange = altTemplateTagRange(itemTemplate, sepMultiTagWithTag(tag), nil, NULL); + if (sepTagRange.location != NSNotFound) { + lastItemTemplate = [itemTemplate substringToIndex:sepTagRange.location]; + tmpString = [itemTemplate mutableCopy]; + [tmpString deleteCharactersInRange:sepTagRange]; + itemTemplate = [tmpString autorelease]; + } else { + lastItemTemplate = nil; + } + + @try{ keyValue = [object valueForKeyPath:tag]; } + @catch (id exception) { keyValue = nil; } + if ([keyValue respondsToSelector:@selector(objectEnumerator)]) { + NSEnumerator *itemE = [keyValue objectEnumerator]; + id nextItem, item = [itemE nextObject]; + while (item) { + nextItem = [itemE nextObject]; + if (lastItemTemplate != nil && nextItem == nil) + itemTemplate = lastItemTemplate; + [delegate templateParserWillParseTemplate:itemTemplate usingObject:item isAttributed:NO]; + keyValue = [self stringByParsingTemplate:itemTemplate usingObject:item delegate:delegate]; + [delegate templateParserDidParseTemplate:itemTemplate usingObject:item isAttributed:NO]; + if (keyValue != nil) + [result appendString:keyValue]; + item = nextItem; + } + } + // ignore the the rest of an empty line after the tag + [scanner scanEmptyLine]; + + } + + } else { + + NSString *matchString = nil; + BOOL matchEqual = NO; + BOOL matchContain = NO; + + if ([scanner scanString:CONDITIONTAG_EQUAL intoString:nil]) { + if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM intoString:&matchString] == NO) + matchString = @""; + matchEqual = YES; + } else if ([scanner scanString:CONDITIONTAG_CONTAIN intoString:nil]) { + if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM intoString:&matchString] == NO) + matchString = @""; + matchContain = YES; + } + + if ([scanner scanString:CONDITIONTAG_CLOSE_DELIM intoString:nil]) { + + NSMutableArray *subTemplates, *matchStrings; + NSString *subTemplate = nil; + NSString *endTag, *altTag; + NSRange altTagRange, wsRange; + BOOL isMatch; + unsigned i, count; + + // condition template tag + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [result rangeOfTrailingEmptyLine]; + if (wsRange.location != NSNotFound) + [result deleteCharactersInRange:wsRange]; + + endTag = endConditionTagWithTag(tag); + // ignore the rest of an empty line after the tag + [scanner scanEmptyLine]; + if ([scanner scanString:endTag intoString:nil]) + continue; + if ([scanner scanUpToString:endTag intoString:&subTemplate] && [scanner scanString:endTag intoString:nil]) { + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [subTemplate rangeOfTrailingEmptyLine]; + if (wsRange.location != NSNotFound) + subTemplate = [subTemplate substringToIndex:wsRange.location]; + + subTemplates = [[NSMutableArray alloc] init]; + matchStrings = [[NSMutableArray alloc] initWithObjects:matchString ? matchString : @"", nil]; + + if (matchEqual || matchContain) { + altTag = matchEqual ? equalConditionTagWithTag(tag) : containConditionTagWithTag(tag); + altTagRange = altTemplateTagRange(subTemplate, altTag, CONDITIONTAG_CLOSE_DELIM, &matchString); + while (altTagRange.location != NSNotFound) { + [subTemplates addObject:[subTemplate substringToIndex:altTagRange.location]]; + [matchStrings addObject:matchString]; + subTemplate = [subTemplate substringFromIndex:NSMaxRange(altTagRange)]; + altTagRange = altTemplateTagRange(subTemplate, altTag, CONDITIONTAG_CLOSE_DELIM, &matchString); + } + } + + altTagRange = altTemplateTagRange(subTemplate, altConditionTagWithTag(tag), nil, NULL); + if (altTagRange.location != NSNotFound) { + [subTemplates addObject:[subTemplate substringToIndex:altTagRange.location]]; + subTemplate = [subTemplate substringFromIndex:NSMaxRange(altTagRange)]; + } + [subTemplates addObject:subTemplate]; + + @try{ keyValue = [object valueForKeyPath:tag]; } + @catch (id exception) { keyValue = nil; } + count = [matchStrings count]; + subTemplate = nil; + for (i = 0; i < count; i++) { + isMatch = [keyValue isNotEmpty]; + matchString = [matchStrings objectAtIndex:i]; + if (matchEqual) { + isMatch = [matchString isEqualToString:@""] ? NO == isMatch : [[keyValue stringDescription] caseInsensitiveCompare:matchString] == NSOrderedSame; + } else if (matchContain) { + isMatch = [matchString isEqualToString:@""] ? NO == isMatch : [[keyValue stringDescription] rangeOfString:matchString options:NSCaseInsensitiveSearch].location != NSNotFound; + } + if (isMatch) { + subTemplate = [subTemplates objectAtIndex:i]; + break; + } + } + if (subTemplate == nil && [subTemplates count] > count) { + subTemplate = [subTemplates objectAtIndex:count]; + } + if (subTemplate != nil) { + keyValue = [self stringByParsingTemplate:subTemplate usingObject:object delegate:delegate]; + [result appendString:keyValue]; + } + [subTemplates release]; + [matchStrings release]; + // ignore the the rest of an empty line after the tag + [scanner scanEmptyLine]; + + } + + } else { + + // an open delimiter without a close delimiter, so no template tag. Rewind + [result appendString:STARTTAG_OPEN_DELIM]; + [scanner setScanLocation:start]; + + } + } + } // scan STARTTAG_OPEN_DELIM + } // while + [scanner release]; + return [result autorelease]; +} + ++ (NSAttributedString *)attributedStringByParsingTemplate:(NSAttributedString *)template usingObject:(id)object { + return [self attributedStringByParsingTemplate:template usingObject:object delegate:nil]; +} + ++ (NSAttributedString *)attributedStringByParsingTemplate:(NSAttributedString *)template usingObject:(id)object delegate:(id <SKTemplateParserDelegate>)delegate { + NSString *templateString = [template string]; + NSScanner *scanner = [[NSScanner alloc] initWithString:templateString]; + NSMutableAttributedString *result = [[NSMutableAttributedString alloc] init]; + + [scanner setCharactersToBeSkipped:nil]; + + while (![scanner isAtEnd]) { + NSString *beforeText = nil; + NSString *tag = nil; + id keyValue = nil; + int start; + NSDictionary *attr = nil; + NSAttributedString *tmpAttrStr = nil; + + start = [scanner scanLocation]; + + if ([scanner scanUpToString:STARTTAG_OPEN_DELIM intoString:&beforeText]) + [result appendAttributedString:[template attributedSubstringFromRange:NSMakeRange(start, [beforeText length])]]; + + if ([scanner scanString:STARTTAG_OPEN_DELIM intoString:nil]) { + + attr = [template attributesAtIndex:[scanner scanLocation] - 1 effectiveRange:NULL]; + start = [scanner scanLocation]; + + // scan the key, must be letters and dots. We don't allow extra spaces + // scanUpToCharactersFromSet is used for efficiency instead of scanCharactersFromSet + [scanner scanUpToCharactersFromSet:invertedKeyCharacterSet intoString:&tag]; + + if ([scanner scanString:SINGLETAG_CLOSE_DELIM intoString:nil]) { + + // simple template tag + @try{ keyValue = [object valueForKeyPath:tag]; } + @catch (id exception) { keyValue = nil; } + if (keyValue != nil) { + if ([keyValue isKindOfClass:[NSAttributedString class]]) { + tmpAttrStr = [[NSAttributedString alloc] initWithAttributedString:keyValue attributes:attr]; + } else { + tmpAttrStr = [[NSAttributedString alloc] initWithString:[keyValue stringDescription] attributes:attr]; + } + [result appendAttributedString:tmpAttrStr]; + [tmpAttrStr release]; + } + + } else if ([scanner scanString:MULTITAG_CLOSE_DELIM intoString:nil]) { + + NSString *itemTemplateString = nil; + NSAttributedString *itemTemplate = nil, *lastItemTemplate = nil; + NSString *endTag; + NSRange sepTagRange, wsRange; + + // collection template tag + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [[result string] rangeOfTrailingEmptyLine]; + if (wsRange.location != NSNotFound) + [result deleteCharactersInRange:wsRange]; + + endTag = endMultiTagWithTag(tag); + // ignore the rest of an empty line after the tag + [scanner scanEmptyLine]; + if ([scanner scanString:endTag intoString:nil]) + continue; + start = [scanner scanLocation]; + if ([scanner scanUpToString:endTag intoString:&itemTemplateString] && [scanner scanString:endTag intoString:nil]) { + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [itemTemplateString rangeOfTrailingEmptyLine]; + itemTemplate = [template attributedSubstringFromRange:NSMakeRange(start, [itemTemplateString length] - wsRange.length)]; + + sepTagRange = altTemplateTagRange([itemTemplate string], sepMultiTagWithTag(tag), nil, NULL); + if (sepTagRange.location != NSNotFound) { + lastItemTemplate = [itemTemplate attributedSubstringFromRange:NSMakeRange(0, sepTagRange.location)]; + tmpAttrStr = [itemTemplate mutableCopy]; + [(NSMutableAttributedString *)tmpAttrStr deleteCharactersInRange:sepTagRange]; + itemTemplate = [tmpAttrStr autorelease]; + } else { + lastItemTemplate = nil; + } + + @try{ keyValue = [object valueForKeyPath:tag]; } + @catch (id exception) { keyValue = nil; } + if ([keyValue respondsToSelector:@selector(objectEnumerator)]) { + NSEnumerator *itemE = [keyValue objectEnumerator]; + id nextItem, item = [itemE nextObject]; + while (item) { + nextItem = [itemE nextObject]; + if (lastItemTemplate != nil && nextItem == nil) + itemTemplate = lastItemTemplate; + [delegate templateParserWillParseTemplate:itemTemplate usingObject:item isAttributed:YES]; + tmpAttrStr = [self attributedStringByParsingTemplate:itemTemplate usingObject:item delegate:delegate]; + [delegate templateParserDidParseTemplate:itemTemplate usingObject:item isAttributed:YES]; + if (tmpAttrStr != nil) + [result appendAttributedString:tmpAttrStr]; + item = nextItem; + } + } + // ignore the the rest of an empty line after the tag + [scanner scanEmptyLine]; + + } + + } else { + + NSString *matchString = nil; + BOOL matchEqual = NO; + BOOL matchContain = NO; + + if ([scanner scanString:CONDITIONTAG_EQUAL intoString:nil]) { + if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM intoString:&matchString] == NO) + matchString = @""; + matchEqual = YES; + } else if ([scanner scanString:CONDITIONTAG_CONTAIN intoString:nil]) { + if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM intoString:&matchString] == NO) + matchString = @""; + matchContain = YES; + } + + if ([scanner scanString:CONDITIONTAG_CLOSE_DELIM intoString:nil]) { + + NSMutableArray *subTemplates, *matchStrings; + NSString *subTemplateString = nil; + NSAttributedString *subTemplate = nil; + NSString *endTag, *altTag; + NSRange altTagRange, wsRange; + BOOL isMatch; + unsigned i, count; + + // condition template tag + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [[result string] rangeOfTrailingEmptyLine]; + if (wsRange.location != NSNotFound) + [result deleteCharactersInRange:wsRange]; + + endTag = endConditionTagWithTag(tag); + altTag = altConditionTagWithTag(tag); + // ignore the rest of an empty line after the tag + [scanner scanEmptyLine]; + if ([scanner scanString:endTag intoString:nil]) + continue; + start = [scanner scanLocation]; + if ([scanner scanUpToString:endTag intoString:&subTemplateString] && [scanner scanString:endTag intoString:nil]) { + // ignore whitespace before the tag. Should we also remove a newline? + wsRange = [subTemplateString rangeOfTrailingEmptyLine]; + subTemplate = [template attributedSubstringFromRange:NSMakeRange(start, [subTemplateString length] - wsRange.length)]; + + subTemplates = [[NSMutableArray alloc] init]; + matchStrings = [[NSMutableArray alloc] initWithObjects:matchString ? matchString : @"", nil]; + + if (matchEqual || matchContain) { + altTag = matchEqual ? equalConditionTagWithTag(tag) : containConditionTagWithTag(tag); + altTagRange = altTemplateTagRange([subTemplate string], altTag, CONDITIONTAG_CLOSE_DELIM, &matchString); + while (altTagRange.location != NSNotFound) { + [subTemplates addObject:[subTemplate attributedSubstringFromRange:NSMakeRange(0, altTagRange.location)]]; + [matchStrings addObject:matchString]; + subTemplate = [subTemplate attributedSubstringFromRange:NSMakeRange(NSMaxRange(altTagRange), [subTemplate length] - NSMaxRange(altTagRange))]; + altTagRange = altTemplateTagRange([subTemplate string], altTag, CONDITIONTAG_CLOSE_DELIM, &matchString); + } + } + + altTagRange = altTemplateTagRange([subTemplate string], altConditionTagWithTag(tag), nil, NULL); + if (altTagRange.location != NSNotFound) { + [subTemplates addObject:[subTemplate attributedSubstringFromRange:NSMakeRange(0, altTagRange.location)]]; + subTemplate = [subTemplate attributedSubstringFromRange:NSMakeRange(NSMaxRange(altTagRange), [subTemplate length] - NSMaxRange(altTagRange))]; + } + [subTemplates addObject:subTemplate]; + + + @try{ keyValue = [object valueForKeyPath:tag]; } + @catch (id exception) { keyValue = nil; } + count = [matchStrings count]; + subTemplate = nil; + for (i = 0; i < count; i++) { + isMatch = [keyValue isNotEmpty]; + matchString = [matchStrings objectAtIndex:i]; + if (matchEqual) { + isMatch = [matchString isEqualToString:@""] ? NO == isMatch : [[keyValue stringDescription] caseInsensitiveCompare:matchString] == NSOrderedSame; + } else if (matchContain) { + isMatch = [matchString isEqualToString:@""] ? NO == isMatch : [[keyValue stringDescription] rangeOfString:matchString options:NSCaseInsensitiveSearch].location != NSNotFound; + } + if (isMatch) { + subTemplate = [subTemplates objectAtIndex:i]; + break; + } + } + if (subTemplate == nil && [subTemplates count] > count) { + subTemplate = [subTemplates objectAtIndex:count]; + } + if (subTemplate != nil) { + tmpAttrStr = [self attributedStringByParsingTemplate:subTemplate usingObject:object delegate:delegate]; + [result appendAttributedString:tmpAttrStr]; + } + [subTemplates release]; + [matchStrings release]; + // ignore the the rest of an empty line after the tag + [scanner scanEmptyLine]; + + } + + } else { + + // a STARTTAG_OPEN_DELIM without MULTITAG_CLOSE_DELIM, so no template tag. Rewind + [result appendAttributedString:[template attributedSubstringFromRange:NSMakeRange(start - [STARTTAG_OPEN_DELIM length], [STARTTAG_OPEN_DELIM length])]]; + [scanner setScanLocation:start]; + + } + } + } // scan STARTTAG_OPEN_DELIM + } // while + + [result fixAttributesInRange:NSMakeRange(0, [result length])]; + [scanner release]; + + return [result autorelease]; +} + +@end + +#pragma mark - + +@implementation NSObject (SKTemplateParser) + +- (NSString *)stringDescription { + NSString *description = nil; + if ([self respondsToSelector:@selector(stringValue)]) + description = [self performSelector:@selector(stringValue)]; + return description ? description : [self description]; +} + +- (BOOL)isNotEmpty { + return YES; +} + +@end + +#pragma mark - + +@implementation NSScanner (SKTemplateParser) + +- (BOOL)scanEmptyLine { + BOOL foundNewline = NO; + BOOL foundWhitespace = NO; + int startLoc = [self scanLocation]; + + // [self scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:nil] is much more sensible, but NSScanner creates an autoreleased inverted character set every time you use it, so it's pretty inefficient + foundWhitespace = [self scanUpToCharactersFromSet:[NSCharacterSet nonWhitespaceCharacterSet] intoString:nil]; + + if ([self isAtEnd] == NO) { + foundNewline = [self scanString:@"\r\n" intoString:nil]; + if (foundNewline == NO) { + unichar nextChar = [[self string] characterAtIndex:[self scanLocation]]; + if (foundNewline = [[NSCharacterSet newlineCharacterSet] characterIsMember:nextChar]) + [self setScanLocation:[self scanLocation] + 1]; + } + } + if (foundNewline == NO && foundWhitespace == YES) + [self setScanLocation:startLoc]; + return foundNewline; +} + +@end + +#pragma mark - + +@implementation NSAttributedString (SKTemplateParser) + +- (id)initWithAttributedString:(NSAttributedString *)attributedString attributes:(NSDictionary *)attributes { + [[self init] release]; + NSMutableAttributedString *tmpStr = [attributedString mutableCopy]; + unsigned index = 0, length = [attributedString length]; + NSRange range = NSMakeRange(0, length); + NSDictionary *attrs; + [tmpStr addAttributes:attributes range:range]; + while (index < length) { + attrs = [attributedString attributesAtIndex:index effectiveRange:&range]; + if (range.length > 0) { + [tmpStr addAttributes:attrs range:range]; + index = NSMaxRange(range); + } else index++; + } + [tmpStr fixAttributesInRange:NSMakeRange(0, length)]; + self = [tmpStr copy]; + [tmpStr release]; + return self; +} + +- (NSString *)stringDescription { + return [self string]; +} + +- (BOOL)isNotEmpty { + return [self length] > 0; +} + +@end + +#pragma mark - + +@implementation NSString (SKTemplateParser) + +- (NSString *)stringDescription{ + return self; +} + +- (NSString *)stringBySurroundingWithSpacesIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@ ", self]; +} + +- (NSString *)stringByAppendingSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@" "]; +} + +- (NSString *)stringByAppendingDoubleSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@" "]; +} + +- (NSString *)stringByPrependingSpaceIfNotEmpty { + return [self isEqualToString:@""] ? self : [NSString stringWithFormat:@" %@", self]; +} + +- (NSString *)stringByAppendingCommaIfNotEmpty { + return [self isEqualToString:@""] ? self : [self stringByAppendingString:@","]; +} + +- (NSString *)s... [truncated message content] |
From: <ho...@us...> - 2007-05-26 16:35:58
|
Revision: 2160 http://skim-app.svn.sourceforge.net/skim-app/?rev=2160&view=rev Author: hofman Date: 2007-05-26 09:35:52 -0700 (Sat, 26 May 2007) Log Message: ----------- Join markup annotations when shift-clicking. Join new markup from selection with current active markup of the same type. Modified Paths: -------------- trunk/SKPDFAnnotationNote.h trunk/SKPDFAnnotationNote.m trunk/SKPDFView.m Modified: trunk/SKPDFAnnotationNote.h =================================================================== --- trunk/SKPDFAnnotationNote.h 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/SKPDFAnnotationNote.h 2007-05-26 16:35:52 UTC (rev 2160) @@ -59,6 +59,7 @@ - (NSArray *)texts; - (BOOL)isNoteAnnotation; +- (BOOL)isMarkupAnnotation; - (BOOL)isTemporaryAnnotation; - (BOOL)isResizable; - (BOOL)isMovable; @@ -94,6 +95,7 @@ } - (id)initWithBounds:(NSRect)bounds markupType:(int)type quadrilateralPointsAsStrings:(NSArray *)pointStrings; - (id)initWithSelection:(PDFSelection *)selection markupType:(int)type; +- (PDFSelection *)selection; @end @interface SKPDFAnnotationFreeText : PDFAnnotationFreeText Modified: trunk/SKPDFAnnotationNote.m =================================================================== --- trunk/SKPDFAnnotationNote.m 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/SKPDFAnnotationNote.m 2007-05-26 16:35:52 UTC (rev 2160) @@ -208,6 +208,8 @@ - (BOOL)isNoteAnnotation { return NO; } +- (BOOL)isMarkupAnnotation { return NO; } + - (BOOL)isTemporaryAnnotation { return NO; } - (BOOL)isResizable { return NO; } @@ -598,6 +600,25 @@ } } +- (PDFSelection *)selection { + if (0 == numberOfLines) + [self regenerateLineRects]; + + PDFSelection *sel, *selection = nil; + unsigned i; + + for (i = 0; i < numberOfLines; i++) { + if (sel = [[self page] selectionForRect:lineRects[i]]) { + if (selection == nil) + selection = sel; + else + [selection addSelection:sel]; + } + } + + return selection; +} + - (BOOL)hitTest:(NSPoint)point { if ([super hitTest:point] == NO) return NO; @@ -617,6 +638,8 @@ - (BOOL)isNoteAnnotation { return YES; } +- (BOOL)isMarkupAnnotation { return YES; } + - (BOOL)shouldPrint { return YES; } // fix a bug in PDFKit, the color space sometimes is not correct Modified: trunk/SKPDFView.m =================================================================== --- trunk/SKPDFView.m 2007-05-25 20:51:58 UTC (rev 2159) +++ trunk/SKPDFView.m 2007-05-26 16:35:52 UTC (rev 2160) @@ -1246,6 +1246,7 @@ - (void)addAnnotationWithType:(SKNoteType)annotationType contents:(NSString *)text page:(PDFPage *)page bounds:(NSRect)bounds { PDFAnnotation *newAnnotation = nil; + PDFSelection *sel = [self currentSelection]; // Create annotation and add to page. switch (annotationType) { case SKFreeTextNote: @@ -1265,13 +1266,25 @@ newAnnotation = [[SKPDFAnnotationSquare alloc] initWithBounds:bounds]; break; case SKHighlightNote: - newAnnotation = [[SKPDFAnnotationMarkup alloc] initWithSelection:[self currentSelection] markupType:kPDFMarkupTypeHighlight]; + if ([[activeAnnotation type] isEqualToString:@"Highlight"] && [[activeAnnotation page] isEqual:page]) { + [sel addSelection:[(SKPDFAnnotationMarkup *)activeAnnotation selection]]; + [self removeActiveAnnotation:nil]; + } + newAnnotation = [[SKPDFAnnotationMarkup alloc] initWithSelection:sel markupType:kPDFMarkupTypeHighlight]; break; case SKUnderlineNote: - newAnnotation = [[SKPDFAnnotationMarkup alloc] initWithSelection:[self currentSelection] markupType:kPDFMarkupTypeUnderline]; + if ([[activeAnnotation type] isEqualToString:@"Underline"] && [[activeAnnotation page] isEqual:page]) { + [sel addSelection:[(SKPDFAnnotationMarkup *)activeAnnotation selection]]; + [self removeActiveAnnotation:nil]; + } + newAnnotation = [[SKPDFAnnotationMarkup alloc] initWithSelection:sel markupType:kPDFMarkupTypeUnderline]; break; case SKStrikeOutNote: - newAnnotation = [[SKPDFAnnotationMarkup alloc] initWithSelection:[self currentSelection] markupType:kPDFMarkupTypeStrikeOut]; + if ([[activeAnnotation type] isEqualToString:@"StrikeOut"] && [[activeAnnotation page] isEqual:page]) { + [sel addSelection:[(SKPDFAnnotationMarkup *)activeAnnotation selection]]; + [self removeActiveAnnotation:nil]; + } + newAnnotation = [[SKPDFAnnotationMarkup alloc] initWithSelection:sel markupType:kPDFMarkupTypeStrikeOut]; break; case SKArrowNote: newAnnotation = [[SKPDFAnnotationLine alloc] initWithBounds:bounds]; @@ -2263,6 +2276,17 @@ mouseDownInAnnotation = YES; clickDelta.x = pagePoint.x - NSMinX(bounds); clickDelta.y = pagePoint.y - NSMinY(bounds); + } else if (([theEvent modifierFlags] & NSShiftKeyMask) && [activeAnnotation isEqual:newActiveAnnotation] == NO && [[activeAnnotation page] isEqual:[newActiveAnnotation page]] && [[activeAnnotation type] isEqualToString:[newActiveAnnotation type]] && [activeAnnotation isMarkupAnnotation]) { + int markupType = [(SKPDFAnnotationMarkup *)activeAnnotation markupType]; + PDFSelection *sel = [(SKPDFAnnotationMarkup *)activeAnnotation selection]; + [sel addSelection:[(SKPDFAnnotationMarkup *)newActiveAnnotation selection]]; + + [self removeActiveAnnotation:nil]; + [self removeAnnotation:newActiveAnnotation]; + + newActiveAnnotation = [[[SKPDFAnnotationMarkup alloc] initWithSelection:sel markupType:markupType] autorelease]; + [newActiveAnnotation setContents:[[sel string] stringByCollapsingWhitespaceAndNewlinesAndRemovingSurroundingWhitespaceAndNewlines]]; + [self addAnnotation:newActiveAnnotation toPage:page]; } if (activeAnnotation != newActiveAnnotation) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-25 20:52:00
|
Revision: 2159 http://skim-app.svn.sourceforge.net/skim-app/?rev=2159&view=rev Author: hofman Date: 2007-05-25 13:51:58 -0700 (Fri, 25 May 2007) Log Message: ----------- Use undoManager from the document for action name. Modified Paths: -------------- trunk/SKMainWindowController.m Modified: trunk/SKMainWindowController.m =================================================================== --- trunk/SKMainWindowController.m 2007-05-25 20:40:03 UTC (rev 2158) +++ trunk/SKMainWindowController.m 2007-05-25 20:51:58 UTC (rev 2159) @@ -927,7 +927,7 @@ - (void)rotatePageAtIndex:(unsigned int)index by:(int)rotation { NSUndoManager *undoManager = [[self document] undoManager]; [[undoManager prepareWithInvocationTarget:self] rotatePageAtIndex:index by:-rotation]; - [[self undoManager] setActionName:NSLocalizedString(@"Rotate Page", @"Undo action name")]; + [undoManager setActionName:NSLocalizedString(@"Rotate Page", @"Undo action name")]; [[self document] updateChangeCount:[undoManager isUndoing] ? NSChangeDone : NSChangeUndone]; PDFPage *page = [[pdfView document] pageAtIndex:index]; @@ -956,7 +956,7 @@ - (IBAction)rotateAllRight:(id)sender { NSUndoManager *undoManager = [[self document] undoManager]; [[undoManager prepareWithInvocationTarget:self] rotateAllLeft:nil]; - [[self undoManager] setActionName:NSLocalizedString(@"Rotate", @"Undo action name")]; + [undoManager setActionName:NSLocalizedString(@"Rotate", @"Undo action name")]; [[self document] updateChangeCount:[undoManager isUndoing] ? NSChangeDone : NSChangeUndone]; int i, count = [[pdfView document] pageCount]; @@ -974,7 +974,7 @@ - (IBAction)rotateAllLeft:(id)sender { NSUndoManager *undoManager = [[self document] undoManager]; [[undoManager prepareWithInvocationTarget:self] rotateAllRight:nil]; - [[self undoManager] setActionName:NSLocalizedString(@"Rotate", @"Undo action name")]; + [undoManager setActionName:NSLocalizedString(@"Rotate", @"Undo action name")]; [[self document] updateChangeCount:[undoManager isUndoing] ? NSChangeDone : NSChangeUndone]; int i, count = [[pdfView document] pageCount]; @@ -993,7 +993,7 @@ NSRect oldRect = [[[pdfView document] pageAtIndex:index] boundsForBox:kPDFDisplayBoxCropBox]; NSUndoManager *undoManager = [[self document] undoManager]; [[undoManager prepareWithInvocationTarget:self] cropPageAtIndex:index toRect:oldRect]; - [[self undoManager] setActionName:NSLocalizedString(@"Crop Page", @"Undo action name")]; + [undoManager setActionName:NSLocalizedString(@"Crop Page", @"Undo action name")]; [[self document] updateChangeCount:[undoManager isUndoing] ? NSChangeDone : NSChangeUndone]; PDFPage *page = [[pdfView document] pageAtIndex:index]; @@ -1035,7 +1035,7 @@ NSUndoManager *undoManager = [[self document] undoManager]; [[undoManager prepareWithInvocationTarget:self] cropPagesToRects:oldRects]; - [[self undoManager] setActionName:NSLocalizedString(@"Crop", @"Undo action name")]; + [undoManager setActionName:NSLocalizedString(@"Crop", @"Undo action name")]; [[self document] updateChangeCount:[undoManager isUndoing] ? NSChangeDone : NSChangeUndone]; [pdfView layoutDocumentView]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ho...@us...> - 2007-05-25 20:40:05
|
Revision: 2158 http://skim-app.svn.sourceforge.net/skim-app/?rev=2158&view=rev Author: hofman Date: 2007-05-25 13:40:03 -0700 (Fri, 25 May 2007) Log Message: ----------- Support for rtf and text notes in skimnotes tool. Modified Paths: -------------- trunk/skimnotes.m Modified: trunk/skimnotes.m =================================================================== --- trunk/skimnotes.m 2007-05-25 17:07:21 UTC (rev 2157) +++ trunk/skimnotes.m 2007-05-25 20:40:03 UTC (rev 2158) @@ -2,9 +2,11 @@ #import "NSFileManager_ExtendedAttributes.h" #define SKIM_NOTES_KEY @"net_sourceforge_skim-app_notes" +#define SKIM_RTF_NOTES_KEY @"net_sourceforge_skim-app_rtf_notes" +#define SKIM_TEXT_NOTES_KEY @"net_sourceforge_skim-app_text_notes" -static char *usageStr = "Usage:\n skimnotes set PDF_FILE [SKIM_FILE]\n skimnotes get PDF_FILE [SKIM_FILE]\n skimnotes remove PDF_FILE"; -static char *versionStr = "SkimNotes command-line client, version 0.1."; +static char *usageStr = "Usage:\n skimnotes set PDF_FILE [SKIM_FILE]\n skimnotes get PDF_FILE [SKIM_FILE|RTF_FILE|TEXT_FILE]\n skimnotes remove PDF_FILE"; +static char *versionStr = "SkimNotes command-line client, version 0.2."; enum { SKNActionGet, @@ -59,9 +61,22 @@ if ([fm fileExistsAtPath:pdfPath isDirectory:&isDir] == NO || isDir) { } else if (action == SKNActionGet) { NSError *error = nil; - NSData *data = [fm extendedAttributeNamed:SKIM_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; - if (data == nil && [error code] == ENOATTR) - data = [NSKeyedArchiver archivedDataWithRootObject:[NSArray array]]; + NSData *data = nil; + if ([[notesPath pathExtension] caseInsensitiveCompare:@"rtf"] == NSOrderedSame) { + data = [fm extendedAttributeNamed:SKIM_RTF_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; + if (data == nil && [error code] == ENOATTR) + data = [NSData data]; + } else if ([[notesPath pathExtension] caseInsensitiveCompare:@"txt"] == NSOrderedSame || [[notesPath pathExtension] caseInsensitiveCompare:@"text"] == NSOrderedSame) { + NSError *error = nil; + data = [fm extendedAttributeNamed:SKIM_TEXT_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; + if (data == nil && [error code] == ENOATTR) + data = [NSData data]; + } else { + NSError *error = nil; + data = [fm extendedAttributeNamed:SKIM_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; + if (data == nil && [error code] == ENOATTR) + data = [NSKeyedArchiver archivedDataWithRootObject:[NSArray array]]; + } if (data) success = [data writeToFile:notesPath atomically:YES]; } else if (action == SKNActionSet && notesPath && [fm fileExistsAtPath:notesPath isDirectory:&isDir] && isDir == NO) { @@ -74,9 +89,16 @@ } } else if (action == SKNActionRemove) { NSError *error = nil; - success = [fm removeExtendedAttribute:SKIM_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; - if (success == NO && [error code] == ENOATTR) - success = YES; + BOOL success1 = [fm removeExtendedAttribute:SKIM_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; + if (success1 == NO && [error code] == ENOATTR) + success1 = YES; + BOOL success2 = [fm removeExtendedAttribute:SKIM_RTF_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; + if (success2 == NO && [error code] == ENOATTR) + success2 = YES; + BOOL success3 = [fm removeExtendedAttribute:SKIM_TEXT_NOTES_KEY atPath:pdfPath traverseLink:YES error:&error]; + if (success3 == NO && [error code] == ENOATTR) + success3 = YES; + success = success1 && success2 && success3; } [pool release]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |