<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
[[MainMenu]]
[[PUM - popup menu]]
[[WinClip]]
''PUM'' is manager class, through which you can create PUM_Menu's
It is best to have only one ''PUM'' instance in your program
By destroying ''PUM'' object all menus/items created through it also destroyed.

;Example:
{{{
PUMParams := { "SelMethod" : "fill"
                ,"selTColor" : -1
                ,"selBGColor" : -1}
oPUMMenu := new PUM( PUMParams )
menu := oPUMMenu.CreateMenu()
menu.Add( "item" )
menu.Show( 100, 100 )
oPUMMenu.Destroy()
}}}

;PUM parameters. Change them through @@~SetParams()@@ method only
| !Parameter Name | !Default Value | !Possible Values | !Description |h
|''selMethod''| fill | fill<br>frame |a form of selection which appears when user hover mouse cursor over menu item|
|''selBGColor''| windows default | any RGB |background color of selected item, -1 means current color will be inverted|
|''selTColor''| windows default | any RGB |text color of selected item, -1 means current color will be inverted|
|''frameWidth''| 1 | any integer |width of select frame when selMethod = "frame"|
|''mnemonicCmd''| run | select<br>run |indicate what happens when user press any key associated with menu item as hotkey<br>"run" means the item will be runned as if user clicked it<br>"select" means it will be selected/highlighted|
|''oninit''| "" | any valid func name |name of the function, which will be runned whenever any menu is opening<br>the first parameter of the target function will be equal to "oninit"<br>the second parameter will be the PUM_Menu instance of the menu, which is openin|
|''onuninit''| "" | any valid func name |name of the function, which will be runned whenever any menu is closing<br>the first parameter of the target function will be equal to "onuninit"<br>the second parameter will be the PUM_Menu instance of the menu, which is closing|
|''onselect''| "" | any valid func name |name of the function, which will be runned whenever any item in menu is selected/hovered<br>the first parameter of the target function will be equal to "onselect"<br>the second parameter will be the PUM_Item instance of the selected item|
|''onrbutton''| "" | any valid func name |name of the function, which will be runned whenever user pressed right mouse button on item<br>the first parameter of the target function will be equal to "onrbutton"<br>the second parameter will be the PUM_Item instance of the targeted item|
|''onmbutton''| "" | any valid func name |name of the function, which will be runned whenever user pressed middle mouse button on item<br>the first parameter of the target function will be equal to "onmbutton"<br>the second parameter will be the PUM_Item instance of the targeted item|
|''onrun''| "" | any valid func name |name of the function, which will be runned whenever user run any item<br>the first parameter of the target function will be equal to "onrun"<br>the second parameter will be the PUM_Item instance of the targeted item|
|''onshow''| "" | any valid func name |name of the function, which will be runned each time PUM_Menu.Show() method called but before menu is appeared<br>the first parameter of the target function will be "onshow"<br>the second parameter will be the PUM_Menu instance of the menu which going to be shown<br>If target function exist and it returned 0, menu will not be shown|
|''onclose''| "" | any valid func name |name of the function, which will be runned each time PUM_Menu.Show() method called but after the menu is closing<br>the first parameter of the target function will be "onclose"<br>the second parameter will be the PUM_Menu instance of the menu which was shown|

;PUM Methods
| !Method Name | !In parameters | !Returns | !Description |h
|''~SetParams()''| objPUMParams | - |update required parameters of the PUM object, only parameters presented in objParams will be updated|
|''~GetMenu()''| menuHandle | PUM_Menu on success<br>0 otherwise |retrieve PUM_Menu object through it's handle|
|''~GetItemByUID()''| uid | PUM_Item on success<br>0 otherwise |retrieve PUM_Item object through it's uid ( user's custom ID )|
|''~GetItemByID()''| id | PUM_Item on success<br>0 otherwise |retrieve PUM_Item object through it's id ( can be retrieved through PUM_Item.id after the item was added to menu ) |
|''~CreateMenu()''| objMenuParams | PUM_Menu on success<br>0 otherwise |create new PUM_Menu object using given parameters|
|''Destroy()''| - | - |destroys PUM object and all menus/items created through it|
''PUM'' is an [[AutoHotkey_L|http://www.autohotkey.net/~Lexikos/AutoHotkey_L/]] module developed for creating and using customizable owner-draw popup menus
!!!!!''[[Download link ( .zip 13.3 KB )|http://www.autohotkey.net/~Deo/PUM/PUM.zip]]''

Has three classes to create and manipulate with the menus:
[[PUM]] - main manager class, creates menus
PUM_Menu - class representing popup menu
PUM_Item - class representing popup menu's item

;Usage Example:
[img[http://www.autohotkey.net/~Deo/PUM/PUM_main_pic.png]]
;Code:
{{{
#NoEnv
#Include PUM_API.ahk ;include this first
#Include PUM.ahk

; parameters of the PUM object, the manager of the menus
pumParams := { "SelMethod" : "fill"            ;item selection method, may be frame,fill
                ;~ ,"selTColor" : -1         ;selection text color
                ;~ ,"selBGColor" : -1              ;selection background color, -1 means invert current color
                ,"oninit"      : "PUM_out"      ;function which will be called when any menu going to be opened
                ,"onuninit"    : "PUM_out"     ;function which will be called when any menu going to be closing
                ,"onselect"    : "PUM_out"     ;;function which will be called when any item selected with mouse (hovered)
                ,"onrbutton"   : "PUM_out"   ;function which will be called when any item right clicked
                ,"onmbutton"   : "PUM_out"  ;function which will be called when any item clicked with middle mouse button
                ,"onrun"       : "PUM_out"      ;function which will be called when any item clicked with left mouse button
                , "onshow" : "PUM_out"      ;function which will be called before any menu shown using Show method
                , "onclose" : "Pum_out"        ;function called just before quitting from Show method
                ,mnemonicCMD : "select"}
                
;PUM_Menu parameters
menuParams1 := { "bgcolor" : 0x36311f   ;background color of the menu
            , "iconssize" : 32          ;size of icons in the menu
            , "tcolor" : 0xafc9d3 }     ;text color of the menu items
menuParams2 := { "bgcolor" : 0x1C3150
            , "iconssize" : 16
            , "tcolor" : 0xFFFFFF }

;create an instance of PUM object, it is best to have only one of such in the program
pm := new PUM( pumParams )

;creating popup menu, represented by PUM_Menu object with given parameters
menu := pm.CreateMenu( menuParams1 )

;create a three othe menus
newmenu1 := pm.CreateMenu( menuParams2 )
newmenu2 := pm.CreateMenu( menuParams2 )
newmenu3 := pm.CreateMenu( menuParams2 )

;adding submenu items to the first menu, item SubItem1 will open "newmenu1" menu, and SubItem2 will open "newmenu2"
menu.add( { "name" : "SubItem1", "submenu" : newmenu1, "icon" : "shell32.dll:8"  } )
menu.add( { "name" : "SubItem2", "submenu" : newmenu2, "icon" : "shell32.dll:8" } )
menu.Add()  ;adding separator
;adding a submenu item "SubItem3" to the "newmenu2" menu, which opens "newmenu3" menu
newmenu2.add( { "name" : "SubItem3", "icon" : "shell32.dll:8", "submenu" : newmenu3 } )

;adding five items to the first menu
loop, 5
  menu.Add( { "name" : "i&tem" A_Index
            , "bold" : 1
            , "icon" : "shell32.dll:" A_index+20 } )
;adding five items to the newmenu1
loop,5
	newmenu1.add( { "name" : "item" A_index, "icon" : "shell32.dll:3" A_index } )
;adding five items to the newmenu2
loop,5
  newmenu2.add( { "name" : "item" A_index, "icon" : "shell32.dll:4" A_index } )
;adding five items to the newmenu3
loop,5
  newmenu3.add( { "name" : "item" A_index, "icon" : "shell32.dll:2" A_index, disabled : 1 } )

;showing the first menu at the center of screen (~)
if ( item := menu.Show( A_ScreenWidth/3, A_ScreenHeight/3 ) )
	msgbox % "Choosen item: " item.name

;Destroying all menus/items created
;Use Destroy() method for the PUM_Menu object if you want to destroy specific menu
pm.Destroy()
ExitApp
return

PUM_out( msg, obj )
{
  if ( msg = "onselect" )
  {
    rect := obj.GetRECT()
    CoordMode, ToolTip, Screen
    tooltip,% "Selected: " obj.name,% rect.right,% rect.top
  }
  if ( msg ~= "oninit|onuninit|onshow|onclose" )
    tooltip % "menu " msg ": " obj.handle
  if ( msg = "onrbutton" )
    tooltip % "Right clicked: " obj.name
  if ( msg = "onmbutton" )
    tooltip % "Middle clicked: " obj.name
  if ( msg = "onrun" )
    tooltip % "Item runned: " obj.name
}
}}}
PUM_Item is class representing popup menu's item created through PUM_Menu.Add() method
An item may have associated menu as submenu

;Example:
{{{
ItemParams := { "name" : "SomeItemName"
            , "bold" : 1
            , "icon" : "shell32.dll:20" }
oPUM := new PUM()
menu := oPUM.CreateMenu( MenuParams )
item := menu.Add( ItemParams  )
menu.Show( 100, 100, "hcenter animlr" )
item.Destroy()
}}}

;~PUM_Item parameters. Change them through @@~SetParams()@@ method only
| !Parameter Name | !Default Value | !Possible Values | !Description |h
| ''issep'' | 0 | 0,1 |1 if item is separator, 0 otherwise|
| ''name'' | <item_title> | str |item's name|
| ''bold'' | 0 | 0,1 |if 1, item will be shown in bold in the menu|
| ''icon'' | 0 | str |a path to or handle of the icon, may be in form path:icon_index, any pic files|
| ''break'' | 0 | 0,1,2 |if 1 - will break menu after this item, and next one will start new column<br>if 2 - menu break will be shown in form if vertical line|
| ''submenu'' | 0 | PUM_Menu object<br>or popup menu handle |if present, item will open submenu on hover|
| ''tcolor'' | "" | RGB |text color of item, if empty, color of the parent menu will be used|
| ''bgcolor'' | "" | RGB |background color of item, if empty, color of the parent menu will be used|
| ''noPrefix'' | 0 | 0,1 |if 1, will not interpret "&" mnemonics|
| ''uid'' | "" | str |custom ID of the item, may be any string/integer|
| ''disabled'' | 0 | 0,1 |if 1, item will look disabled & and not clickable|
| ''iconUseHandle'' | 0 | 0,1 |if this flag is True, and icon handle passed through ~SetParams in "icon" field, then this handle will not be destroyed when item deleted|


;Read-only fields, do not change them:
| !Name | !Description |h
| ''alive'' |not 1 if item destroyed|
| ''id'' |inner id of the item, always unique|
| ''menu'' |PUM_Menu object, this item belongs to|
| ''assocMenu'' |PUM_Menu object, associated with that item as submenu|
| ''hFont'' |handle to the font for this item|
| ''hIcon'' |handle to the associated with item icon|
| ''hotCharCode'' | ascii code of the character to check when user press any key while menu opened |

;~PUM_Item methods:
| !Name | !In | !Out | !Description |h
| ''~SetParams()'' | objItemParams | - |updates required parameters of the item,<br>only parameters presented in objItemParams will be updated|
| ''~RemoveSubMenu()'' | - | - |detach associated with item menu, will not destroy item or menu|
| ''~DestroySubMenu()'' | - | - |destroy associated with item menu|
| ''~GetPos()'' | - | 0-based<br>Position |returns 0-based position of this item in menu|
| ''~GetRect()'' | - | object |returns RECT object representing bounding rectangle of the current menu item expressed in screen coordinates<br>object has the following fields: left,right,top,bottom|
| ''Update()'' | - | - |Updates item's parameters. Useful if you changed anything directly, without using SetParams() method|
| ''Destroy()'' | - | - |destroy item and associated menu if any|
| ''Detach()'' | - | - |destroy item and removes menu without destroying it|
| ''~GetTColor()'' | - | RGB |Returns RGB color value used by this item as text color|
| ''~GetBGColor()'' | - | RGB |Returns RGB color value used by this item as background color|
| ''~GetIconHandle()'' | - | hIcon |Returns handle to the icon used by this item to draw icon|
PUM_Menu is class representing popup menu created through [[PUM]].~CreateMenu() method
A menu can be associated with item, in which case it will have "owner" field representing PUM_Item object, it belongs to
By destroying PUM_Menu all items it contain will be also destroyed

;Example:
{{{
MenuParams := { "bgcolor" : 0x36311f
            , "iconssize" : 16
            , "tcolor" : 0xafc9d3 }
oPUM := new PUM()
menu := oPUM.CreateMenu( MenuParams )
menu.Add( "item" )
menu.Show( 100, 100, "hcenter animlr" )
menu.Destroy()
}}}

;~PUM_Menu parameters. Change them through @@~SetParams()@@ method only
| !Parameter Name | !Default Value | !Possible Values | !Description |h
| ''tcolor'' | windows default | RGB |text color of the items in the menu|
| ''bgcolor'' | windows default | RGB |RGB background color of the menu|
| ''nocolors'' | 0 | 0,1 |if 1, will be used default color for menu's background and item's text color|
| ''noicons'' | 0 | 0,1 |if 1, icons will not be shown in the menu|
| ''notext'' | 0 | 0,1 |if 1, text will not be shown for the item, should not be used with "noicons"|
| ''iconssize'' | 32 | int<br>preferably 16,32 |icon size for items|
| ''textoffset'' | 5 | int |gap between icon and item's text in pixels|
| ''maxheight'' | 0 | int |max height of the menu, scroll will be added if menu is bigger|
| ''xmargin'' | 3 | int |margin for the left and right of item boundary|
| ''ymargin'' | 3 | int |margin for the top and bottom of item boundary|
| ''textMargin'' | 5 | int |pixels amount which will be added after the text to make menu look pretty|

;Read-only fields, do not change them:
| !Name | !Description |h
| ''alive'' |not 1 if menu destroyed |
| ''handle'' |handle of the popup menu |
| ''objPUM'' |reference to the parent PUM object|
| ''owner'' |reference to the PUM_Item object, with which this menu associated if any|

;~PUM_Menu methods:
| !Name | !In | !Out | !Description |h
| ''~SetParams()'' | objMenuParams | - |updates required parameters of the menu,<br>only parameters presented in objMenuParams will be updated|
| ''Add()'' | objItemParams<br>prevItem(opt)<br>fByPos(opt) | PUM_Item on success<br>0 otherwise |adds new item to menu<br>''objItemParams'' - parameters of the new item<br>''prevItem'' - position or ID of the item, after which new one will be added<br>''fByPos'' - if 1, prevItem is 0-based position, if 0 - prevItem  is PUM_Item.id after which new item will be added<br>to add item to the end of the menu, pass -1 instead of prevItem (by default)<br>if objItemParams empty, separator will be added<br>if objItemParams - any string, item with that name will be added|
| ''~GetItems()'' | - | PUM_Item array |returns an array of items menu currently has|
| ''~EndMenu()'' | - | - |immediately close any popupmenu menu on screen|
| ''~IsMenu()'' | - | 1 or 0 |returns 1 if current menu is still exist (not destroyed)|
| ''~GetItemByPos()'' | 0-based position | PUM_Item |returns PUM_Item object representing item at specific position in the menu|
| ''Count()'' | - | number of items<br>in menu |returns current number of items in the menu|
| ''~GetTColor()'' | - | RGB |returns current text color used by this menu|
| ''~GetBGColor()'' | - | RGB |returns current background color used by this menu|


| ''Destroy()'' | - | - |destroys the menu and all its items, and all menus associated with this items|
| ''Detach()'' | - | - |detach this menu from the item, it belongs to. Will not destroy anything|
| ''Show()'' | x<br>y<br>flags | PUM_Item if any selected<br>0 otherwise |show this menu at X,Y on screen<br>if any item was selected, this function returns it's PUM_Item object<br>Flags is space delimeted list of options listed below|
                        
;Flags, used in PUM_Menu.Show():
| !Name | !Description |h
| ''context'' |will show context popup menu above one currently opened,<br>menu will not be shown if you use this flag when no other menu is shown|
| ''hcenter'' |Centers the shortcut menu horizontally relative to the coordinate specified by the x parameter.|
| ''hleft'' |(Default) Positions the shortcut menu so that its left side is aligned with the coordinate specified by the x parameter.|
| ''hright'' |Positions the shortcut menu so that its right side is aligned with the coordinate specified by the x parameter. |
| ''vbottom'' |Positions the shortcut menu so that its bottom side is aligned with the coordinate specified by the y parameter.|
| ''vtop'' |(Default) Positions the shortcut menu so that its top side is aligned with the coordinate specified by the y parameter.|
| ''vcenter'' |Centers the shortcut menu vertically relative to the coordinate specified by the y parameter.|
| ''animlr'' |Animates the menu from left to right.|
| ''animrl'' |Animates the menu from right to left.|
| ''animtb'' |Animates the menu from top to bottom.|
| ''animbt'' |Animates the menu from bottom to top.|
| ''noanim'' |Displays menu without animation.|

Help topics
.viewer th, .viewer thead td, .twtable th, .twtable thead td {
background: #157;
color: white;
}
~WinClip is an [[AutoHotkey_L|http://www.autohotkey.net/~Lexikos/AutoHotkey_L/]] class allowing you to manipulate with Windows clipboard.

It represents two sets of functions, - one is for direct clipboard manipulation (this functions can be called static), and another one is for manipulation with copy of clipboard represented in the specified format. In second case WinClip class must be instantiated, otherwise it will throw exception whenever you trying to call any of those funcitons.

Main difference between ''static'' and ''instance'' functions is that first work directly with current clipboard and not save data anywhere, but the ''instance'' functions work with the copy of clipboard data got eariler through the ''iSnap()'' method, allowing you to have several different copies of clipboard. To put instantiated copy of clip data to Windows clipboard you must call ''iRestore()''

This two types of functions diffirentiated by name, instance ones begin with ''"i"'' letter, for example: Snap(), iSnap()

[[Usage Examples|WinClip examples]]

And here is a list of functions.

| !Function | !Description |h
| Snap( ~ByRef data ) |Copies current data from Windows clipboard<br>data - variable where the data will be copied<br>returns number of bytes copied from clipboard |
| iSnap() |Same as above, but puts data to the inner buffer |
| Restore( ~ByRef data ) |Puts clip data got earlier through ''Snap()'' method back to Windows clipboard<br>data - variable containing clipboard data which will be placed on Windows clipboard<br>returns number of bytes writen to clipboard |
| iRestore() |Same as above, but gets data from inner buffer saved earlier through iSnap() |
| Clear() |Clears current Windows clipboard, e.g. removes all data from it |
| iClear() |Clears inner clipboard buffer, does not touch Windows clipboard in any way |
| ~GetFormats() |Returns list of all formats Windows clipboard currently has in form of array:<br>see below for example |
| iGetFormats() |Same as above, but parses currently kept inner buffer of clipboard data |
| Save( filePath ) |Saves current clipboard data into file<br>filePath - path to file<br>returns number of bytes writen |
| iSave( filePath ) |Same as above, but saves data from inner buffer |
| Load( filePath ) |Loads data from file directly to Windows clipboard<br>filePath - path to file<br>returns number of bytes read |
| iLoad( filePath ) |Same as above, but loads data into inner buffer |
| Copy() |Clear current Windows clipboard, then send ctrl+c to the active window |
| iCopy() |Same as above, but copies new data into inner buffer without changing current Win clipboard content |
| Paste( plainText = "" ) |Just sends ctrl+v into active window<br>plainText - if presented and not blank, it's content will be pasted instead, without changing original clipboard data |
| iPaste() |Copies clip data from inner buffer to clipboard and sends ctrl+v to active window |
| ~GetFiles() |Returns list of files Windows clipboard has for copying delimited with ''`n''.<br>This function will return anything only if you previously copied some files from explorer window |
| iGetFiles() |Same as above regarding inner clipboard buffer |
| ~SetFiles( files, isCut = 0 ) |Sets the list of files on clipboard which can be used in paste operations later through explorer windows<br>files - "`n" delimited list of files<br>isCut - if 1, on paste files will be cutted from original place |
| iSetFiles( files, isCut = 0 ) |Same as above regarding inner clipboard buffer |
| ~AppendFiles( files, isCut = 0 ) |Same as ~SetFiles() but appends list of files to the end instead of replacing them. All dublicate paths will be removed automatically |
| iAppendFiles( files, isCut = 0 ) |Same as above regarding inner clipboard buffer |
| ~GetBitmap() |Returns hBitmap if clipboard currenly has any picture on it. See exmaple below about how to use that |
| iGetBitmap() |Same as above regarding inner clipboard buffer |
| ~SetBitmap( bitmap ) |Sets bitmap on the clipboard<br>bitmap - should be either full path to picture file or hBitmap<br>Returns number of bytes finilazed clipboard has on success, or 0 otherwise<br>Note: original clipboard data will not be cleared, so some applications may not "see" bitmap on clipboard if there is another format ( EXCEL for example ). Clear the clipboard data manually before inserting bitmap if you need so. |
| iSetBitmap( bitmap ) |Same as above regarding inner clipboard buffer |
| ~GetText() |Returns plain text from current Windows clipboard |
| iGetText() |Same as above regarding inner buffer |
| ~SetText( textData ) |Sets text to Windows clipboard. This is not repleace all data on the clipboard, but only specific format<br>textData - any string<br>returns number of bytes placed on clipboard. This includes ALL data clipboard has, not only the text part |
| iSetText( textData ) |Same as above but works with inner clipboard buffer without changing the real Windows clipboard |
| ~AppendText( textData ) |Same as ~SetText() but instead of replacing, it appends text to one clipboard already has |
| iAppendText( textData ) |Same as above but for inner buffer |
| ~GetHTML() |Returns raw html formatted data if Windows clipboard has one |
| iGetHTML() |Same as above regarding inner buffer |
| ~SetHTML( html, source = "" ) |Puts data on clipboard in HTML format<br>''html'' - data to place on clipboard<br>''source'' - source URL to specify for this data<br>Returns number of bytes placed on clipboard |
| iSetHTML( html, source = "" ) |Same as above regarding inner buffer |
| iGetData( ~ByRef Data ) |Copy data from inner clipboard<br>Data - variable where clip data will be copied<br>Returns number of bytes clip were copied<br>There is NO such static method |
| iSetData( ~ByRef Data ) |Puts data to inner clipboard buffer.<br>Data - buffer containing data previously got from iGetData |
| ~IsEmpty() |Returns True if current Windows clipboard empty |
| iIsEmpty() |Returns True if inner clipboard buffer has no data (empty) |
| ~HasFormat( fmt ) |Returns non-zero if specified format available on clipboard<br>''fmt'' - named or numeric format to check |
| iHasFormat( fmt ) |Same as above for inner clipboard buffer |
| ~SaveBitmap( filePath, format )|Saves bitmap data currently on clipboard to file<br>''filePath'' - full path to file where data will be saved<br>''format'' - should be one of the following: bmp,jpeg,gif,tiff,png |
| iSaveBitmap( filePath, format )|Same as above for inner buffer |

Check the usage examples for all of this functions [[here|WinClip examples]]
Consider to use following header for all this examples:
{{{
#Include WinClipAPI.ahk ;include this first
#Include WinClip.ahk
}}}

''Snap( ~ByRef data )''
{{{
clipSize := WinClip.Snap( clipData )

;---------- iSnap()
wc := new WinClip
clipSize := wc.iSnap() ;copies clip data into inner buffer for later using
}}}
''Restore( ~ByRef data )''
{{{
clipSize := WinClip.Snap( clipData )
bytesRestored := WinClip.Restore( clipData )

;---------- iRestore()
wc := new WinClip
clipSize := wc.iSnap() ;copies clip data into inner buffer for later using
bytesRestored := wc.iRestore() ;restoring data back to clipboard
}}}
''Clear()''
{{{
clipSize := WinClip.Snap( clipData )
WinClip.Clear() ;clipboard is empty after this point
bytesRestored := WinClip.Restore( clipData )

;---------- iClear()
wc := new WinClip
clipSize := wc.iSnap() ;copies clip data into inner buffer for later using
wc.iClear() ;inner buffer will be emptied after this point
bytesRestored := wc.iRestore() ;nothing will be placed back to clipboard, old data will be kept
}}}
''~GetFormats()''
{{{
objFormats := WinClip.GetFormats()
list =
for nFmt, params in objFormats
{
; format_number : format_name : data_size : data_size again
; the "buffer" is an object member containing actual format data
  list .= "`n" nFmt " : " params.name " : " params.size " : " params.GetCapacity( "buffer " )
}
msgbox % list

;---------- iGetFormats()
wc := new WinClip
clipSize := wc.iSnap() ;copies clip data into inner buffer for later using
objFormats := wc.iGetFormats()
list =
for nFmt, params in objFormats
{
; format_number : format_name : data_size : data_size again
; the "buffer" is an object member containing actual format data
  list .= "`n" nFmt " : " params.name " : " params.size " : " params.GetCapacity( "buffer " )
}
msgbox % list
}}}
''Save( filePath )''
{{{
WinClip.Save( "clip.txt" )

;---------- iSave( filePath )
wc := new WinClip
clipSize := wc.iSnap() ;copies clip data into inner buffer for later using
wc.iSave( "clip.txt" )
}}}
''Load( filePath )''
{{{
WinClip.Load( "clip.txt" )

;---------- iLoad( filePath )
wc := new WinClip
wc.iLoad( "clip.txt" ) ;copying data from file into inner buffer
wc.iRestore() ;puts data from inner buffer to clipboard
}}}
''Copy()''
{{{
WinClip.Copy()

;---------- iCopy()
wc := new WinClip
wc.iCopy() ;copying data to inner buffer without changing actual clipboard data
}}}
''Paste()''
{{{
WinClip.Paste()
;if you want just paste some text quickly
WinClip.Paste( "SomeRawText" )

;---------- iPaste()
wc := new WinClip
clipSize := wc.iSnap() ;copies clip data into inner buffer for later using
wc.Clear() ;clearing win clipboard
wc.iPaste()
bytesRestored := wc.iRestore()
}}}
''~SetText( textData )''
{{{
WinClip.SetText( "hey, you!" )

;---------- iSetText( textData )
wc := new WinClip
wc.iSetText( "hey, you!" )
wc.iRestore()
}}}
''~AppendText( textData )''
{{{
WinClip.SetText( "hey, you!" )
WinClip.AppendText( "`nand you!" )

;---------- iAppendText( textData )
wc := new WinClip
wc.iSetText( "hey, you!" )
wc.iAppendText( "`nand you!" )
wc.iRestore()
}}}
''~GetFiles()''
{{{
;copy some files from explorer window first
filesList := WinClip.GetFiles()

;---------- iGetFiles()
wc := new WinClip
;copy some files from explorer window first
wc.iSnap()
filesList := wc.iGetFiles()
}}}
''~SetFiles()''
{{{
WinClip.SetFiles( "C:\file1.txt`nC:\file2.txt" )
;try to paste this faile in any explorer window now
;---------- iSetFiles
wc := new WinClip
wc.iSetFiles( "C:\file1.txt`nC:\file2.txt" )
wc.iRestore()
}}}
''~AppendFiles()''
{{{
WinClip.SetFiles( "C:\file1.txt`nC:\file2.txt" )
WinClip.AppendFiles( "C:\file3.txt`nC:\file4.txt" )
;all four files should be on clipboard now
;---------- iAppendFiles
wc := new WinClip
wc.iSetFiles( "C:\file1.txt`nC:\file2.txt" )
wc.iAppendFiles( "C:\file3.txt`nC:\file4.txt" )
wc.iRestore()
}}}
''~GetBitmap()''
{{{
;copy any picture first
hBitmap := WinClip.GetBitmap()
Gui, Add, Picture,% "hwndPicHwnd +" SS_BITMAP := 0xE
SendMessage,% STM_SETIMAGE := 0x0172,% IMAGE_BITMAP := 0,% hBitmap,, ahk_id %PicHwnd%
DllCall("DeleteObject", "Ptr", hBitmap )
Gui, Show, w1000 h700

;------- iGetBitmap()
;copy any picture first
wc := new WinClip
wc.iSnap()
hBitmap := wc.iGetBitmap()
Gui, Add, Picture,% "hwndPicHwnd +" SS_BITMAP := 0xE
SendMessage,% STM_SETIMAGE := 0x0172,% IMAGE_BITMAP := 0,% hBitmap,, ahk_id %PicHwnd%
DllCall("DeleteObject", "Ptr", hBitmap )
Gui, Show, w1000 h700
}}}
''~SetBitmap()''
{{{
WinClip.SetBitmap( "C:\somepicture.jpg" )
;it should be on clipboard right now

;--------- iSetBitmap()
wc := new WinClip
wc.iSetBitmap( "C:\somepicture.jpg" )
wc.iRestore
;it should be on clipboard right now
}}}
''~GetText()''
{{{
plainText := WinClip.GetText()

;------- iGetText()
wc := new WinClip
wc.iSnap()
plainText := wc.iGetText()
}}}
''~GetHTML()''
{{{
;copy something from browser first
rawHTML := WinClip.GetHTML()

;---- iGetHTML()
;copy something from browser first
wc := new WinClip
wc.iSnap()
rawHTML := wc.iGetHTML()
}}}