/// <summary> Write the standard item menu to the item display html</summary> /// <param name="Output"> Stream to which to write </param> /// <param name="Prototyper"> Current item viewer prototyper </param> /// <param name="CurrentViewer"> Current item viewer which will be used to fill the primary part of the page </param> /// <param name="CurrentItem"> Current item which is being displayed </param> /// <param name="RequestSpecificValues"> Other, request specific values, such as the current mode, user, etc.. </param> /// <param name="Behaviors"> Behaviors for the current view and situation </param> public void Write_HTML(TextWriter Output, iItemViewerPrototyper Prototyper, iItemViewer CurrentViewer, BriefItemInfo CurrentItem, RequestCache RequestSpecificValues, List <HtmlSubwriter_Behaviors_Enum> Behaviors) { //// First, check that the menu provider was created //if (menuProvider == null) //{ // // Was there some configuration information? // if (UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu != null) // { // if ((UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Class == "SobekCM.Library.ItemViewer.Menu.StandardItemMenuProvider") && (String.IsNullOrWhiteSpace(UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Assembly))) // menuProvider = new StandardItemMenuProvider(); // else // { // try // { // string assemblyName = UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Assembly; // string assemblyFilePath = Engine_ApplicationCache_Gateway.Configuration.Extensions.Get_Assembly(assemblyName); // Assembly dllAssembly = Assembly.LoadFrom(assemblyFilePath); // Type readerWriterType = dllAssembly.GetType(UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Class); // menuProvider = (iItemMenuProvider)Activator.CreateInstance(readerWriterType); // } // catch (Exception) // { // // Do nothing here... will be fixed in the next couple lines of code // } // } // } // // Finally, just set to the standard if there was a problem // if (menuProvider == null) //} if (menuProvider == null) { menuProvider = new StandardItemMenuProvider(); } // The item viewer can choose to override the standard item menu if ((!Behaviors.Contains(HtmlSubwriter_Behaviors_Enum.Item_Subwriter_Suppress_Item_Menu)) && (menuProvider != null)) { // Determine the current mode string currentCode = RequestSpecificValues.Current_Mode.ViewerCode ?? String.Empty; if (Prototyper != null) { currentCode = Prototyper.ViewerCode; } // Should the LINKS be included? bool include_links = !Behaviors.Contains(HtmlSubwriter_Behaviors_Enum.Item_Subwriter_Suppress_Item_Menu_Links); // Let the menu provider write the menu menuProvider.Add_Main_Menu(Output, currentCode, RequestSpecificValues.Flags.ItemRestrictedFromUserByIp, RequestSpecificValues.Flags.ItemCheckedOutByOtherUser, CurrentItem, RequestSpecificValues.Current_Mode, RequestSpecificValues.Current_User, include_links, RequestSpecificValues.Tracer); } }
/// <summary> Constructor for a new instance of the Item_HtmlSubwriter class </summary> /// <param name="RequestSpecificValues"> All the necessary, non-global data specific to the current request </param> public Item_HtmlSubwriter( RequestCache RequestSpecificValues) : base(RequestSpecificValues) { // First, check that the menu provider was created if (menuProvider == null) { // Was there some configuration information? if (UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu != null) { if ((UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Class == "SobekCM.Library.ItemViewer.Menu.StandardItemMenuProvider") && (String.IsNullOrWhiteSpace(UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Assembly))) menuProvider = new StandardItemMenuProvider(); else { try { string assemblyName = UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Assembly; string assemblyFilePath = Engine_ApplicationCache_Gateway.Configuration.Extensions.Get_Assembly(assemblyName); Assembly dllAssembly = Assembly.LoadFrom(assemblyFilePath); Type readerWriterType = dllAssembly.GetType(UI_ApplicationCache_Gateway.Configuration.UI.WriterViewers.Items.MainMenu.Class); menuProvider = (iItemMenuProvider)Activator.CreateInstance(readerWriterType); } catch (Exception) { // Do nothing here... will be fixed in the next couple lines of code } } } // Finally, just set to the standard if there was a problem if ( menuProvider == null ) menuProvider = new StandardItemMenuProvider(); } // Add the trace if (RequestSpecificValues.Tracer != null) RequestSpecificValues.Tracer.Add_Trace("Item_HtmlSubwriter.Constructor"); showZoomable = (String.IsNullOrEmpty(UI_ApplicationCache_Gateway.Settings.Servers.JP2ServerUrl)); searchResultsCount = 0; // Determine if the TOC should be shown showToc = false; if (HttpContext.Current.Session["Show TOC"] != null) { Boolean.TryParse(HttpContext.Current.Session["Show TOC"].ToString(), out showToc); } // Try to get the current item currentItem = SobekEngineClient.Items.Get_Item_Brief(RequestSpecificValues.Current_Mode.BibID, RequestSpecificValues.Current_Mode.VID, true, RequestSpecificValues.Tracer); RequestSpecificValues.Current_Mode.VID = currentItem.VID; // Ensure the UI portion has been configured for this user interface ItemViewer_Factory.Configure_Brief_Item_Viewers(currentItem); // Set some flags based on the resource type is_bib_level = (String.Compare(currentItem.VID, "00000", StringComparison.OrdinalIgnoreCase) == 0); is_ead = (String.Compare(currentItem.Type, "EAD", StringComparison.OrdinalIgnoreCase) == 0); // Look for TEI-type item is_tei = false; if ((UI_ApplicationCache_Gateway.Configuration.Extensions != null) && (UI_ApplicationCache_Gateway.Configuration.Extensions.Get_Extension("TEI") != null) && (UI_ApplicationCache_Gateway.Configuration.Extensions.Get_Extension("TEI").Enabled)) { string tei_file = currentItem.Behaviors.Get_Setting("TEI.Source_File"); string xslt_file = currentItem.Behaviors.Get_Setting("TEI.XSLT"); if ((tei_file != null) && (xslt_file != null)) { is_tei = true; } } // Determine if this user can edit this item userCanEditItem = false; if (RequestSpecificValues.Current_User != null) { userCanEditItem = RequestSpecificValues.Current_User.Can_Edit_This_Item(currentItem.BibID, currentItem.Type, currentItem.Behaviors.Source_Institution_Aggregation, currentItem.Behaviors.Holding_Location_Aggregation, currentItem.Behaviors.Aggregation_Code_List ); } // Check that this item is not checked out by another user itemCheckedOutByOtherUser = false; if (currentItem.Behaviors.Single_Use) { if (!Engine_ApplicationCache_Gateway.Checked_List.Check_Out(currentItem.Web.ItemID, HttpContext.Current.Request.UserHostAddress)) { itemCheckedOutByOtherUser = true; } } // Check to see if this is IP restricted restriction_message = String.Empty; if (currentItem.Behaviors.IP_Restriction_Membership > 0) { if (HttpContext.Current != null) { int user_mask = (int)HttpContext.Current.Session["IP_Range_Membership"]; int comparison = currentItem.Behaviors.IP_Restriction_Membership & user_mask; if (comparison == 0) { itemRestrictedFromUserByIp = true; int restriction = currentItem.Behaviors.IP_Restriction_Membership; int restriction_counter = 1; while (restriction % 2 != 1) { restriction = restriction >> 1; restriction_counter++; } if (Engine_ApplicationCache_Gateway.IP_Restrictions[restriction_counter] != null) restriction_message = Engine_ApplicationCache_Gateway.IP_Restrictions[restriction_counter].Item_Restricted_Statement; else restriction_message = "Restricted Item"; } } } // If this item is restricted by IP than alot of the upcoming code is unnecessary if ((RequestSpecificValues.Current_User != null) && ((!itemRestrictedFromUserByIp) || (userCanEditItem) || (RequestSpecificValues.Current_User.Is_Internal_User))) { #region Region suppressed currently - was for adding feature to a map image? //// Searching for EAD/EAC type items is different from others //if (!isEadTypeItem) //{ // // If there is a coordinate search, and polygons, do that // // GEt the geospatial metadata module // GeoSpatial_Information geoInfo = RequestSpecificValues.Current_Item.Get_Metadata_Module(GlobalVar.GEOSPATIAL_METADATA_MODULE_KEY) as GeoSpatial_Information; // if ((geoInfo != null) && (geoInfo.hasData)) // { // if ((currentMode.Coordinates.Length > 0) && (geoInfo.Polygon_Count > 1)) // { // // Determine the coordinates in this search // string[] splitter = currentMode.Coordinates.Split(",".ToCharArray()); // if (((splitter.Length > 1) && (splitter.Length < 4)) || ((splitter.Length == 4) && (splitter[2].Length == 0) && (splitter[3].Length == 0))) // { // Double.TryParse(splitter[0], out providedMaxLat); // Double.TryParse(splitter[1], out providedMaxLong); // providedMinLat = providedMaxLat; // providedMinLong = providedMaxLong; // } // else if (splitter.Length >= 4) // { // Double.TryParse(splitter[0], out providedMaxLat); // Double.TryParse(splitter[1], out providedMaxLong); // Double.TryParse(splitter[2], out providedMinLat); // Double.TryParse(splitter[3], out providedMinLong); // } // // Now, if there is length, determine the count of results // searchResultsString = new List<string>(); // if (searchResultsString.Count > 0) // { // searchResultsCount = searchResultsString.Count; // // Also, look to see where the current point lies in the matching, current polygon // if ((providedMaxLong == providedMinLong) && (providedMaxLat == providedMinLat)) // { // foreach (Coordinate_Polygon itemPolygon in geoInfo.Polygons) // { // // Is this the current page? // if (itemPolygon.Page_Sequence == currentMode.Page) // { // if (itemPolygon.is_In_Bounding_Box(providedMaxLat, providedMaxLong)) // { // searchMatchOnThisPage = true; // ReadOnlyCollection<Coordinate_Point> boundingBox = itemPolygon.Bounding_Box; // featureYRatioLocation = Math.Abs(((providedMaxLat - boundingBox[0].Latitude)/(boundingBox[0].Latitude - boundingBox[1].Latitude))); // featureXRatioLocation = Math.Abs(((providedMaxLong - boundingBox[0].Longitude)/(boundingBox[0].Longitude - boundingBox[1].Longitude))); // } // } // } // } // } // } // } //} #endregion // Is this a postback? if (RequestSpecificValues.Current_Mode.isPostBack) { // Handle any actions from standard user action (i.e., email, add to bookshelf, etc. ) if (HttpContext.Current.Request.Form["item_action"] != null) { string action = HttpContext.Current.Request.Form["item_action"].ToLower().Trim(); if (action == "email") { string address = HttpContext.Current.Request.Form["email_address"].Replace(";", ",").Trim(); string comments = HttpContext.Current.Request.Form["email_comments"].Trim(); string format = HttpContext.Current.Request.Form["email_format"].Trim().ToUpper(); if (address.Length > 0) { // Determine the email format bool is_html_format = format != "TEXT"; // CC: the user, unless they are already on the list string cc_list = RequestSpecificValues.Current_User.Email; if (address.ToUpper().IndexOf(RequestSpecificValues.Current_User.Email.ToUpper()) >= 0) cc_list = String.Empty; // Send the email HttpContext.Current.Session.Add("ON_LOAD_MESSAGE", !Item_Email_Helper.Send_Email(address, cc_list, comments, RequestSpecificValues.Current_User.Full_Name, RequestSpecificValues.Current_Mode.Instance_Abbreviation, currentItem, is_html_format, HttpContext.Current.Items["Original_URL"].ToString(), RequestSpecificValues.Current_User.UserID) ? "Error encountered while sending email" : "Your email has been sent"); HttpContext.Current.Response.Redirect(HttpContext.Current.Items["Original_URL"].ToString(), false); HttpContext.Current.ApplicationInstance.CompleteRequest(); RequestSpecificValues.Current_Mode.Request_Completed = true; return; } } if (action == "add_item") { string usernotes = HttpContext.Current.Request.Form["add_notes"].Trim(); string foldername = HttpContext.Current.Request.Form["add_bookshelf"].Trim(); bool open_bookshelf = HttpContext.Current.Request.Form["open_bookshelf"] != null; if (SobekCM_Database.Add_Item_To_User_Folder(RequestSpecificValues.Current_User.UserID, foldername, currentItem.BibID, currentItem.VID, 0, usernotes, RequestSpecificValues.Tracer)) { RequestSpecificValues.Current_User.Add_Bookshelf_Item(currentItem.BibID, currentItem.VID); // Ensure this user folder is not sitting in the cache CachedDataManager.Remove_User_Folder_Browse(RequestSpecificValues.Current_User.UserID, foldername, RequestSpecificValues.Tracer); HttpContext.Current.Session.Add("ON_LOAD_MESSAGE", "Item was saved to your bookshelf."); if (open_bookshelf) { HttpContext.Current.Session.Add("ON_LOAD_WINDOW", "?m=lmfl" + foldername.Replace("\"", "%22").Replace("'", "%27").Replace("=", "%3D").Replace("&", "%26") + "&vp=1"); } } else { HttpContext.Current.Session.Add("ON_LOAD_MESSAGE", "ERROR encountered while trying to save to your bookshelf."); } HttpContext.Current.Response.Redirect(HttpContext.Current.Items["Original_URL"].ToString(), false); HttpContext.Current.ApplicationInstance.CompleteRequest(); RequestSpecificValues.Current_Mode.Request_Completed = true; return; } if (action == "remove") { if (SobekCM_Database.Delete_Item_From_User_Folders(RequestSpecificValues.Current_User.UserID, currentItem.BibID, currentItem.VID, RequestSpecificValues.Tracer)) { RequestSpecificValues.Current_User.Remove_From_Bookshelves(currentItem.BibID, currentItem.VID); CachedDataManager.Remove_All_User_Folder_Browses(RequestSpecificValues.Current_User.UserID, RequestSpecificValues.Tracer); HttpContext.Current.Session.Add("ON_LOAD_MESSAGE", "Item was removed from your bookshelves."); } else { HttpContext.Current.Session.Add("ON_LOAD_MESSAGE", "ERROR encountered while trying to remove item from your bookshelves."); } HttpContext.Current.Response.Redirect(HttpContext.Current.Items["Original_URL"].ToString(), false); HttpContext.Current.ApplicationInstance.CompleteRequest(); RequestSpecificValues.Current_Mode.Request_Completed = true; return; } if (action.IndexOf("add_tag") == 0) { int tagid = -1; if (action.Replace("add_tag", "").Length > 0) { tagid = Convert.ToInt32(action.Replace("add_tag_", "")); } string description = HttpContext.Current.Request.Form["add_tag"].Trim(); int new_tagid = SobekCM_Database.Add_Description_Tag(RequestSpecificValues.Current_User.UserID, tagid, currentItem.Web.ItemID, description, RequestSpecificValues.Tracer); if (new_tagid > 0) { currentItem.Web.Add_User_Tag(RequestSpecificValues.Current_User.UserID, RequestSpecificValues.Current_User.Full_Name, description, DateTime.Now, new_tagid); RequestSpecificValues.Current_User.Has_Descriptive_Tags = true; } HttpContext.Current.Response.Redirect(HttpContext.Current.Items["Original_URL"].ToString(), false); HttpContext.Current.ApplicationInstance.CompleteRequest(); RequestSpecificValues.Current_Mode.Request_Completed = true; return; } if (action.IndexOf("delete_tag") == 0) { if (action.Replace("delete_tag", "").Length > 0) { int tagid = Convert.ToInt32(action.Replace("delete_tag_", "")); if (currentItem.Web.Delete_User_Tag(tagid, RequestSpecificValues.Current_User.UserID)) { SobekCM_Database.Delete_Description_Tag(tagid, RequestSpecificValues.Tracer); } } HttpContext.Current.Response.Redirect(HttpContext.Current.Items["Original_URL"].ToString(), false); HttpContext.Current.ApplicationInstance.CompleteRequest(); RequestSpecificValues.Current_Mode.Request_Completed = true; return; } } } // Handle any request from the internal header for the item if ((HttpContext.Current != null) && (HttpContext.Current.Request.Form["internal_header_action"] != null) && (RequestSpecificValues.Current_User != null)) { // Pull the action value string internalHeaderAction = HttpContext.Current.Request.Form["internal_header_action"].Trim(); // Was this to save the item comments? if (internalHeaderAction == "save_comments") { string new_comments = HttpContext.Current.Request.Form["intheader_internal_notes"].Trim(); if (SobekCM_Item_Database.Save_Item_Internal_Comments(currentItem.Web.ItemID, new_comments)) currentItem.Web.Internal_Comments = new_comments; } } } // Set the code for bib level mets to show the volume tree by default if ((is_bib_level) && (String.IsNullOrEmpty(RequestSpecificValues.Current_Mode.ViewerCode))) { RequestSpecificValues.Current_Mode.ViewerCode = "allvolumes1"; } // If there is a file name included, look for the sequence of that file if (!String.IsNullOrEmpty(RequestSpecificValues.Current_Mode.Page_By_FileName)) { int page_sequence = currentItem.Page_Sequence_By_FileName(RequestSpecificValues.Current_Mode.Page_By_FileName); if (page_sequence > 0) { RequestSpecificValues.Current_Mode.ViewerCode = page_sequence.ToString(); RequestSpecificValues.Current_Mode.Page = (ushort)page_sequence; } } // Get the valid viewer code RequestSpecificValues.Tracer.Add_Trace("Item_HtmlSubwriter.Add_Controls", "Getting the appropriate item viewer"); prototyper = ItemViewer_Factory.Get_Item_Viewer(currentItem, RequestSpecificValues.Current_Mode.ViewerCode); if (( prototyper != null ) && ( prototyper.Has_Access(currentItem, RequestSpecificValues.Current_User, !String.IsNullOrEmpty(restriction_message)))) pageViewer = prototyper.Create_Viewer(currentItem, RequestSpecificValues.Current_User, RequestSpecificValues.Current_Mode, RequestSpecificValues.Tracer ); else { // Since the user did not have access to THAT viewer, try to find one that he does have access to if (currentItem.UI.Viewers_By_Priority != null) { foreach (string viewerType in currentItem.UI.Viewers_By_Priority) { prototyper = ItemViewer_Factory.Get_Viewer_By_ViewType(viewerType); if ((prototyper != null) && (prototyper.Has_Access(currentItem, RequestSpecificValues.Current_User, !String.IsNullOrEmpty(restriction_message)))) { pageViewer = prototyper.Create_Viewer(currentItem, RequestSpecificValues.Current_User, RequestSpecificValues.Current_Mode, RequestSpecificValues.Tracer); break; } } } } // If execution should end, do it now if (RequestSpecificValues.Current_Mode.Request_Completed) return; // If there were NO views, then pageViewer could be null if (pageViewer == null) pageViewer = new NoViews_ItemViewer(); RequestSpecificValues.Tracer.Add_Trace("Html_MainWriter.Add_Controls", "Created " + pageViewer.GetType().ToString().Replace("SobekCM.Library.ItemViewer.Viewers.", "")); // Assign the rest of the information, if a page viewer was created behaviors = new List<HtmlSubwriter_Behaviors_Enum>(); if (pageViewer != null) { // Get the list of any special behaviors pageViewerBehaviors = pageViewer.ItemViewer_Behaviors; if ( pageViewerBehaviors != null ) behaviors.AddRange(pageViewerBehaviors); else pageViewerBehaviors = new List<HtmlSubwriter_Behaviors_Enum>(); } else { pageViewerBehaviors = new List<HtmlSubwriter_Behaviors_Enum>(); } // ALways suppress the banner and skip to main content if (behaviors == null) behaviors = new List<HtmlSubwriter_Behaviors_Enum>(); if (!behaviors.Contains(HtmlSubwriter_Behaviors_Enum.Suppress_Banner)) behaviors.Add(HtmlSubwriter_Behaviors_Enum.Suppress_Banner); if (!behaviors.Contains(HtmlSubwriter_Behaviors_Enum.Include_Skip_To_Main_Content_Link)) behaviors.Add(HtmlSubwriter_Behaviors_Enum.Include_Skip_To_Main_Content_Link); //if ((searchMatchOnThisPage) && ((PageViewer.ItemViewer_Type == ItemViewer_Type_Enum.JPEG) || (PageViewer.ItemViewer_Type == ItemViewer_Type_Enum.JPEG2000))) //{ // if (PageViewer.ItemViewer_Type == ItemViewer_Type_Enum.JPEG2000) // { // Aware_JP2_ItemViewer jp2_viewer = (Aware_JP2_ItemViewer) PageViewer; // jp2_viewer.Add_Feature("Red", "DrawEllipse", ((int) (featureXRatioLocation*jp2_viewer.Width)), ((int) (featureYRatioLocation*jp2_viewer.Height)), 800, 800); // } //} }