AI OnAI Off
Tried EPiServer.Web.Routing.Segments.RequestSegmentContext.CurrentContextMode?
That should give you an enum with either Default / Edit / Preview...
Normally you just need to use PageEditing.PageIsInEditMode to check for edit mode, I guess you've found that one already, but if you need the preview mode as well then you need to use the RequestSegmentContext.CurrentContextMode to get it.
PageEditing.PageIsInEditMode uses this class under the hood btw :)
I know how to check if a page is in Edit (in the CMS ready for editing) mode. However, can Preview mode be distinguished between Preview inside the CMS framework and what the end user sees?