<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
	
	<channel>
		<title>Matt McCray</title>
		<link>http://mattmccray.com/index.php</link>
		<description />
		<language>en</language>
		<managingEditor>darthapo@gmail.com</managingEditor>
                <copyright>Copyright 2008</copyright>
		<generator>Pivot Pivot - 1.40.0: 'Dreadwind'</generator>
		<pubDate>Wed, 19 Mar 2008 15:37:43 +0000</pubDate>
		<ttl>60</ttl>
		<image>
			<link>http://mattmccray.com/index.php</link>
			<title>Matt McCray</title>
			<url>http://www.mattmccray.com/images/matt-icon.jpg</url>
		</image>
		
		
		
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/mattmccray" type="application/rss+xml" /><item>
			<title>Sterling-code.com For Your HTML Slicing Needs!</title>
			<link>http://feeds.feedburner.com/~r/mattmccray/~3/254345151/Sterling-codecom_For_Your_HTML</link>
			<comments>http://mattmccray.com/archive/2008/01/23/Sterling-codecom_For_Your_HTML#comm</comments>
                        <description>&lt;p&gt;&lt;a href="http://www.sterling-code.com"&gt;Sterling Code&lt;/a&gt; can help you get from design to finished HTML quickly.&lt;/p&gt;

&lt;p&gt;We specialize in creating semantic, SEO optimized XHTML and HTML for rich emails. Offering competitive rates and quick turn-around, &lt;a href="http://www.sterling-code.com"&gt;check us out&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/mattmccray?a=I3EL6d"&gt;&lt;img src="http://feeds.feedburner.com/~a/mattmccray?i=I3EL6d" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<guid isPermaLink="false">190@http://mattmccray.com/pivot/</guid>
			<category>Software</category>
			<pubDate>Wed, 23 Jan 2008 17:17:00 -0000</pubDate>
		<feedburner:origLink>http://mattmccray.com/archive/2008/01/23/Sterling-codecom_For_Your_HTML</feedburner:origLink></item>
		
		
		
		<item>
			<title>Animating NSViews In RubyCocoa</title>
			<link>http://feeds.feedburner.com/~r/mattmccray/~3/221248129/Animating_NSViews_In_RubyCocoa</link>
			<comments>http://mattmccray.com/archive/2008/01/18/Animating_NSViews_In_RubyCocoa#comm</comments>
                        <description>&lt;p&gt;Yesterday we talked about how to make nifty &lt;a href="http://mattmccray.com/archive/2008/01/16/Selectable_Toolbar_Icons_in_Ru"&gt;selectable toolbars&lt;/a&gt; like this:&lt;/p&gt;

&lt;p style="text-align:center;"&gt;&lt;img src="http://www.mattmccray.com/images/selectable-toolbar.png" alt="selectable-toolbar.png" border="0" width="366" height="80" /&gt;&lt;/p&gt;

&lt;p&gt;Now let's look at the finishing touch for our Preferences window; Animating the panel changes. We'll be flying through this at a pretty good clip, but don't worry. I'll provide the full source for your inspection.&lt;/p&gt;

&lt;p&gt;First off, let's add some new outlets to our window controller:&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;  ib_outlets &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;generalPrefsView&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt;
             &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;advancedPrefsView&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;


&lt;img src="http://www.mattmccray.com/images/CustomView.png" alt="CustomView.png" border="0" width="135" height="54" align="right" /&gt;

&lt;p&gt;Now in Interface Builder, we'll create the views for each preference pane by dragging Custom Views from the Library onto our Preferences.nib.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Be sure to drop the Custom Views on the main nib window in IB, not on the Preferences &lt;code&gt;NSWindow&lt;/code&gt;. Your project (in IB) should look something like this:&lt;/p&gt;

&lt;div style="text-align:center;"&gt;&lt;img src="http://www.mattmccray.com/images/Prefs-IB.png" alt="Prefs-IB.png" border="0" width="385" height="337" /&gt;&lt;/div&gt;

&lt;p&gt;Hook up the outlets to the new views, and edit your preference panels to your heart's desire. From here, we go back to the code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tip&lt;/em&gt;: Be sure to set the auto-sizing on your preference panels (the &lt;code&gt;NSView&lt;/code&gt;s) so that it matches the &lt;code&gt;NSWindow&lt;/code&gt;'s &lt;code&gt;contentView&lt;/code&gt;.&lt;/p&gt;

&lt;p style="text-align:center;"&gt;&lt;img src="http://www.mattmccray.com/images/Picture 5.png" alt="Picture 5.png" border="0" width="232" height="120"/&gt;&lt;/p&gt;

&lt;p&gt;Next up are some helper methods for our window controller. I won't spend too much time explaining these, but they're pretty straight forward.&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;  &lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;viewForTag&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;tag&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;case&lt;/span&gt; tag
      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;when&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;0&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;:&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;generalPrefsView&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt;  &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;General&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;when&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;1&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;:&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;advancedPrefsView&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;Advanced&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;


&lt;p&gt;&lt;code&gt;#viewForTag&lt;/code&gt; actually returns our &lt;code&gt;NSView&lt;/code&gt; and a title string.&lt;/p&gt;


&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;  &lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;newFrameForNewContentView&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;view&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    newFrameRect &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;frameRectForContentRect&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;view&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;frame&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    oldFrameRect &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;frame
    newSize &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; newFrameRect&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;size
    oldSize &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; oldFrameRect&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;size
    frame &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;frame
    frame&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;size &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; newSize
    frame&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;origin&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;y &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; frame&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;origin&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;y &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;-&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;newSize&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;height &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;-&lt;/span&gt; oldSize&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;height&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    frame
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#newFrameForNewContentView&lt;/code&gt; calculates the new frame rectangle for the window based on the new view (preference pane).&lt;/p&gt;

&lt;p&gt;Now we're ready to fill out our &lt;code&gt;selectPrefPanel&lt;/code&gt; action:&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;  ib_action &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby entity_name_function"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;selectPrefPanel&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;sender&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
    tag &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt;  sender&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;tag
    view&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; title &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;viewForTag&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;tag&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    previousView&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; prevTitle &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;viewForTag&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;currentViewTag&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;currentViewTag&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; tag
    newFrame &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;newFrameForNewContentView&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;view&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;title &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&lt;span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"&gt;&lt;span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby"&gt;#{&lt;/span&gt;title&lt;span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby"&gt;}&lt;/span&gt;&lt;/span&gt; Preferences&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;    &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; Using an animation grouping because we may be changing the duration
&lt;/span&gt;    &lt;span class="support support_class support_class_ruby"&gt;NSAnimationContext&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;beginGrouping
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;      &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; Call the animator instead of the view / window directly
&lt;/span&gt;      window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;contentView&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;animator&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;replaceSubview_with&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;previousView&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; view&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
      window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;animator&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;setFrame_display newFrame&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;NSAnimationContext&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;endGrouping
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Right on! Now we setup the initial pane when the window loads:&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;  &lt;span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;awakeFromNib&lt;/span&gt;&lt;/span&gt;
    window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;setContentSize &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;generalPrefsView&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;frame&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;size 
    window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;contentView&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;addSubview &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;generalPrefsView&lt;/span&gt;
    window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;title &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;General Preferences&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
    &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;currentViewTag&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;0&lt;/span&gt;
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;    &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; Will use CoreAnimation for the panel changes:
&lt;/span&gt;    window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;contentView&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;wantsLayer &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;That pretty much does it. Now you have a professional looking preferences window. So enough of those dang blasted &lt;code&gt;NSTabView&lt;/code&gt;s!&lt;/p&gt;

&lt;p&gt;Here's the completed &lt;a href="http://pastie.textmate.org/140681"&gt;PreferencesController.rb&lt;/a&gt;. Or, you can download the &lt;a href="http://www.mattmccray.com/downloads/PreferencesExample.zip"&gt;full Xcode project&lt;/a&gt;. (Requires Leopard, Xcode 3, and Interface Builder 3)&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/mattmccray?a=dbSCdz"&gt;&lt;img src="http://feeds.feedburner.com/~a/mattmccray?i=dbSCdz" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<guid isPermaLink="false">189@http://mattmccray.com/pivot/</guid>
			<category>Cocoa, Software</category>
			<pubDate>Fri, 18 Jan 2008 13:52:00 -0000</pubDate>
		<feedburner:origLink>http://mattmccray.com/archive/2008/01/18/Animating_NSViews_In_RubyCocoa</feedburner:origLink></item>
		
		
		
		<item>
			<title>Selectable Toolbar Icons in RubyCocoa</title>
			<link>http://feeds.feedburner.com/~r/mattmccray/~3/221248131/Selectable_Toolbar_Icons_in_Ru</link>
			<comments>http://mattmccray.com/archive/2008/01/16/Selectable_Toolbar_Icons_in_Ru#comm</comments>
                        <description>&lt;p&gt;So you'd like to have some nifty selectable toolbar items to make your preferences window really polished? Or maybe you'd like to use the toolbar as a tab-set like &lt;a href="http://www.panic.com/coda/"&gt;Coda&lt;/a&gt; does. No problem, here's how to do it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: I'm using Leopard &amp; Interface Builder 3. You can create selectable toolbars in Tiger, but the process is different and not within the scope of this article.&lt;/p&gt;

&lt;p&gt;To start, in the window controller, add an &lt;code&gt;ib_action:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;ib_action &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;selectPrefPanel&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;sender&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;  &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt; We'll do stuff here later...
&lt;/span&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Then in Interface Builder, create the toolbar and the toolbar items. For each toolbar item:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turn off the 'autovalidates' option&lt;/li&gt;
&lt;li&gt;Set the action to target the &lt;code&gt;selectPrefPanel:&lt;/code&gt; action on your window controller (probably the File's Owner)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you save the Nib, be sure and set the toolbar's &lt;code&gt;delegate&lt;/code&gt; to the window controller.&lt;/p&gt;

&lt;p&gt;Now back in the window controller code, implement a &lt;code&gt;toolbarSelectableItemIdentifiers&lt;/code&gt; method in your controller:&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;&lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;toolbarSelectableItemIdentifiers&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;toolbar&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
  &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;toolbaridents&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby"&gt;||=&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;begin&lt;/span&gt;
    window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;toolbar&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;toolbaritems&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;collect &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;i&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt; i&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;itemIdentifier &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;}&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Lastly, when the window loads, select the first toolbar item:&lt;/p&gt;

&lt;p&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby"&gt;&lt;span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;awakeFromNib&lt;/span&gt;&lt;/span&gt;
  window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;toolbar&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;selectedItemIdentifier &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; window&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;toolbar&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;toolbarItems&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;0&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;itemIdentifier
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Viola! Now you have selectable toolbar items.&lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="http://pastie.textmate.org/140682"&gt;&lt;strong&gt;full source&lt;/strong&gt; for the window controller&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's worth mentioning that this isn't specific to RubyCocoa. You can do the same thing in Objective-C, Python, or Nu (&lt;a href="http://pastie.textmate.org/139630"&gt;example&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Next, I'll show you how to create the views that will go within your preferences window, and how to animate them to really finish it off.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Find the next article &lt;a href="http://mattmccray.com/archive/2008/01/18/Animating_NSViews_In_RubyCocoa"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/mattmccray?a=X025Vv"&gt;&lt;img src="http://feeds.feedburner.com/~a/mattmccray?i=X025Vv" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<guid isPermaLink="false">188@http://mattmccray.com/pivot/</guid>
			<category>Cocoa, Software</category>
			<pubDate>Wed, 16 Jan 2008 12:10:00 -0000</pubDate>
		<feedburner:origLink>http://mattmccray.com/archive/2008/01/16/Selectable_Toolbar_Icons_in_Ru</feedburner:origLink></item>
		
		
		
		<item>
			<title>Nuapp</title>
			<link>http://feeds.feedburner.com/~r/mattmccray/~3/217419070/Nuapp</link>
			<comments>http://mattmccray.com/archive/2008/01/15/Nuapp#comm</comments>
                        <description>&lt;p&gt;Nuapp is a simple script (written in &lt;a href="http://programming.nu"&gt;Nu&lt;/a&gt;, of course) that generates a skeleton Nu application. Check it out here: &lt;a href="http://pastie.textmate.org/138976"&gt;http://pastie.textmate.org/138976&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll probably want to customize it. For instance, I doubt you'll want to use my "Requisite Beta Disclaimer". &lt;img src='http://mattmccray.com/extensions/emoticons/trillian/e_01.gif' alt=':-)' align='middle'/&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/mattmccray?a=X84iEU"&gt;&lt;img src="http://feeds.feedburner.com/~a/mattmccray?i=X84iEU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<guid isPermaLink="false">187@http://mattmccray.com/pivot/</guid>
			<category>Nu, Software</category>
			<pubDate>Tue, 15 Jan 2008 21:49:00 -0000</pubDate>
		<feedburner:origLink>http://mattmccray.com/archive/2008/01/15/Nuapp</feedburner:origLink></item>
		
		
		
		<item>
			<title>Snippet: Compiling XIBs into NIBs in your Nukefile</title>
			<link>http://feeds.feedburner.com/~r/mattmccray/~3/216775979/Snippet_Compiling_XIBs_into_NI</link>
			<comments>http://mattmccray.com/archive/2008/01/14/Snippet_Compiling_XIBs_into_NI#comm</comments>
                        <description>&lt;p&gt;Here's a function I use in my Nukefile to compile XIBs into NIBs:&lt;/p&gt;

&lt;p&gt;
&lt;pre class="textmate-source"&gt;&lt;span class="source source_nu"&gt;(&lt;span class="meta meta_function meta_function_nu"&gt;&lt;span class="storage storage_type storage_type_function-type storage_type_function-type_nu"&gt;function&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_nu"&gt;compile-xibs-from-to&lt;/span&gt;&lt;/span&gt; (xibs to_path)
     (&lt;span class="keyword keyword_control keyword_control_nu"&gt;if&lt;/span&gt; (&lt;span class="keyword keyword_operator keyword_operator_nu"&gt;and&lt;/span&gt; (!= target &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;clobber&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;) (!= target &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;clean&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;))
         (&lt;span class="keyword keyword_control keyword_control_nu"&gt;then&lt;/span&gt;
              (SH &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;mkdir -p #{to_path}&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;)
              ((filelist xibs) each:(&lt;span class="keyword keyword_control keyword_control_nu"&gt;do&lt;/span&gt; (xib)
                                        (&lt;span class="keyword keyword_control keyword_control_nu"&gt;set&lt;/span&gt; nib (xib stringByReplacingPathExtensionWith:&lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;nib&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;))
                                        (SH &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;ibtool #{xib} --compile #{to_path}/#{( nib fileName )}&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;)))
              (filelist &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;^#{to_path}/[^/]*&lt;span class="constant constant_character constant_character_escape constant_character_escape_nu"&gt;.&lt;/span&gt;nib$&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;))
         (&lt;span class="keyword keyword_control keyword_control_nu"&gt;else&lt;/span&gt; &lt;span class="constant constant_language constant_language_nu"&gt;nil&lt;/span&gt;)))

(&lt;span class="keyword keyword_control keyword_control_nu"&gt;set&lt;/span&gt; @nib_files (compile-xibs-from-to &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;^resources/views/[^/]*&lt;span class="constant constant_character constant_character_escape constant_character_escape_nu"&gt;.&lt;/span&gt;xib$&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_nu"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_nu"&gt;"&lt;/span&gt;build/nibs&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_nu"&gt;"&lt;/span&gt;&lt;/span&gt;))
&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;It uses &lt;code&gt;ibtool&lt;/code&gt; to compile the .xib into a .nib:&lt;/p&gt;
&lt;pre class="console"&gt;ibtool source.xib --compile target.nib&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/mattmccray?a=0IwhLT"&gt;&lt;img src="http://feeds.feedburner.com/~a/mattmccray?i=0IwhLT" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<guid isPermaLink="false">186@http://mattmccray.com/pivot/</guid>
			<category>Cocoa, Nu, Software</category>
			<pubDate>Mon, 14 Jan 2008 20:06:00 -0000</pubDate>
		<feedburner:origLink>http://mattmccray.com/archive/2008/01/14/Snippet_Compiling_XIBs_into_NI</feedburner:origLink></item>
		
		
		
	</channel>
</rss>
