###############################################################################
# Copyright (c) 2003, 2006 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# 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
	
	






