{"id":1598,"date":"2018-01-30T20:00:05","date_gmt":"2018-01-30T20:00:05","guid":{"rendered":"https:\/\/clarionsharp.com\/blog\/?p=1598"},"modified":"2018-01-30T20:00:05","modified_gmt":"2018-01-30T20:00:05","slug":"new-status-bar-implementation-c11","status":"publish","type":"post","link":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/","title":{"rendered":"New Status bar implementation (C11)"},"content":{"rendered":"<p>The new implementation of the Status bar is fully backward compatible. This means that if a program doesn&#8217;t use any of the new Status bar\/style interfaces, the Status bar is drawn exactly the same as the old implementation. If the interfaces are used, besides the improved visual appearance there are the following changes:<\/p>\n<p>&#8211; An empty status bar without zones remains visible and can be used to display<br \/>\nthe resize gripper.<\/p>\n<p>&#8211; Text from the MSG attribute of controls or menu items is drawn in the<br \/>\nleftmost text zone when the control or menu\/item has focus.<\/p>\n<p>Before diving into the details here are a couple screenshots<\/p>\n<p><a href=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1608\" src=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png\" alt=\"StatusBar\" width=\"709\" height=\"27\" srcset=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png 1318w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb-300x11.png 300w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb-768x29.png 768w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb-1024x39.png 1024w\" sizes=\"auto, (max-width: 709px) 100vw, 709px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1607\" src=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB.png\" alt=\"Big StatusBar\" width=\"1327\" height=\"112\" srcset=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB.png 1327w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB-300x25.png 300w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB-768x65.png 768w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB-1024x86.png 1024w\" sizes=\"auto, (max-width: 1327px) 100vw, 1327px\" \/><\/a><\/p>\n<div><\/div>\n<p>The Status bar implementation exposes a set of 3 interfaces:<\/p>\n<p>1) IStatusZone: gives access to properties of a particular zone;<br \/>\nthere are 3 extended interfaces derived from it for Text, Image<br \/>\nand Progress zones &#8211; ITextZone, IImageZone and IProgressZone<\/p>\n<p>2) IStatusStyle: represents an instance of the style for the Status bar<\/p>\n<p>3) IStatusBar: represents an instance of the Status bar object<\/p>\n<p>&#8211; Supported Properties:<br \/>\n1) PROP:StatusInterface &#8211; is used to get a reference to the<br \/>\nWINDOW&#8217;s Status bar object<\/p>\n<p>2) PROP:StatusStyle &#8211; a SYSTEM property to get the reference to<br \/>\nthe default status style object<\/p>\n<p>Both properties are read-only but the returned objects can be modified.<\/p>\n<p>&#8211; When the Status bar object is created because of OPENing a<br \/>\nWINDOW with the STATUS attribute, or by setting the PROP:Status<br \/>\nproperty to a WINDOW without a Status bar, the current default style<br \/>\nis used to set up the bar&#8217;s appearance. The Status bar uses its own<br \/>\ncopy of the style data. Therefore changes in the default style do not<br \/>\naffect existing status bars automatically. The current bar&#8217;s<br \/>\nstyle can be changed by a call to the IStatusBar.ApplyStyle method.<\/p>\n<p>&#8211; Because one instance of the status bar object can be shared by<br \/>\nmore than one WINDOW, there is no method to destroy an instance of<br \/>\nthe IStatusBar interface. For backward compatibility, the<br \/>\nstatus bar of a WINDOW can be destroyed by specifying a zero width for<br \/>\nthe first zone using the PROP:Status property:<\/p>\n<p>Window {PROP:Status, 1} = 0<\/p>\n<p>&#8211; The initial state of the default status Style object mimics the traditional<br \/>\nStatus bar&#8217;s appearance. The only visual difference are the use of different RGB values<br \/>\nfor the colors used to draw the Status bar&#8217;s upper border and the zones bevels.<\/p>\n<p>The rest of this post contains the details of the new interfaces.<\/p>\n<p>Interfaces:<\/p>\n<p>IStatusZone<br \/>\n&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>GetKind &#8211; Returns numeric value of zone&#8217;s type as they are<br \/>\nlisted in the StatusZoneKind ITEMIZE structure<\/p>\n<p><code>StatusZoneKind ITEMIZE(0),PRE(STATUSZONE)<br \/>\nTEXT EQUATE<br \/>\nIMAGE EQUATE<br \/>\nPROGRESS EQUATE<br \/>\nEND<\/code><\/p>\n<p>GetWidth &#8211; If passed parameter is TRUE, function returns current<br \/>\nactual width of the zone in pixels including all<br \/>\nmargins, optional bevel and optional separator.<br \/>\nIf passed parameter is FALSE, function returns the<br \/>\nunadjusted width of zone in dialog units.<\/p>\n<p>SetWidth &#8211; Changes the unadjusted width of the zone. Rules are the<br \/>\nsame as for value passed to the PROP:Status property.<br \/>\nUnadjusted width is given in zone&#8217;s dialog units<br \/>\nand does not include zone margins and the optional separator.<\/p>\n<p>If the value is negative, the zone is expandable with minimum<br \/>\nwidth (in dlu&#8217;s) equal to the absolute value of the passed<br \/>\nnumber. By default, when A zone is created its<br \/>\nunadjusted width is set equal to -1. For text<br \/>\nzones dialog units are determined by the font used<br \/>\nto draw text in that zone. For zones of other kinds,<br \/>\ndialog units are determined by the font from the<br \/>\nStatus bar&#8217;s style.<\/p>\n<p>HasBevel &#8211; Returns TRUE if a bevel is present around the content<br \/>\npart of the zone, and FALSE if no bevel is present.<\/p>\n<p>SetBevel &#8211; Modifies zone&#8217;s flag controlling the drawing of the<br \/>\nbevel around content area. The passed parameter must be<br \/>\none of the values listed in the StatusFlagValue ITEMIZE<br \/>\nstructure:<\/p>\n<p>&#8211; STATUSFLAG:OFF &#8211; to not draw the bevel<br \/>\n&#8211; STATUSFLAG:ON &#8211; to draw the bevel<br \/>\n&#8211; STATUSFLAG:DEFAULT &#8211; drawing of the bevel is<br \/>\ndetermined by status bar&#8217;s style.<\/p>\n<p>Default value is STATUSFLAG:DEFAULT.<\/p>\n<p>HasSeparator &#8211; Returns TRUE if separator is drawing at the far edge<br \/>\nof the zone and FALSE if no separator is drawing<\/p>\n<p>SetSeparator &#8211; Modifies zone&#8217;s flag controlling the drawing of the<br \/>\nseparator. Passed parameter must be one of values<br \/>\nlisted in the StatusFlagValue ITEMIZE structure:<\/p>\n<p>&#8211; STATUSFLAG:OFF &#8211; do not draw the separator<br \/>\n&#8211; STATUSFLAG:ON &#8211; draw the separator<br \/>\n&#8211; STATUSFLAG:DEFAULT &#8211; drawing of the separator is<br \/>\ndetermined by the Status bar&#8217;s style.<br \/>\nDefault value is STATUSFLAG:DEFAULT.<\/p>\n<p>If the last zone has the separator flag equal to STATUSFLAG:DEFAULT, the<br \/>\nseparator is not drawn regardless of the style settings.<\/p>\n<p>&#8212;&#8212;&#8212;<br \/>\nITextZone<br \/>\n&#8212;&#8212;&#8212;<\/p>\n<p>GetText &#8211; Returns the current text of the zone. The returned value can be<br \/>\npassed to the ToString function to convert it to a STRING type.<\/p>\n<p>SetText &#8211; Changes the text displayed in the zone. Default value is<br \/>\nan empty string.<\/p>\n<p>GetAlignment &#8211; Returns the numeric value of text alignment as they are<br \/>\nlisted in the StatusAlignValue ITEMIZE structure. The<br \/>\nSTATUSALIGN:DEFAULT and STATUSALIGN:LEFT values are<br \/>\nequivalent.<\/p>\n<p>! Alignment of text in text zones<\/p>\n<p><code>StatusAlignValue ITEMIZE(0),PRE(STATUSALIGN)<br \/>\nDEFAULT EQUATE<br \/>\nLEFT EQUATE<br \/>\nRIGHT EQUATE<br \/>\nCENTER EQUATE<br \/>\nEND<\/code><\/p>\n<p>SetAlignment &#8211; Changes the text alignment in the zone content area,<br \/>\nDefault value is STATUSALIGN:DEFAULT<\/p>\n<p>GetIndent &#8211; Returns the value of text indentation in pixels relative to<br \/>\nthe base point determined by current alignment.<\/p>\n<p>SetIndent &#8211; Changes text indent value to the passed value, countied in<br \/>\npixels. Default value is 0.<\/p>\n<p>GetFont &#8211; Returns an instance of the IFontProperties interface<br \/>\nallowing to modify parameters of the font used to<br \/>\ndraw text in the zone. A NULL result means that the zone is<br \/>\nusing the font specified by Status bar&#8217;s style.<\/p>\n<p>SetFont &#8211; Changes the font used to draw text in the zone.<br \/>\nDefault value is NULL, i.e. usage of the font from the<br \/>\nStatus bar&#8217;s style.<\/p>\n<p>*** Notes:<\/p>\n<p>The IFontDescription interface has no public methods to clone and destroy<br \/>\ninstances. ITextZone.SetFont automatically releases the previous zone&#8217;s<br \/>\nfont (unless it is NULL), clones the passed font (unless it is NULL) and<br \/>\nset it to zone. The expected flow of work with a zone&#8217;s font is as<br \/>\nfollows:<\/p>\n<p>ZoneFont &amp;= BarStyle.GetFont() ! Get the font from style<br \/>\nZone.SetFont (ZoneFont) ! Set the clone of font to zone<br \/>\nZoneFont &amp;= Zone.GetFont() ! Get the reference to cloned font<br \/>\n&#8230; modify font &#8230;<br \/>\nZone.FontChanged() ! Notify zone that font changed<\/p>\n<p>GetTextColor &#8211; Returns the color used to draw text in the zone. If the zone<br \/>\nhas its own font, the returned value is equal to<br \/>\nresult of call to IFontProperties.FontColor() for this<br \/>\nfont. If the zone is using the default font from the bar&#8217;s<br \/>\nstyle, the text color can be changed separately. In this<br \/>\ncase, GetTextColor() returns that color value.<\/p>\n<p>SetTextColor &#8211; Changes color of==used for drawing text. If the zone has its own<br \/>\nfont, this function has the same effect as a call to the<br \/>\nfont&#8217;s IFontProperties.FontColor(newcolor) method. If the<br \/>\nzone is using the default font from the bar&#8217;s style, this<br \/>\nfunction can be used to change text color in the zone<br \/>\nwhile retaining all other characteristics of the default<br \/>\nfont.<\/p>\n<p>FontChanged &#8211; This method must be called to notify the zone that its font has<br \/>\nbeen changed by calls to methods of the IFontProperties<br \/>\ninterface returned by the GetFont function.<\/p>\n<p>IImageZone<br \/>\n&#8212;&#8212;&#8212;-<\/p>\n<p>GetImage &#8211; Returns the name of the image drawn in the zone. Returned<br \/>\nvalue can be passed to the ToString function to convert<br \/>\nit to STRING type.<\/p>\n<p>SetImage &#8211; Sets\/changes the image displayed in the zone. Default value is<br \/>\nNULL which means that zone remains blank.<\/p>\n<p>*** Notes:<\/p>\n<p>If the width of zone is greater than the width of the image, the image is drawn<br \/>\nleft aligned in the zone content rectangle (right-aligned in case of<br \/>\nright-to-left window layout). If width of the zone is less or equal to the width of<br \/>\nthe image, the image is drawn centered in the zone content rectangle.<\/p>\n<p>GetDrawMode &#8211; Returns the numeric value of the image drawing mode<br \/>\nas they are listed in the StatusImageMode ITEMIZE<br \/>\nstructure.<\/p>\n<p>! Modes of drawing images in image zones<\/p>\n<p>StatusImageMode ITEMIZE(0),PRE(STATUSIMAGE)<br \/>\nNORMAL EQUATE<br \/>\nDISABLED EQUATE<br \/>\nGRAYED EQUATE<br \/>\nEND<\/p>\n<p>SetDrawMode &#8211; Changes the mode to draw zone image. Parameter must be<br \/>\none of values listed in the StatusImageMode ITEMIZE<br \/>\nstructure. Default value is STATUSIMAGE:NORMAL.<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;-<br \/>\nIProgressZone<br \/>\n&#8212;&#8212;&#8212;&#8212;-<\/p>\n<p>GetValue &#8211; Returns the current progress value.<\/p>\n<p>SetValue &#8211; Changes the current progress value.<\/p>\n<p>GetMin &#8211; Returns the lower bound for progress value.<\/p>\n<p>GetMax &#8211; Returns the upper bound for progress value.<\/p>\n<p>SetRange &#8211; Changes the lower and upper bounds for the progress value.<br \/>\nDefault range is 0..100<\/p>\n<p>GetColor &#8211; Returns the color used to draw the progress bar.<\/p>\n<p>SetColor &#8211; Changes the color to draw the progress bar.<\/p>\n<p>*** Notes:<\/p>\n<p>If the progress zone has a bevel, the bevel is used as the frame for<br \/>\nthe progress bar. If the zone has no bevel, additional lines are drawn to<br \/>\nshow the unfilled part of the progress bar.<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;<br \/>\nIStatusStyle<br \/>\n&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>Clone &#8211; Returns a cloned copy of the style object.<\/p>\n<p>Destroy &#8211; Destroys the style object. The Destroy method must<br \/>\nbe called for all style objects returned from calls<br \/>\nto IStatusStyle.Clone methods.<\/p>\n<p>CreateBar &#8211; Creates the status bar object for the passed WINDOW<br \/>\nusing the style determining by SELF. The previous<br \/>\nWINDOW&#8217;s status bar object is disposed. It is not<br \/>\nrecommended to use this function for the active MDI<br \/>\nchild window. Created status bar has no zones and<br \/>\nis frozen.<\/p>\n<p>Apply &#8211; Copies information from one style object to another.<br \/>\nCan be used for &#8220;atomic&#8221; changing of the system<br \/>\ndefault status style.<\/p>\n<p>GetMetric &#8211; Returns the value for the given style metric. Parameter<br \/>\nmust be one of values listed in the StatusMetric<br \/>\nITEMIZE structure.<\/p>\n<p>Supported metrics are:<br \/>\nSTATUS:HMARGIN &#8211; margin from status bar edge to first<br \/>\nzone and, if no resize gripper is drawn, from<br \/>\nthe last zone to the status bar edge. Default value<br \/>\nis 4.<\/p>\n<p>STATUS:ZONEHMARGIN &#8211; Horizontal margins around the zone content<br \/>\nrectangle. Default value is 4.<\/p>\n<p>STATUS:ZONEVMARGIN &#8211; Vertical margins above and below the zone<br \/>\ncontent rectangle. Default value is 2.<\/p>\n<p>STATUS:TEXTHMARGIN &#8211; Horizontal margins around the<br \/>\ntext bounding rectangle in text zones. Default<br \/>\nvalue is 2.<\/p>\n<p>STATUS:TEXTVMARGIN &#8211; Vertical margins above and below the text<br \/>\nbounding rectangle in text zones. Default value<br \/>\nis 0.<\/p>\n<p>STATUS:TEXTINDENT &#8211; indentation of text relatively the<br \/>\nbase point (determined by text alignment) in the<br \/>\ntext bounding rectangle. Default value is 0.<\/p>\n<p>STATUS:SEPMARGIN &#8211; margins above and below the zones&#8217;<br \/>\nseparator line. Default value is 2.<\/p>\n<p>***Notes: All returned values are in pixels.<\/p>\n<p>SetMetric &#8211; Changes the given style metric. The first parameter must<br \/>\nbe one of values listed in the StatusMetric ITEMIZE<br \/>\nstructure.<\/p>\n<p>GetHeight &#8211; Returns the height in pixels of the status bar determined<br \/>\nby the style. If the parameter value is FALSE, the function<br \/>\nreturns the value set by last call to the SetHeight method.<br \/>\nIf parameter is TRUE, function returns adjusted height<br \/>\nvalue. Adjusted height is maximum of GetHeight(FALSE)<br \/>\nand height calculated from style&#8217;s font and metrics.<\/p>\n<p>SetHeight &#8211; Changes the unadjusted height for styled status bars.<br \/>\nPassed value must be in pixels. Default value is 0,<br \/>\ni.e. the adjusted height is determined by the font and<br \/>\nmetrics.<\/p>\n<p>BkgndBrush &#8211; Returns the instance of the IBrush interface used to<br \/>\ndraw the Status bar&#8217;s background. If IBrush.Type is<br \/>\nCWBrush_Null (default), the background is painted<br \/>\nusing the COLOR:BTNFACE color.<\/p>\n<p>GetFont &#8211; Returns the instance of the IFontProperties interface<br \/>\nused as the default font for Text zones.<\/p>\n<p>SetFont &#8211; Sets\/changes the style&#8217;s default font. If the passed parameter is NULL<br \/>\n(default), the font specified by SYSTEM properties is used.<\/p>\n<p>GetTextColor &#8211; Returns the default color used to draw text in Text<br \/>\nzones.<\/p>\n<p>SetTextColor &#8211; Changes the default color used to draw text in Text<br \/>\nzones. If the passed value is COLOR:None, the color returned<br \/>\nby SYSTEM{PROP:FontColor + PROP:StatusFont} is used.<\/p>\n<p>GetProgressColor &#8211; Returns the default color used to draw Progress bars in<br \/>\nprogress zones.<\/p>\n<p>SetProgressColor &#8211; Changes the color used to draw Progress bars in<br \/>\nprogress zones.<\/p>\n<p>GetSeparatorColor &#8211; Returns the color used to draw flat separator lines.<\/p>\n<p>SetSeparatorColor &#8211; Sets\/changes the color used to draw flat separator lines.<\/p>\n<p>HasZoneBevel &#8211; Returns the default value of the flag to draw bevel around<br \/>\nthe content rectangle for zones of a given kind.<\/p>\n<p>SetZoneBevel &#8211; Changes default value of the flag to draw the bevel around<br \/>\ncontent rectangle for zones of the kind given by the first<br \/>\nparameter. Default value is TRUE for text zones and<br \/>\nFALSE for image and progress zones.<\/p>\n<p>GetFlag &#8211; Returns value of the style flag corresponding to<br \/>\npassed parameter. Parameter must be one of values<br \/>\nlisted in the StausStyleFlag ITEMIZE structure:<\/p>\n<p>STATUS:THEMED &#8211; if TRUE, and themes are available for<br \/>\nthe program, some metrics and visual aspects are<br \/>\ndetermined by the visual theme rather than by values<br \/>\nset in the style. If the flag is FALSE, style does not<br \/>\nuse the visual theme.<\/p>\n<p>STATUS:SEPARATOR &#8211; if TRUE, the separator line is<br \/>\ndrawn after every zone except the last one by default.<\/p>\n<p>If the flag is FALSE (default), separators are not<br \/>\ndrawn unless this setting is overridden in a<br \/>\nparticular zone.<\/p>\n<p>STATUS:GRIPPER &#8211; If TRUE, the resize gripper is drawn<br \/>\nin the lower-far corner of status bars owned by resizable<br \/>\nnot-maximized WINDOWs. If flag is FALSE (default),<br \/>\nthe gripper is not drawn.<\/p>\n<p>STATUS:BORDER3D &#8211; If TRUE, the status bar&#8217;s upper edge<br \/>\nis drawn using a bevel. If the flag is FALSE, a flat<br \/>\nborder is drawn. The flag only affects not-themed<br \/>\nstatus bars using solid colors to paint the bar&#8217;s<br \/>\nbackground. The flat border is drawn in all other<br \/>\ncases.<\/p>\n<p>STATUS:SEPARATOR3D &#8211; If TRUE, separator lines are drawn<br \/>\nusing a bevel. If the flag is FALSE, the separator line<br \/>\nis drawn flat. Flag is ignored for themed status<br \/>\nbars.<\/p>\n<p>SetFlag &#8211; Changes value of the style flag corresponding to passed<br \/>\nfirst parameter. This parameter must have one of values<br \/>\nlisted in the StatusStyleFlag ITEMIZE structure.<\/p>\n<p>&#8212;&#8212;&#8212;-<br \/>\nIStatusBar<br \/>\n&#8212;&#8212;&#8212;-<\/p>\n<p>ApplyStyle &#8211; Applies parameters of the passed style to the status bar.<\/p>\n<p>NumZones &#8211; Returns the number of zones in the status bar.<\/p>\n<p>GetZone &#8211; Returns the reference to object implementing the zone<br \/>\nwith passed index. Index value is 1-based. If passed<br \/>\nindex is 0 or greater than number of zones, a NULL<br \/>\nreference is returned.<\/p>\n<p>AddZone &#8211; Creates the object implementing the zone of given kind<br \/>\nand inserts it at position specified by first parameter.<br \/>\nIf position parameter is out of range 1..,<br \/>\nthe created zone is appending to the end of list of zones.<br \/>\nThe position value is 1-based.<\/p>\n<p>DeleteZone &#8211; Destroys the number of zones equal to the second parameter<br \/>\nstarting from the position given by the first parameter. By default,<br \/>\nthe only zone is creating. If second parameter is 0,<br \/>\nall zones since passed position are destroyed.<\/p>\n<p>*** Notes:<\/p>\n<p>DeleteZone can be used to delete all zones from the status bar. This leaves<br \/>\nan empty status bar.<\/p>\n<p>Freeze &#8211; Freezes the status bar to avoid multiple redrawings on<br \/>\nvolume changes to zones.<\/p>\n<p>Unfreeze &#8211; Unfreezes previously frozen status bar. More than one<br \/>\nlevel of freezing is possible, therefore the number of calls<br \/>\nto Unfreeze must be equal to number of calls<br \/>\nto Freeze.<\/p>\n<p>SetClickCallback &#8211; Sets a callback function that is invoked if the mouse is clicked or<br \/>\ndouble clicked within content rectangle of any zone. The<br \/>\n1-based index of clicked zone is passed to the callback<br \/>\nfunction as a parameter. The KEYCODE() function can be used<br \/>\nto determine which mouse button has been clicked.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The new implementation of the Status bar is fully backward compatible. This means that if a program doesn&#8217;t use any of the new Status bar\/style interfaces, the Status bar is drawn exactly the same as the old implementation. If the interfaces are used, besides the improved visual appearance there are the following changes: &#8211; An &hellip; <a href=\"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">New Status bar implementation (C11)<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":1608,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,5],"tags":[],"class_list":["post-1598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-clarion-11","category-clarionnews"],"_links":{"self":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/comments?post=1598"}],"version-history":[{"count":10,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1598\/revisions"}],"predecessor-version":[{"id":1617,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1598\/revisions\/1617"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media\/1608"}],"wp:attachment":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media?parent=1598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/categories?post=1598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/tags?post=1598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}