Previously I have described how easily you can create a shortcut to Device Editor of Presentation Details right at the item's Context Menu - access that as much as in two clicks! But there's even easier (and more visual) way - create a specific Sitecore Gutter.
So, what Gutters are? Gutters are sort of visual markers you can optionally enable / disable in your Content Editor. Have you seen a vertical bar, immediately left hand side from Sitecore tree? That is a Gutters Area and once you do right click on it - you may enable / disable some gutters already installed. Also, gutters can be clickable, and on click handler you may also call Sitecore commands, so why not to call our familiar item:setlayoutdetails that opens Device Editor dialog for corresponding item?
So, let's create our own gutter. Every gutter is configured within core database under /sitecore/content/Applications/Content Editor/Gutters folder. We are going to create a new item called ... derived from /sitecore/templates/Sitecore Client/Content editor/Gutter Renderer template (all gutters derive from that one). There are only two fields we need to set there - Header which is just a gutter name and Type - fully qualified class name:
So now let's implement PresentationExists class. Briefly, every gutter derives from GutterRenderer class which returns GutterIconDescriptor object when gutter should be shown next to corresponded item otherwise just null. Implementation below checks whether current item has a Layout associated, and if yes - it returns a GutterIconDescriptor with a item:setlayoutdetails command for that item.
public class PresentationExists : GutterRenderer
{
protected override GutterIconDescriptor GetIconDescriptor(Item item)
{
if (item != null)
{
var layoutField = item.Fields[Sitecore.FieldIDs.LayoutField];
var layoutDefinition = LayoutDefinition.Parse(LayoutField.GetFieldValue(layoutField));
if (layoutDefinition != null && layoutDefinition.Devices.Count > 0)
{
GutterIconDescriptor gutterIconDescriptor = new GutterIconDescriptor
{
Icon = "Applications/32x32/window_colors.png",
Tooltip = Translate.Text("Presentation is set for this item.")
};
if (item.Access.CanWrite() && !item.Appearance.ReadOnly)
{
gutterIconDescriptor.Click = string.Format("item:setlayoutdetails(id={0})", item.ID);
}
return gutterIconDescriptor;
}
}
return null;
}
}
So as soon as you compile and place resulting DLL under <web_root>\bin folder, your gutter wil work like below:
Clicking that icon will immediately show Device Editor dialog. Job's done!
Please note: improperly implemented gutters may affect performance of Content Editor, as the code above runs for each item. So please be extremely attentive on what you're doing within GetIconDescriptor() method.