###############################################################################
# Copyright (c) 2003, 2006 IBM Corporation and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
# https://www.eclipse.org/legal/epl-2.0/
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
#     IBM Corporation - initial API and implementation
###############################################################################
! Alternative style file for SWT presentation

! Theme property should be used to indicate that the file is part
! of the intro theme (new in 3.2). When in theme, relative images are resolved
! relative to the property file location. Otherwise (false),
! images are resolved relative to the contributing bundle. This 
! is the backward-compatible behavior.
	theme = true/false

! General properties that can only be specified in a shared style 
! file because they apply to the whole presentation.
	! Background color of all presentation 
	! ------------------------------------
	bg = #rrggbb hex

	! Color for presentation title 
	! -----------------------------
	title.fg = #rrggbb hex

	! Backgournd Image for presentation title  
	! ----------------------------------------
	title.image = <file name>
	title.image.repeat = true/false
	
	! Flag to display the Home Page using custom layout. Default is true.
	! ----------------------------------------
	home-page-custom-layout = true/false

	
	

! Home Page settings
! ------------------
	! The home page layout supports all customization that is supported by a Page,
	! except what is specified under Subtitle, Description and Fonts. 
	
	! In addition, the following customizations applies only to home page:
	! Color for home page link description (default is UI forms TITLE color, which is 
	! a system color) 
	! -------------------------------------
	<homePageId>.hover-text.fg = #rrggbb hex


	! Default icons for links in the navigation bar which is added to each page
	! -------------------------------------------------------------------------
	<homePageId>.small-link-icon = <relative file name>
	<homePageId>.small-hover-icon = <relative file name>

	! Icon for a given link in the Home Page, and its corresponding link in 
	! the navigation bar 
	! ----------------------------------------------------------------------
	<homePageId>.<linkId>.link-icon = <relative file name>
	<homePageId>.<linkId>.hover-icon = <relative file name>
	<homePageId>.<linkId>.small-link-icon = <relative file name>
	<homePageId>.<linkId>.small-hover-icon = <relative file name>




! Page settings
! -------------
! Note: in any of the page settings, if the <pageId> is ommitted and the 
! property starts with a ".", then this property applies to this whole page,
! and to any page that inherits the properties of this page. So in effect,
! this property becomes like a shared property.
!
! A short form of the property that uses element id can be used:
! <pageId.<elementId>.property = value
! Use this for elements that do not have fixed path (when late target
! path resolution is used).
 
	! Flag to display link description in a given page. Default is true.
	<pageId>.show-link-description = true/false
	.show-link-description = true/false
	
	! Flag to display Root page navigation links in a given page. Default is true.
	<pageId>.show-home-page-navigation = true/false
	.show-home-page-navigation = true/false

	! Layout:
	! -------
	! Number of columns in this page or group.
	<pageId>.layout.ncolumns = <integer>
	<pageId>.<path_to_group>.layout.ncolumns = <integer>
	
	! Equal width of columns
	<pageId>.<path_to_group>.layout.equalWidth = true/false	
	
	! vertical/horizantal spacing of all objects in a given page or group.
	<pageId>.<path_to_group>.layout.vspacing = <integer>
	<pageId>.<path_to_group>.layout.hspacing = <integer>
	
	! Number of columns/rows an element spans in its group or page.
	<pageId>.<path_to_element>.layout.colspan = <integer>
	<pageId>.<path_to_element>.layout.rowspan = <integer>

	
	! Icons:
	! ------
	! default icon/hover icon used for all links in the page.
	<pageId>.link-icon = <relative file name>
	<pageId>.hover-icon = <relative file name>
	
	! icon/hover icon for specific link/Image link.
	<pageId>.<path_to_link>.link-icon = <relative file name>
	<pageId>.<path_to_link>.hover-icon = <relative file name>
	

	! Sub Title:
	! ----------
	! The path of the child Text element that will be used as subtitle of this page.
	! (Can only be a child Text element)
	<pageId>.subtitle-id = <path to subtitle child>
	
	! The style id of the direct child Text element that will be used as subtitle of any page. 
	! It would be used if a specific id has not been specified at the page. 
	! (Can only be a child Text element)
	subtitle-style-id = <style id of child subtitle Text element>


	! Description:
	! ------------
	! The path of the child Text element that will be used as description of this page. 
	! (Can only be a child Text element)
	<pageId>.description-id = <path to child description Text element>

	! The path of the child Text element that will be used as description of this group. 
	! (Can only be a child Text element)
	<pageId>.<path_to_group>.description-id = <path to child description Text element>
	
	! The style id of the direct child Text element that will be used as description of any 
	! page or any group. It would be used if a specific id has not been specified at the page 
	! or group level. (Can only be a child Text element)
	description-style-id = <style id of child description Text element>

	
	! Page elements Font:
	! -------------------
	! Set the color for a specific Text or Group label. If applied to a group the label of 
	! the group gets the color and not the description text. To color description text, 
	! set its color explicitly.
	! note: it is not recommended to set the color of a link because it changes the 
	! theme of the link colors.
	<pageId>.<path_to_element>.font.fg = #rrggbb hex
	
	! make a Text element bold. Note that if the Text string itself has any formatting
	! tags like <b> and <li> then this bold property is ignored.
	<pageId>.<path_to_text>.font.bold = true/false
	
	! The style id that will make any Text element bold. It would be used if that Text element 
	! does not have a bold property explicitly set.
	bold-style-id = <style id of child subtitle Text element>
	
	! Color for separator elements:
	<pageId>.separator.fg = #rrggbb hex
	
	






