stlab.adobe.com Adobe Systems Incorporated

platform_widget_utils.hpp

Go to the documentation of this file.
00001 /*
00002     Copyright 2005-2007 Adobe Systems Incorporated
00003     Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
00004     or a copy at http://stlab.adobe.com/licenses.html)
00005 */
00006 
00007 /****************************************************************************************************/
00008 
00009 #ifndef ADOBE_UI_CORE_OS_UTILITIES_HPP
00010 #define ADOBE_UI_CORE_OS_UTILITIES_HPP
00011 
00012 /**************************************************************************************************/
00013 
00014 #if !defined(__LP64__)
00015 
00016 /****************************************************************************************************/
00017 
00018 #include <adobe/config.hpp>
00019 
00020 #include <iterator>
00021 
00022 #include <adobe/algorithm/set.hpp>
00023 #include <adobe/dictionary_set.hpp>
00024 #include <adobe/extents.hpp>
00025 #include <adobe/future/macintosh_error.hpp>
00026 #include <adobe/future/macintosh_events.hpp>
00027 #include <adobe/istream.hpp>
00028 #include <adobe/macintosh_memory.hpp>
00029 #include <adobe/macintosh_string.hpp>
00030 #include <adobe/name.hpp>
00031 #include <adobe/unicode.hpp>
00032 #include <adobe/widget_attributes.hpp>
00033 #include <adobe/layout_attributes.hpp>
00034 #include <adobe/table_index.hpp>
00035 
00036 #include <adobe/future/widgets/headers/platform_metrics.hpp>
00037 #include <adobe/future/widgets/headers/macintosh_metric_extractor.hpp>
00038 
00039 #include <boost/noncopyable.hpp>
00040 #include <boost/filesystem/path.hpp>
00041 
00042 #include <stdexcept>
00043 
00044 /****************************************************************************************************/
00045 
00046 namespace adobe {
00047 
00048 /****************************************************************************************************/
00049 
00050 typedef ::WindowRef keyboard_handler_type;
00051 
00052 /****************************************************************************************************/
00053 
00054 namespace implementation {
00055 
00056 /****************************************************************************************************/
00057 
00058 typedef ::ControlRef platform_control_type;
00059 
00060 /****************************************************************************************************/
00061 
00062 extern aggregate_name_t     k_attribute_theme;
00063 extern aggregate_name_t     k_attribute_theme_large;
00064 extern aggregate_name_t     k_attribute_theme_normal;
00065 extern aggregate_name_t     k_attribute_theme_small;
00066 extern aggregate_name_t     k_attribute_theme_mini;
00067 
00068 extern aggregate_name_t k_metric_gap;
00069 
00070 extern aggregate_name_t k_metric_size;
00071 extern aggregate_name_t k_metric_adjust_position;
00072 extern aggregate_name_t k_metric_adjust_size;
00073 extern aggregate_name_t k_metric_adjust_baseline;
00074 extern aggregate_name_t k_metric_outset;
00075 extern aggregate_name_t k_metric_frame;
00076 extern aggregate_name_t k_metric_inset;
00077 extern aggregate_name_t k_metric_spacing;
00078 
00079 /****************************************************************************************************/
00080 /****************************************************************************************************/
00081 /****************************************************************************************************/
00082 /****************************************************************************************************/
00083 /****************************************************************************************************/
00084 /****************************************************************************************************/
00085 /****************************************************************************************************/
00086 
00087 template <typename T>
00088 bool get_widget_data(::ControlRef widget, ::ControlPartCode part, ::ResType tag, T& data, bool throwing = true)
00089 {
00090     ::Size      t_size(sizeof(T));
00091     ::Size      actual_size(0);
00092     ::OSStatus  result(::GetControlData(widget, part, tag, t_size, &data, &actual_size));
00093 
00094     if (!throwing)
00095         return result == noErr;
00096 
00097     ::ADOBE_REQUIRE_STATUS(result);
00098 
00099     return t_size == actual_size;
00100 }
00101 
00102 /****************************************************************************************************/
00103 
00104 inline unsigned long get_current_tick_time()
00105 {
00106     return ::EventTimeToTicks(::GetLastUserEventTime());
00107 }
00108 
00109 /****************************************************************************************************/
00110 
00111 template <typename Widget>
00112 inline boost::uint32_t get_value(const Widget& widget)
00113 {
00114     return get_value< ::ControlRef >(widget.control_m);
00115 }
00116 
00117 /****************************************************************************************************/
00118 
00119 template <>
00120 inline boost::uint32_t get_value< ::ControlRef >(const ::ControlRef& control)
00121 {
00122     if (!control) return 0;
00123 
00124     return ::GetControl32BitValue(control);
00125 }
00126 
00127 /****************************************************************************************************/
00128 
00129 template <typename T>
00130 void get_bounds(const T& widget, ::Rect& bounds, bool absolute = false);
00131 
00132 /****************************************************************************************************/
00133 
00134 template <>
00135 void get_bounds< ::ControlRef >(const ::ControlRef& control, ::Rect& bounds, bool absolute);
00136 
00137 /****************************************************************************************************/
00138 
00139 template <>
00140 inline void get_bounds<auto_control_t>(const auto_control_t& control, ::Rect& bounds, bool absolute)
00141     { return get_bounds(control.get(), bounds, absolute); }
00142 
00143 /****************************************************************************************************/
00144 /****************************************************************************************************/
00145 /****************************************************************************************************/
00146 /****************************************************************************************************/
00147 /****************************************************************************************************/
00148 /****************************************************************************************************/
00149 /****************************************************************************************************/
00150 
00154 
00155 template <typename T>
00156 std::string get_field_text(const T&);
00157 
00158 /****************************************************************************************************/
00159 
00160 template <>
00161 std::string get_field_text< ::ControlRef >(const ::ControlRef& control);
00162 
00163 /****************************************************************************************************/
00164 
00165 template <>
00166 inline std::string get_field_text<auto_control_t>(const auto_control_t& control)
00167     { return get_field_text(control.get()); }
00168 
00169 /****************************************************************************************************/
00170 /****************************************************************************************************/
00171 /****************************************************************************************************/
00172 /****************************************************************************************************/
00173 /****************************************************************************************************/
00174 /****************************************************************************************************/
00175 /****************************************************************************************************/
00176 
00180 
00181 template <typename Widget>
00182 std::string get_name(const Widget& widget)
00183 {
00184     return get_name(widget.control_m);
00185 }
00186 
00187 /****************************************************************************************************/
00188 
00189 template <>
00190 std::string get_name< ::ControlRef >(const ::ControlRef& control);
00191 
00192 /****************************************************************************************************/
00193 
00194 template <>
00195 std::string get_name< ::WindowRef >(const ::WindowRef& window);
00196 
00197 /****************************************************************************************************/
00198 
00199 template <>
00200 inline std::string get_name<auto_control_t>(const auto_control_t& control)
00201     { return get_name(control.get()); }
00202 
00203 /****************************************************************************************************/
00204 /****************************************************************************************************/
00205 /****************************************************************************************************/
00206 /****************************************************************************************************/
00207 /****************************************************************************************************/
00208 /****************************************************************************************************/
00209 /****************************************************************************************************/
00210 
00211 inline ::ATSUFontID get_atsui_font_id(const char* font_name, std::size_t name_length)
00212 {
00213     ::ATSUFontID    atsui_font_id;
00214 
00215     ::ADOBE_REQUIRE_STATUS(::ATSUFindFontFromName(  font_name,
00216                                                     name_length,
00217                                                     static_cast<unsigned long>(kFontNoName),
00218                                                     kFontNoPlatformCode,
00219                                                     kFontNoScriptCode,
00220                                                     kFontNoLanguageCode,
00221                                                     &atsui_font_id));
00222 
00223     return atsui_font_id;
00224 }
00225 
00226 /****************************************************************************************************/
00227 
00228 inline ::ATSUFontID get_atsui_font_id(const char* font_name)
00229 {
00230     return get_atsui_font_id(font_name, std::strlen(font_name));
00231 }
00232 
00233 /****************************************************************************************************/
00234 
00235 ::FMFontFamily get_classic_font_id(const char* font_name, std::size_t name_length);
00236 
00237 /****************************************************************************************************/
00238 
00239 inline ::FMFontFamily get_classic_font_id(const char* font_name)
00240 {
00241     return get_classic_font_id(font_name, std::strlen(font_name));
00242 }
00243 
00244 /****************************************************************************************************/
00245 
00246 inline ::FMFontFamily get_classic_font_id(Str255 font_name)
00247 {
00248     const char* first(reinterpret_cast<char*>(&font_name[1]));
00249     const char* last(first + font_name[0]);
00250     std::string font_name_c(first, last);
00251 
00252     return get_classic_font_id(font_name_c.c_str(), font_name_c.size());
00253 }
00254 
00255 /****************************************************************************************************/
00256 
00257 inline ::ThemeFontID theme_to_ThemeFontID(const theme_t& style)
00258 {
00259     theme_t  masked = static_cast<theme_t>(style & theme_mask_s);
00260     ::ThemeFontID   font_id(kThemeSystemFont);
00261 
00262     switch (masked)
00263     {
00264         case theme_mini_s:   font_id = kThemeMiniSystemFont;     break;
00265         case theme_small_s:  font_id = kThemeSmallSystemFont;    break;
00266         case theme_large_s:
00267         case theme_normal_s:
00268         default:                    font_id = kThemeSystemFont;         break;
00269     }
00270 
00271     return font_id;
00272 }
00273 
00274 /****************************************************************************************************/
00275 
00276 template <typename T>
00277 void atsu_set_attribute(::ATSUStyle style, ::ATSUAttributeTag tag, T value)
00278 {
00279     ::ByteCount             size = sizeof(value);
00280     ::ATSUAttributeValuePtr ptr = &value;
00281 
00282     ADOBE_REQUIRE_STATUS(::ATSUSetAttributes(style, 1, &tag, &size, &ptr));
00283 }
00284 
00285 /****************************************************************************************************/
00286 
00287 // this is using ATSUI on the backend, and should be replaced by measure_theme_text
00288 // once we remove all the specializations for theme_t
00289 
00290 extents_t get_text_dimensions(const std::string& text, theme_t theme);
00291 
00292 /****************************************************************************************************/
00293 /****************************************************************************************************/
00294 /****************************************************************************************************/
00295 /****************************************************************************************************/
00296 /****************************************************************************************************/
00297 /****************************************************************************************************/
00298 /****************************************************************************************************/
00299 
00300 void theme_to_rec(const theme_t& style, ControlFontStyleRec& style_rec);
00301 
00302 /****************************************************************************************************/
00303 /****************************************************************************************************/
00304 /****************************************************************************************************/
00305 /****************************************************************************************************/
00306 /****************************************************************************************************/
00307 /****************************************************************************************************/
00308 /****************************************************************************************************/
00309 
00310 template <typename T>
00311 bool set_widget_data(::ControlRef widget, ::ControlPartCode part, ::ResType tag, const T& data, bool throwing = true)
00312 {
00313     ::OSStatus  result(::SetControlData(widget, part, tag, sizeof(T), &data));
00314 
00315     if (!throwing)
00316         return result == noErr;
00317 
00318     ::ADOBE_REQUIRE_STATUS(result);
00319 
00320     return true;
00321 }
00322 
00323 /****************************************************************************************************/
00324 
00325 void set_popup_with_text(ControlRef control, const std::string& text, unsigned long cur_time);
00326 
00327 /****************************************************************************************************/
00328 
00330 
00331 template <typename T>
00332 void set_selection(T& control, std::size_t start_pos, std::size_t end_pos);
00333 
00334 /****************************************************************************************************/
00335 
00336 template <>
00337 inline void set_selection< ::TXNObject >(   ::TXNObject&    control,
00338                                             std::size_t     start_pos,
00339                                             std::size_t     end_pos)
00340 {
00341     ::ADOBE_REQUIRE_STATUS(::TXNSetSelection(control, start_pos, end_pos));
00342 }
00343 
00344 /****************************************************************************************************/
00345 
00346 template <typename Widget>
00347 void set_focus(Widget& widget, bool make_focused)
00348 {
00349     set_focus< ::ControlRef >(widget.control_m, make_focused);
00350 }
00351 
00352 /****************************************************************************************************/
00353 
00354 template <>
00355 void set_focus< ::ControlRef >(::ControlRef& control, bool make_focused);
00356 
00357 /****************************************************************************************************/
00358 
00359 template <typename T>
00360 void set_refresh(const T& widget);
00361 
00362 /****************************************************************************************************/
00363 
00364 template <>
00365 inline void set_refresh< ::ControlRef >(const ::ControlRef& control)
00366 {
00367     assert(control);
00368 
00369     ADOBE_REQUIRE_STATUS(::HIViewSetNeedsDisplay(control, true));
00370 }
00371 
00372 /****************************************************************************************************/
00373 
00374 template <>
00375 inline void set_refresh<auto_control_t>(const auto_control_t& control)
00376     { set_refresh(control.get()); }
00377 
00378 /****************************************************************************************************/
00379 
00380 template <typename T>
00381 void set_bounds(T& x, const ::Rect& new_bounds);
00382 
00383 /****************************************************************************************************/
00384 
00385 template <>
00386 void set_bounds< ::ControlRef >(::ControlRef& control, const ::Rect& new_bounds);
00387 
00388 /****************************************************************************************************/
00389 
00390 template <>
00391 inline void set_bounds<auto_control_t>(auto_control_t& control, const ::Rect& new_bounds)
00392     { ::ControlRef temp(control.get()); set_bounds(temp, new_bounds); }
00393 
00394 /****************************************************************************************************/
00395 #if 0
00396 template <>
00397 inline void set_bounds<const auto_control_t>(const auto_control_t& control, const ::Rect& new_bounds)
00398     { ::ControlRef temp(control.get()); set_bounds(temp, new_bounds); }
00399 #endif
00400 /****************************************************************************************************/
00401 /****************************************************************************************************/
00402 /****************************************************************************************************/
00403 /****************************************************************************************************/
00404 /****************************************************************************************************/
00405 /****************************************************************************************************/
00406 /****************************************************************************************************/
00407 
00408 template <typename Widget>
00409 inline const std::string& widget_tag(const Widget&)
00410 { static const std::string value_s("<xstr id='metric_unknown'/>{ }</xstr>"); return value_s; }
00411 
00412 template <typename Widget>
00413 inline dictionary_t extra_widget_context(const Widget&)
00414 { return dictionary_t(); }
00415 
00416 #define ADOBE_WIDGET_TAG_BOILERPLATE(widgettype, static_tag)                        \
00417 namespace implementation {                                                          \
00418 template <> inline const std::string& widget_tag< widgettype >(const widgettype&)   \
00419 { static const std::string value_s(static_tag); return value_s; }                               \
00420 } // namespace implementation
00421 
00422 /****************************************************************************************************/
00423 
00424 template <typename Widget>
00425 void set_metric_extractor(Widget& w)
00426 {
00427     // REVISIT (fbrereto) : If metrics can be changed at runtime for this
00428     // widget specifically this shortcut will have to go.
00429     if (!w.metrics_m.empty())
00430         return;
00431 
00432     name_t    attribute_theme_value(static_name_t("unknown"));
00433     dictionary_t     context;
00434 
00435     switch (w.theme_m & theme_mask_s)
00436     {
00437         case theme_large_s:  attribute_theme_value = k_attribute_theme_large;    break;
00438         case theme_normal_s: attribute_theme_value = k_attribute_theme_normal;   break;
00439         case theme_small_s:  attribute_theme_value = k_attribute_theme_small;    break;
00440         case theme_mini_s:   attribute_theme_value = k_attribute_theme_mini;     break;
00441         default:                    break;
00442     }
00443     
00444     context.insert(std::make_pair(k_attribute_theme, any_regular_t(attribute_theme_value)));
00445 
00446     w.metrics_m = metric_extractor_t(widget_metrics(widget_tag(w),
00447         dictionary_union(extra_widget_context(w), context)));
00448 }
00449 
00450 /****************************************************************************************************/
00451 
00452 template <typename T>
00453 inline void set_origin(T& x, float left, float top);
00454 
00455 /****************************************************************************************************/
00456 #if 0
00457 template <>
00458 inline void set_origin<const auto_control_t>(const auto_control_t& x, float left, float top)
00459 {
00460     assert(false);
00461 }
00462 #endif
00463 /****************************************************************************************************/
00464 
00465 template <>
00466 inline void set_origin< ::ControlRef >(::ControlRef& control, float left, float top)
00467     { ADOBE_REQUIRE_STATUS(::HIViewSetBoundsOrigin(control, left, top)); }
00468 
00469 /****************************************************************************************************/
00470 
00471 template <>
00472 inline void set_origin<auto_control_t>(auto_control_t& control, float left, float top)
00473     { ::ControlRef temp(control.get()); set_origin(temp, left, top); }
00474 
00475 /****************************************************************************************************/
00476 
00477 template <typename Widget>
00478 void shed_fudges(Widget& control, place_data_t& place_data)
00479 {
00480     height(place_data) += control.metrics_m(k_metric_adjust_size, metric_extractor_t::index_height);
00481     width(place_data) += control.metrics_m(k_metric_adjust_size, metric_extractor_t::index_width);
00482 
00483     long fudge_left(control.metrics_m(k_metric_adjust_position, metric_extractor_t::index_left));
00484     long fudge_top(control.metrics_m(k_metric_adjust_position, metric_extractor_t::index_top));
00485 
00486     left(place_data) += fudge_left;
00487     top(place_data)  += fudge_top;
00488 
00489     /*
00490         NOTE (fbrereto) :   All Eve containers need to expand themselves to
00491         compensate for the case when their children have outsets. If
00492         this does not happen, you will see visual clipping of the
00493         children's visual outset artifacts.
00494     */
00495 
00496     float left_shift(fudge_left - place_data.horizontal().outset_m.first);
00497     float top_shift(fudge_top - place_data.vertical().outset_m.first);
00498 
00499     if (left_shift != 0 || top_shift != 0)
00500         set_origin(control.control_m, left_shift, top_shift);
00501 }
00502 
00503 /****************************************************************************************************/
00504 
00505 template <typename Widget>
00506 extents_t apply_fudges(const Widget& w, const extents_t& dimensions)
00507 {
00508     extents_t result(dimensions);
00509 
00510     set_metric_extractor(w);
00511 
00512     result.height() -= w.metrics_m(k_metric_adjust_size, metric_extractor_t::index_height);
00513     result.width()  -= w.metrics_m(k_metric_adjust_size, metric_extractor_t::index_width);
00514 
00515     // frame inset and outsets are directly transcribed
00516 
00517     result.horizontal().outset_m.first += w.metrics_m(k_metric_outset, metric_extractor_t::index_left);
00518     result.horizontal().outset_m.second += w.metrics_m(k_metric_outset, metric_extractor_t::index_right);
00519     result.vertical().outset_m.first += w.metrics_m(k_metric_outset, metric_extractor_t::index_top);
00520     result.vertical().outset_m.second += w.metrics_m(k_metric_outset, metric_extractor_t::index_bottom);
00521 
00522     result.horizontal().frame_m.first += w.metrics_m(k_metric_frame, metric_extractor_t::index_left);
00523     result.horizontal().frame_m.second += w.metrics_m(k_metric_frame, metric_extractor_t::index_right);
00524     result.vertical().frame_m.first += w.metrics_m(k_metric_frame, metric_extractor_t::index_top);
00525     result.vertical().frame_m.second += w.metrics_m(k_metric_frame, metric_extractor_t::index_bottom);
00526 
00527     result.horizontal().inset_m.first += w.metrics_m(k_metric_inset, metric_extractor_t::index_left);
00528     result.horizontal().inset_m.second += w.metrics_m(k_metric_inset, metric_extractor_t::index_right);
00529     result.vertical().inset_m.first += w.metrics_m(k_metric_inset, metric_extractor_t::index_top);
00530     result.vertical().inset_m.second += w.metrics_m(k_metric_inset, metric_extractor_t::index_bottom);
00531 
00532     if (!result.vertical().guide_set_m.empty())
00533         // REVISIT (fbrereto) It will not always be safe to assume the first vertical poi is the baseline.
00534         result.vertical().guide_set_m[0] += w.metrics_m(implementation::k_metric_adjust_baseline);
00535 
00536     return result;
00537 }
00538 
00539 /****************************************************************************************************/
00540 /****************************************************************************************************/
00541 /****************************************************************************************************/
00542 /****************************************************************************************************/
00543 /****************************************************************************************************/
00544 /****************************************************************************************************/
00545 /****************************************************************************************************/
00546 
00547 extents_t::slice_t merge_slices_with(const extents_t&                 src_retangle1,
00548                                      const metric_extractor_t&        metrics1,
00549                                      const extents_t&                 src_retangle2,
00550                                      const metric_extractor_t&        metrics2,
00551                                      extents_slices_t::slice_select_t slice);
00552 
00553 /****************************************************************************************************/
00554 /****************************************************************************************************/
00555 /****************************************************************************************************/
00556 /****************************************************************************************************/
00557 /****************************************************************************************************/
00558 /****************************************************************************************************/
00559 /****************************************************************************************************/
00560 
00561 extern aggregate_name_t k_metric_gap;
00562 
00563 extern aggregate_name_t k_metric_size;
00564 extern aggregate_name_t k_metric_adjust_position;
00565 extern aggregate_name_t k_metric_adjust_size;
00566 extern aggregate_name_t k_metric_adjust_baseline;
00567 extern aggregate_name_t k_metric_outset;
00568 extern aggregate_name_t k_metric_frame;
00569 extern aggregate_name_t k_metric_inset;
00570 extern aggregate_name_t k_metric_spacing;
00571 
00572 const metric_extractor_t& global_metrics();
00573 
00574 /****************************************************************************************************/
00575 /****************************************************************************************************/
00576 /****************************************************************************************************/
00577 /****************************************************************************************************/
00578 /****************************************************************************************************/
00579 /****************************************************************************************************/
00580 /****************************************************************************************************/
00581 
00582 template <typename Widget>
00583 extents_t measure(const Widget& widget)
00584     { return apply_fudges(widget, measure(widget.control_m)); }
00585 
00586 /****************************************************************************************************/
00587 
00588 template <>
00589 extents_t measure< ::ControlRef >(const ::ControlRef& control);
00590 
00591 /****************************************************************************************************/
00592 
00593 template <>
00594 inline extents_t measure<auto_control_t>(const auto_control_t& control)
00595     { return measure(control.get()); }
00596 
00597 /****************************************************************************************************/
00598 
00599 // looking for measure_label_text? Use this.
00600 extents_t measure_theme_text(const std::string& text, theme_t theme);
00601 
00602 /****************************************************************************************************/
00603 /****************************************************************************************************/
00604 /****************************************************************************************************/
00605 /****************************************************************************************************/
00606 /****************************************************************************************************/
00607 /****************************************************************************************************/
00608 /****************************************************************************************************/
00609 
00610 template <typename Widget>
00611 void set_bounds(Widget& widget, const place_data_t& place_data)
00612 {
00613     assert(widget.control_m);
00614 
00615     place_data_t placement(place_data);
00616 
00617     implementation::shed_fudges(widget, placement);
00618 
00619     ::Rect new_bounds =
00620     {
00621         static_cast<short>(top(placement)),
00622         static_cast<short>(left(placement)),
00623         static_cast<short>(bottom(placement)),
00624         static_cast<short>(right(placement))
00625     };
00626 
00627     set_bounds(widget.control_m, new_bounds);
00628 }
00629 
00630 /****************************************************************************************************/
00631 /****************************************************************************************************/
00632 /****************************************************************************************************/
00633 /****************************************************************************************************/
00634 /****************************************************************************************************/
00635 /****************************************************************************************************/
00636 /****************************************************************************************************/
00637 
00638 inline void set_name(::ControlRef& control, const std::string& name)
00639 {
00640     assert(control);
00641 
00642     ADOBE_REQUIRE_STATUS(::SetControlTitleWithCFString(control, explicit_cast<auto_cfstring_t>(name).get()));
00643 }
00644 
00645 /****************************************************************************************************/
00646 
00648 
00649 template <typename Widget>
00650 void set_name(Widget& widget, const std::string& name)
00651 {
00652     set_name(widget.control_m, name);
00653 }
00654 
00655 /****************************************************************************************************/
00656 /****************************************************************************************************/
00657 /****************************************************************************************************/
00658 /****************************************************************************************************/
00659 /****************************************************************************************************/
00660 /****************************************************************************************************/
00661 /****************************************************************************************************/
00662 
00664 
00665 template <typename T>
00666 void set_field_text(T&, const std::string& name);
00667 
00668 /****************************************************************************************************/
00669 /****************************************************************************************************/
00670 /****************************************************************************************************/
00671 /****************************************************************************************************/
00672 /****************************************************************************************************/
00673 /****************************************************************************************************/
00674 /****************************************************************************************************/
00675 
00676 template <typename Widget>
00677 void set_theme(Widget& widget, theme_t theme)
00678 {
00679     assert(widget.control_m);
00680 
00681     widget.theme_m = theme;
00682 
00683     set_theme(widget.control_m, theme);
00684 }
00685 
00686 /****************************************************************************************************/
00687 
00688 template <>
00689 void set_theme< ::ControlRef >(::ControlRef& control, theme_t theme);
00690 
00691 /****************************************************************************************************/
00692 
00693 template <>
00694 void set_theme< ::TXNObject >(::TXNObject& hitextview, theme_t theme);
00695 
00696 /****************************************************************************************************/
00697 
00698 template <>
00699 inline void set_theme<auto_control_t>(auto_control_t& control, theme_t theme)
00700     { ::ControlRef temp(control.get()); set_theme(temp, theme); }
00701 
00702 /****************************************************************************************************/
00703 
00704 template <typename Widget>
00705 void adorn_theme(Widget& widget, theme_t theme)
00706 {
00707     theme_t current(widget.theme_m);
00708 
00709     // wipe base from current if new base specified
00710     if (theme & theme_mask_s)
00711         current &= ~theme_mask_s; 
00712 
00713     current |= theme; // logical OR the two themes together
00714 
00715     set_theme(widget, current);
00716 }
00717 
00718 /****************************************************************************************************/
00719 
00720 template <typename Widget>
00721 void unadorn_theme(Widget& widget, theme_t theme)
00722 {
00723     theme_t current(widget.theme_m);
00724 
00725     current &= ~theme;
00726 
00727     // If no base is specified now, default to normal
00728     if (!(current & theme_mask_s))
00729         current |= theme_normal_s;
00730 
00731     set_theme(widget, current);
00732 }
00733 
00734 /****************************************************************************************************/
00735 /****************************************************************************************************/
00736 /****************************************************************************************************/
00737 /****************************************************************************************************/
00738 /****************************************************************************************************/
00739 /****************************************************************************************************/
00740 /****************************************************************************************************/
00741 
00742 template <typename T>
00743 void set_active(T&, bool make_active);
00744 
00745 /****************************************************************************************************/
00746 
00747 template <>
00748 void set_active< ::ControlRef >(::ControlRef& control, bool make_active);
00749 
00750 /****************************************************************************************************/
00751 
00752 template <>
00753 inline void set_active< auto_control_t >(auto_control_t& control, bool make_active)
00754     { ::ControlRef temp(control.get()); set_active(temp, make_active); }
00755 
00756 /****************************************************************************************************/
00757 
00758 template <typename T>
00759 void set_visible(T&, bool make_visible);
00760 
00761 /****************************************************************************************************/
00762 
00763 template <>
00764 inline void set_visible< ::ControlRef >(::ControlRef& control, bool make_visible)
00765 {
00766     assert(control);
00767 
00768     ADOBE_REQUIRE_STATUS(::HIViewSetVisible(control, make_visible));
00769 }
00770 
00771 /****************************************************************************************************/
00772 
00773 template <typename T>
00774 void set_focused(T&, bool make_focused);
00775 
00776 /****************************************************************************************************/
00777 
00778 template <>
00779 inline void set_focused< ::ControlRef >(::ControlRef& control, bool make_focused)
00780 {
00781     assert(control);
00782 
00783     set_focus(control, make_focused);
00784 }
00785 
00786 /****************************************************************************************************/
00787 
00788 template <typename T>
00789 inline bool is_focused(T& control)
00790 { return is_focused(control.control_m); }
00791 
00792 /****************************************************************************************************/
00793 
00794 template <>
00795 inline bool is_focused< ::ControlRef >(::ControlRef& control)
00796 {
00797     assert(control);
00798 
00799     ::ControlRef cur_focus;
00800 
00801     ADOBE_REQUIRE_STATUS(::GetKeyboardFocus(::GetControlOwner(control), &cur_focus));
00802 
00803     return cur_focus == control;
00804 }
00805 
00806 template <>
00807 inline bool is_focused< auto_control_t >(auto_control_t& control)
00808 { ::ControlRef temp(control.get()); return is_focused(temp); }
00809 
00810 /****************************************************************************************************/
00811 /****************************************************************************************************/
00812 /****************************************************************************************************/
00813 /****************************************************************************************************/
00814 /****************************************************************************************************/
00815 /****************************************************************************************************/
00816 /****************************************************************************************************/
00817 
00818 template <typename Widget>
00819 extents_t widget_best_bounds(Widget& w, const std::string* first, const std::string* last)
00820 {
00821     extents_t   result;
00822     int         text_height(0);
00823     int         text_width(0);
00824     int         text_baseline(-1);
00825     std::size_t longest_line_len(0);
00826     std::string placeholder(implementation::get_name(w));
00827 
00828     implementation::set_metric_extractor(w);
00829 
00830     for (; first != last; ++first)
00831     {
00832         longest_line_len = std::max(longest_line_len, first->size());
00833 
00834         implementation::set_name(w, *first);
00835 
00836         // we measure the control (not the widget) because we don't want the fudges applied yet
00837 
00838         extents_t    extents(implementation::measure(w.control_m));
00839         guide_set_t& poi(extents.vertical().guide_set_m);
00840 
00841         text_height = std::max(text_height, extents.height());
00842         text_width = std::max(text_width, extents.width());
00843 
00844         if (!poi.empty())
00845             text_baseline = std::max<int>(text_baseline, poi[0]);
00846     }
00847 
00848     result.width() = text_width;    
00849     result.height() = text_height;
00850 
00851     // we keep track of the longest_line_len to check and see if a non-blank
00852     // name was used. In that case do we then add the spacing metric.
00853 
00854     if (longest_line_len)
00855         result.width() += w.metrics_m(implementation::k_metric_spacing);
00856     else
00857     {
00858         // In the case when there was no name to speak of for the widget,
00859         // we still want it to baseline-align with its labelled siblings,
00860         // so we do some handwaving to get the correct baseline.
00861 
00862         implementation::set_name(w, std::string("X"));
00863 
00864         extents_t    extents(implementation::measure(w.control_m));
00865         guide_set_t& poi(extents.vertical().guide_set_m);
00866 
00867         if (!poi.empty())
00868             text_baseline = std::max<int>(text_baseline, poi[0]);
00869     }
00870 
00871     if (text_baseline != -1)
00872         result.vertical().guide_set_m.push_back(text_baseline);
00873 
00874     implementation::set_name(w, placeholder);
00875 
00876     return implementation::apply_fudges(w, result);
00877 }
00878 
00879 /****************************************************************************************************/
00880 
00881 template <typename Widget>
00882 inline extents_t widget_best_bounds(Widget& w, const std::string& name)
00883 {
00884     const std::string* first(&name);
00885 
00886     return widget_best_bounds(w, first, first + 1);
00887 }
00888 
00889 /****************************************************************************************************/
00890 /****************************************************************************************************/
00891 /****************************************************************************************************/
00892 /****************************************************************************************************/
00893 /****************************************************************************************************/
00894 /****************************************************************************************************/
00895 /****************************************************************************************************/
00896 
00897 std::string convert_utf(::UniChar* buffer, std::size_t size);
00898 
00899 /****************************************************************************************************/
00900 
00901 std::string convert_utf(UniChar* buffer);
00902 
00903 /****************************************************************************************************/
00904 
00905 modifiers_t convert_modifiers(::UInt32 os_modifiers);
00906 
00907 /****************************************************************************************************/
00908 /****************************************************************************************************/
00909 /****************************************************************************************************/
00910 /****************************************************************************************************/
00911 /****************************************************************************************************/
00912 /****************************************************************************************************/
00913 /****************************************************************************************************/
00914 
00915 bool context_menu(::WindowRef parent,
00916                   long x, long y,
00917                   const name_t* first,
00918                   const name_t* last,
00919                   name_t& result);
00920 
00921 /****************************************************************************************************/
00922 /****************************************************************************************************/
00923 /****************************************************************************************************/
00924 /****************************************************************************************************/
00925 /****************************************************************************************************/
00926 /****************************************************************************************************/
00927 /****************************************************************************************************/
00928 
00929 boost::filesystem::path fsref_to_path(const ::FSRef& location);
00930 
00931 /****************************************************************************************************/
00932 /****************************************************************************************************/
00933 /****************************************************************************************************/
00934 /****************************************************************************************************/
00935 /****************************************************************************************************/
00936 /****************************************************************************************************/
00937 /****************************************************************************************************/
00938 
00939 typedef boost::function<void (boost::uint32_t)> context_slider_callback_t;
00940 
00941 void context_slider(boost::uint32_t left,
00942                     boost::uint32_t top,
00943                     boost::uint32_t width,
00944                     boost::uint32_t height,
00945                     boost::uint32_t value_min,
00946                     boost::uint32_t value_init,
00947                     boost::uint32_t value_max,
00948                     const context_slider_callback_t& proc);
00949 
00950 /****************************************************************************************************/
00951 /****************************************************************************************************/
00952 /****************************************************************************************************/
00953 /****************************************************************************************************/
00954 /****************************************************************************************************/
00955 /****************************************************************************************************/
00956 /****************************************************************************************************/
00957 
00958 } // namespace implementation
00959 
00960 /****************************************************************************************************/
00961 
00962 class mouse_in_out_event_tag_t { } ;
00963 
00964 struct mouse_in_out_event_handler_t
00965 {
00966     mouse_in_out_event_handler_t()
00967     {
00968         handler_m.insert(kEventClassMouse, kEventMouseEntered);
00969         handler_m.insert(kEventClassMouse, kEventMouseExited);
00970 
00971         handler_m.monitor_proc_m = boost::bind(&mouse_in_out_event_handler_t::handle_event,
00972                                                boost::ref(*this), _1, _2);
00973     }
00974 
00975     ::OSStatus handle_event(::EventHandlerCallRef,
00976                             ::EventRef event)
00977     {
00978         UInt32  event_class(::GetEventClass(event));
00979         UInt32  event_kind(::GetEventKind(event));
00980 
00981         if (event_class != kEventClassMouse)
00982             return eventNotHandledErr;
00983 
00984         if (event_kind == kEventMouseEntered)
00985             ADOBE_REQUIRE_STATUS(::SetThemeCursor(kThemeIBeamCursor));
00986         else if (event_kind == kEventMouseExited)
00987             ADOBE_REQUIRE_STATUS(::SetThemeCursor(kThemeArrowCursor));
00988         else
00989             return eventNotHandledErr;
00990 
00991         return noErr;
00992     }
00993 
00994     event_handler_t          handler_m;
00995     mouse_in_out_event_tag_t tag_m;
00996 };
00997 
00998 /****************************************************************************************************/
00999 
01000 } // namespace adobe
01001 
01002 /**************************************************************************************************/
01003 
01004 #endif
01005 
01006 /****************************************************************************************************/
01007 
01008 #endif
01009 
01010 /****************************************************************************************************/

Copyright © 2006-2007 Adobe Systems Incorporated.

Use of this website signifies your agreement to the Terms of Use and Online Privacy Policy.

Search powered by Google