├── Demo ├── Photos │ ├── ak.png │ ├── cp.png │ ├── cr.png │ ├── es.png │ ├── gab.png │ ├── gp.png │ ├── jp.png │ ├── jr.png │ ├── mb.png │ ├── np.png │ ├── ns.png │ ├── sj.png │ └── sp.png ├── AnimatedGifs │ ├── cd1.gif │ ├── cool3.gif │ ├── eye2.gif │ ├── net2.gif │ ├── new5.gif │ ├── 3dlink1.gif │ ├── circum.gif │ ├── enter3.gif │ ├── envelope.gif │ └── exclame.gif ├── Resources │ ├── coffee.jpg │ ├── down16.png │ ├── fav32.png │ ├── star16.png │ ├── tick16.png │ ├── folder16.png │ ├── limeleaf.png │ ├── movie16.png │ ├── music16.png │ ├── redback1.png │ ├── redbull.png │ ├── goldstar3.png │ ├── goldstart-32.png │ └── Espresso Maker.ico └── AssemblyInfo.cs ├── docs ├── .static │ ├── Thumbs.db │ ├── icon.ico │ ├── faq-icon.png │ ├── flicker.swf │ ├── blog-icon.png │ ├── blog1-icon.png │ ├── blog2-icon.png │ ├── blog3-icon.png │ ├── blog4-icon.png │ ├── blog5-icon.png │ ├── blog6-icon.png │ ├── blog7-icon.png │ ├── blog8-icon.png │ ├── index-icon.png │ ├── download-icon.png │ ├── dragdrop-icon.png │ ├── features-icon.png │ ├── flicker-gone.swf │ ├── overlays-icon.png │ ├── recipes-icon.png │ ├── samples-icon.png │ ├── search-icon.png │ ├── whatsnew-icon.png │ ├── animations-icon.png │ ├── changelog-icon.png │ ├── expressInstall.swf │ ├── filtering-icon.png │ ├── orange-800x1600.png │ ├── ownerDraw-icon.png │ ├── cellEditing-icon.png │ ├── dark-blue-800x1600.png │ ├── groupListView-icon.png │ ├── majorClasses-icon.png │ ├── objectlistview32.png │ ├── gettingStarted-icon.png │ ├── light-blue-800x1600.png │ ├── listCtrlPrinter-icon.png │ ├── dialog2-blue-800x1600.png │ ├── sparkle-garish-example.swf │ ├── sparkle-simple-example.swf │ ├── objectListView-animation.swf │ ├── objectListView-simple-animation.swf │ ├── master.css │ ├── reset.css │ ├── global.css │ ├── dialog.css │ ├── initial.css │ ├── sparkle-animations.html │ ├── structure.css │ └── objectlistview-animations.html ├── ClassDiagram.dia ├── images │ ├── coffee.jpg │ ├── icecream3.jpg │ ├── limeleaf.jpg │ ├── overlay.png │ ├── redbull.jpg │ ├── smoothie2.jpg │ ├── task-list.png │ ├── dtlv-table.png │ ├── hyperlinks.png │ ├── right-arrow.gif │ ├── right-arrow.png │ ├── setbkimage.png │ ├── setbkimage2.png │ ├── ClassDiagram.png │ ├── ObjectListView.jpg │ ├── bar-renderer.png │ ├── blog-badscroll.png │ ├── blog2-balloon1.png │ ├── blog2-balloon2.png │ ├── blog4-nodrop.png │ ├── blog8-allgrey.png │ ├── chili-smoothie.jpg │ ├── dialog2-blue.gif │ ├── dragdrop-tlv.png │ ├── dtlv-hierarchy.png │ ├── flags-renderer.png │ ├── image-renderer.png │ ├── printpreview.png │ ├── treelistview.png │ ├── blog-setbkimage.png │ ├── blog3-listview1.png │ ├── blog3-listview1a.png │ ├── blog3-listview2.png │ ├── blog3-listview3.png │ ├── blog3-listview4.png │ ├── blog4-basicform.png │ ├── blog4-emptyform.png │ ├── chili-smoothie2.jpg │ ├── dragdrop-infomsg.png │ ├── excel-filtering.png │ ├── fancy-screenshot.png │ ├── foobar-lookalike.png │ ├── generator-better.png │ ├── generator-boring.png │ ├── group-formatting.png │ ├── images-renderer.png │ ├── orange-800x1600.png │ ├── task-list-small.png │ ├── tileview-example.png │ ├── vertical-header.png │ ├── ReportModernExample.jpg │ ├── blog-overlayimage.png │ ├── blog4-dropbetween.png │ ├── blog4-infomessage.png │ ├── cell-editing-border.png │ ├── dark-blue-800x1600.png │ ├── decorations-example.png │ ├── dragdrop-example1.png │ ├── dragdrop-tlv-small.png │ ├── fancy-screenshot2.png │ ├── fancy-screenshot3.png │ ├── header-formatting.png │ ├── header-with-image.png │ ├── light-blue-800x1600.png │ ├── multiimage-renderer.png │ ├── ownerdrawn-example1.png │ ├── tileview-ownerdrawn.png │ ├── ModelToScreenProcess.png │ ├── blog8-funnyformatting.png │ ├── dialog2-blue-800x1600.png │ ├── dragdrop-dropbetween.png │ ├── dragdrop-dropsubitem.png │ ├── emptylistmsg-example.png │ ├── mappedimage-renderer.png │ ├── ClassDiagram-VirtualList.png │ ├── column-selection-inline.png │ ├── column-selection-submenu.png │ ├── dragdrop-dropbackground.png │ ├── dragdrop-feedbackcolor.png │ ├── foobar-lookalike-small.png │ ├── gettingstarted-example1.png │ ├── gettingstarted-example2.png │ ├── gettingstarted-example3.png │ ├── gettingstarted-example4.png │ ├── gettingstarted-example5.png │ ├── gettingstarted-example6.png │ ├── text-filter-highlighting.png │ ├── hierarchical-checkboxes-1.png │ ├── blog8-greytext-colourimages.png │ └── column-selection-modaldialog.png ├── ClassDiagram-VirtualList.dia ├── Help │ └── ObjectListView-Documentation.chm ├── majorClasses.rst ├── blog.rst ├── download.rst ├── .templates │ └── layout.html ├── blog7.rst ├── blog2.rst ├── overlays.rst ├── samples.rst └── Sitemap.xml ├── SparkleLibrary ├── keyfile.pfx ├── sparkle-keyfile.snk ├── Properties │ └── AssemblyInfo.cs ├── Animation │ ├── Events.cs │ └── Animateable.cs ├── SparkleLibrary2010.csproj └── SparkleLibrary.csproj ├── ObjectListView ├── olv-keyfile.snk ├── Resources │ ├── coffee.jpg │ ├── filter.png │ ├── clear-filter.png │ ├── filter-icons3.png │ ├── sort-ascending.png │ └── sort-descending.png ├── CustomDictionary.xml ├── Properties │ ├── AssemblyInfo.cs │ └── Resources.Designer.cs ├── Filtering │ ├── ICluster.cs │ ├── ClustersFromGroupsStrategy.cs │ ├── IClusteringStrategy.cs │ └── Cluster.cs ├── ObjectListView.shfb ├── Implementation │ ├── NullableDictionary.cs │ └── Enums.cs └── FastDataListView.cs ├── ListViewPrinter ├── lvp-keyfile.snk ├── Properties │ └── AssemblyInfo.cs ├── ListViewPrinter2005.csproj ├── ListViewPrinter2010.csproj ├── ListViewPrinter2012.csproj └── ListViewPrinter2008.csproj ├── ListViewPrinterDemo ├── Resources │ └── compass16.png ├── Properties │ ├── Settings.settings │ ├── Settings.Designer.cs │ ├── AssemblyInfo.cs │ └── Resources.Designer.cs ├── Program.cs └── ListViewPrinterDemo2005.csproj ├── Tests ├── packages.config ├── OLVTests.nunit ├── MainForm.cs ├── SetupTestSuite.cs ├── AssemblyInfo.cs ├── TestAdornments.cs ├── TestTypedListView.cs ├── Tests2005.csproj ├── TestDateClusteringStrategy.cs └── TestFlagClusteringStrategy.cs ├── ObjectListView.shfb ├── ObjectListView2005.sln ├── ObjectListView2008.sln ├── ObjectListView2010.sln └── ObjectListView2012.sln /Demo/Photos/ak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/ak.png -------------------------------------------------------------------------------- /Demo/Photos/cp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/cp.png -------------------------------------------------------------------------------- /Demo/Photos/cr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/cr.png -------------------------------------------------------------------------------- /Demo/Photos/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/es.png -------------------------------------------------------------------------------- /Demo/Photos/gab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/gab.png -------------------------------------------------------------------------------- /Demo/Photos/gp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/gp.png -------------------------------------------------------------------------------- /Demo/Photos/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/jp.png -------------------------------------------------------------------------------- /Demo/Photos/jr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/jr.png -------------------------------------------------------------------------------- /Demo/Photos/mb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/mb.png -------------------------------------------------------------------------------- /Demo/Photos/np.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/np.png -------------------------------------------------------------------------------- /Demo/Photos/ns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/ns.png -------------------------------------------------------------------------------- /Demo/Photos/sj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/sj.png -------------------------------------------------------------------------------- /Demo/Photos/sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Photos/sp.png -------------------------------------------------------------------------------- /docs/.static/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/Thumbs.db -------------------------------------------------------------------------------- /docs/.static/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/icon.ico -------------------------------------------------------------------------------- /docs/ClassDiagram.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/ClassDiagram.dia -------------------------------------------------------------------------------- /docs/images/coffee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/coffee.jpg -------------------------------------------------------------------------------- /Demo/AnimatedGifs/cd1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/cd1.gif -------------------------------------------------------------------------------- /Demo/Resources/coffee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/coffee.jpg -------------------------------------------------------------------------------- /Demo/Resources/down16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/down16.png -------------------------------------------------------------------------------- /Demo/Resources/fav32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/fav32.png -------------------------------------------------------------------------------- /Demo/Resources/star16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/star16.png -------------------------------------------------------------------------------- /Demo/Resources/tick16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/tick16.png -------------------------------------------------------------------------------- /docs/.static/faq-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/faq-icon.png -------------------------------------------------------------------------------- /docs/.static/flicker.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/flicker.swf -------------------------------------------------------------------------------- /docs/images/icecream3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/icecream3.jpg -------------------------------------------------------------------------------- /docs/images/limeleaf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/limeleaf.jpg -------------------------------------------------------------------------------- /docs/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/overlay.png -------------------------------------------------------------------------------- /docs/images/redbull.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/redbull.jpg -------------------------------------------------------------------------------- /docs/images/smoothie2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/smoothie2.jpg -------------------------------------------------------------------------------- /docs/images/task-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/task-list.png -------------------------------------------------------------------------------- /Demo/AnimatedGifs/cool3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/cool3.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/eye2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/eye2.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/net2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/net2.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/new5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/new5.gif -------------------------------------------------------------------------------- /Demo/Resources/folder16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/folder16.png -------------------------------------------------------------------------------- /Demo/Resources/limeleaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/limeleaf.png -------------------------------------------------------------------------------- /Demo/Resources/movie16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/movie16.png -------------------------------------------------------------------------------- /Demo/Resources/music16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/music16.png -------------------------------------------------------------------------------- /Demo/Resources/redback1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/redback1.png -------------------------------------------------------------------------------- /Demo/Resources/redbull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/redbull.png -------------------------------------------------------------------------------- /SparkleLibrary/keyfile.pfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/SparkleLibrary/keyfile.pfx -------------------------------------------------------------------------------- /docs/.static/blog-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog-icon.png -------------------------------------------------------------------------------- /docs/.static/blog1-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog1-icon.png -------------------------------------------------------------------------------- /docs/.static/blog2-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog2-icon.png -------------------------------------------------------------------------------- /docs/.static/blog3-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog3-icon.png -------------------------------------------------------------------------------- /docs/.static/blog4-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog4-icon.png -------------------------------------------------------------------------------- /docs/.static/blog5-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog5-icon.png -------------------------------------------------------------------------------- /docs/.static/blog6-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog6-icon.png -------------------------------------------------------------------------------- /docs/.static/blog7-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog7-icon.png -------------------------------------------------------------------------------- /docs/.static/blog8-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/blog8-icon.png -------------------------------------------------------------------------------- /docs/.static/index-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/index-icon.png -------------------------------------------------------------------------------- /docs/images/dtlv-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dtlv-table.png -------------------------------------------------------------------------------- /docs/images/hyperlinks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/hyperlinks.png -------------------------------------------------------------------------------- /docs/images/right-arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/right-arrow.gif -------------------------------------------------------------------------------- /docs/images/right-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/right-arrow.png -------------------------------------------------------------------------------- /docs/images/setbkimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/setbkimage.png -------------------------------------------------------------------------------- /docs/images/setbkimage2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/setbkimage2.png -------------------------------------------------------------------------------- /Demo/AnimatedGifs/3dlink1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/3dlink1.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/circum.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/circum.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/enter3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/enter3.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/envelope.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/envelope.gif -------------------------------------------------------------------------------- /Demo/AnimatedGifs/exclame.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/AnimatedGifs/exclame.gif -------------------------------------------------------------------------------- /Demo/Resources/goldstar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/goldstar3.png -------------------------------------------------------------------------------- /ObjectListView/olv-keyfile.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/olv-keyfile.snk -------------------------------------------------------------------------------- /docs/.static/download-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/download-icon.png -------------------------------------------------------------------------------- /docs/.static/dragdrop-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/dragdrop-icon.png -------------------------------------------------------------------------------- /docs/.static/features-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/features-icon.png -------------------------------------------------------------------------------- /docs/.static/flicker-gone.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/flicker-gone.swf -------------------------------------------------------------------------------- /docs/.static/overlays-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/overlays-icon.png -------------------------------------------------------------------------------- /docs/.static/recipes-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/recipes-icon.png -------------------------------------------------------------------------------- /docs/.static/samples-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/samples-icon.png -------------------------------------------------------------------------------- /docs/.static/search-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/search-icon.png -------------------------------------------------------------------------------- /docs/.static/whatsnew-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/whatsnew-icon.png -------------------------------------------------------------------------------- /docs/images/ClassDiagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/ClassDiagram.png -------------------------------------------------------------------------------- /docs/images/ObjectListView.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/ObjectListView.jpg -------------------------------------------------------------------------------- /docs/images/bar-renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/bar-renderer.png -------------------------------------------------------------------------------- /docs/images/blog-badscroll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog-badscroll.png -------------------------------------------------------------------------------- /docs/images/blog2-balloon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog2-balloon1.png -------------------------------------------------------------------------------- /docs/images/blog2-balloon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog2-balloon2.png -------------------------------------------------------------------------------- /docs/images/blog4-nodrop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog4-nodrop.png -------------------------------------------------------------------------------- /docs/images/blog8-allgrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog8-allgrey.png -------------------------------------------------------------------------------- /docs/images/chili-smoothie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/chili-smoothie.jpg -------------------------------------------------------------------------------- /docs/images/dialog2-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dialog2-blue.gif -------------------------------------------------------------------------------- /docs/images/dragdrop-tlv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-tlv.png -------------------------------------------------------------------------------- /docs/images/dtlv-hierarchy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dtlv-hierarchy.png -------------------------------------------------------------------------------- /docs/images/flags-renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/flags-renderer.png -------------------------------------------------------------------------------- /docs/images/image-renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/image-renderer.png -------------------------------------------------------------------------------- /docs/images/printpreview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/printpreview.png -------------------------------------------------------------------------------- /docs/images/treelistview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/treelistview.png -------------------------------------------------------------------------------- /Demo/Resources/goldstart-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/goldstart-32.png -------------------------------------------------------------------------------- /ListViewPrinter/lvp-keyfile.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ListViewPrinter/lvp-keyfile.snk -------------------------------------------------------------------------------- /docs/.static/animations-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/animations-icon.png -------------------------------------------------------------------------------- /docs/.static/changelog-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/changelog-icon.png -------------------------------------------------------------------------------- /docs/.static/expressInstall.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/expressInstall.swf -------------------------------------------------------------------------------- /docs/.static/filtering-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/filtering-icon.png -------------------------------------------------------------------------------- /docs/.static/orange-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/orange-800x1600.png -------------------------------------------------------------------------------- /docs/.static/ownerDraw-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/ownerDraw-icon.png -------------------------------------------------------------------------------- /docs/images/blog-setbkimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog-setbkimage.png -------------------------------------------------------------------------------- /docs/images/blog3-listview1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog3-listview1.png -------------------------------------------------------------------------------- /docs/images/blog3-listview1a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog3-listview1a.png -------------------------------------------------------------------------------- /docs/images/blog3-listview2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog3-listview2.png -------------------------------------------------------------------------------- /docs/images/blog3-listview3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog3-listview3.png -------------------------------------------------------------------------------- /docs/images/blog3-listview4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog3-listview4.png -------------------------------------------------------------------------------- /docs/images/blog4-basicform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog4-basicform.png -------------------------------------------------------------------------------- /docs/images/blog4-emptyform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog4-emptyform.png -------------------------------------------------------------------------------- /docs/images/chili-smoothie2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/chili-smoothie2.jpg -------------------------------------------------------------------------------- /docs/images/dragdrop-infomsg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-infomsg.png -------------------------------------------------------------------------------- /docs/images/excel-filtering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/excel-filtering.png -------------------------------------------------------------------------------- /docs/images/fancy-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/fancy-screenshot.png -------------------------------------------------------------------------------- /docs/images/foobar-lookalike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/foobar-lookalike.png -------------------------------------------------------------------------------- /docs/images/generator-better.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/generator-better.png -------------------------------------------------------------------------------- /docs/images/generator-boring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/generator-boring.png -------------------------------------------------------------------------------- /docs/images/group-formatting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/group-formatting.png -------------------------------------------------------------------------------- /docs/images/images-renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/images-renderer.png -------------------------------------------------------------------------------- /docs/images/orange-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/orange-800x1600.png -------------------------------------------------------------------------------- /docs/images/task-list-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/task-list-small.png -------------------------------------------------------------------------------- /docs/images/tileview-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/tileview-example.png -------------------------------------------------------------------------------- /docs/images/vertical-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/vertical-header.png -------------------------------------------------------------------------------- /Demo/Resources/Espresso Maker.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/Demo/Resources/Espresso Maker.ico -------------------------------------------------------------------------------- /ObjectListView/Resources/coffee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/Resources/coffee.jpg -------------------------------------------------------------------------------- /ObjectListView/Resources/filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/Resources/filter.png -------------------------------------------------------------------------------- /SparkleLibrary/sparkle-keyfile.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/SparkleLibrary/sparkle-keyfile.snk -------------------------------------------------------------------------------- /docs/.static/cellEditing-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/cellEditing-icon.png -------------------------------------------------------------------------------- /docs/.static/dark-blue-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/dark-blue-800x1600.png -------------------------------------------------------------------------------- /docs/.static/groupListView-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/groupListView-icon.png -------------------------------------------------------------------------------- /docs/.static/majorClasses-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/majorClasses-icon.png -------------------------------------------------------------------------------- /docs/.static/objectlistview32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/objectlistview32.png -------------------------------------------------------------------------------- /docs/ClassDiagram-VirtualList.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/ClassDiagram-VirtualList.dia -------------------------------------------------------------------------------- /docs/images/ReportModernExample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/ReportModernExample.jpg -------------------------------------------------------------------------------- /docs/images/blog-overlayimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog-overlayimage.png -------------------------------------------------------------------------------- /docs/images/blog4-dropbetween.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog4-dropbetween.png -------------------------------------------------------------------------------- /docs/images/blog4-infomessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog4-infomessage.png -------------------------------------------------------------------------------- /docs/images/cell-editing-border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/cell-editing-border.png -------------------------------------------------------------------------------- /docs/images/dark-blue-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dark-blue-800x1600.png -------------------------------------------------------------------------------- /docs/images/decorations-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/decorations-example.png -------------------------------------------------------------------------------- /docs/images/dragdrop-example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-example1.png -------------------------------------------------------------------------------- /docs/images/dragdrop-tlv-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-tlv-small.png -------------------------------------------------------------------------------- /docs/images/fancy-screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/fancy-screenshot2.png -------------------------------------------------------------------------------- /docs/images/fancy-screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/fancy-screenshot3.png -------------------------------------------------------------------------------- /docs/images/header-formatting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/header-formatting.png -------------------------------------------------------------------------------- /docs/images/header-with-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/header-with-image.png -------------------------------------------------------------------------------- /docs/images/light-blue-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/light-blue-800x1600.png -------------------------------------------------------------------------------- /docs/images/multiimage-renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/multiimage-renderer.png -------------------------------------------------------------------------------- /docs/images/ownerdrawn-example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/ownerdrawn-example1.png -------------------------------------------------------------------------------- /docs/images/tileview-ownerdrawn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/tileview-ownerdrawn.png -------------------------------------------------------------------------------- /docs/.static/gettingStarted-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/gettingStarted-icon.png -------------------------------------------------------------------------------- /docs/.static/light-blue-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/light-blue-800x1600.png -------------------------------------------------------------------------------- /docs/.static/listCtrlPrinter-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/listCtrlPrinter-icon.png -------------------------------------------------------------------------------- /docs/images/ModelToScreenProcess.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/ModelToScreenProcess.png -------------------------------------------------------------------------------- /docs/images/blog8-funnyformatting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog8-funnyformatting.png -------------------------------------------------------------------------------- /docs/images/dialog2-blue-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dialog2-blue-800x1600.png -------------------------------------------------------------------------------- /docs/images/dragdrop-dropbetween.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-dropbetween.png -------------------------------------------------------------------------------- /docs/images/dragdrop-dropsubitem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-dropsubitem.png -------------------------------------------------------------------------------- /docs/images/emptylistmsg-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/emptylistmsg-example.png -------------------------------------------------------------------------------- /docs/images/mappedimage-renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/mappedimage-renderer.png -------------------------------------------------------------------------------- /docs/.static/dialog2-blue-800x1600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/dialog2-blue-800x1600.png -------------------------------------------------------------------------------- /docs/.static/sparkle-garish-example.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/sparkle-garish-example.swf -------------------------------------------------------------------------------- /docs/.static/sparkle-simple-example.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/sparkle-simple-example.swf -------------------------------------------------------------------------------- /docs/images/ClassDiagram-VirtualList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/ClassDiagram-VirtualList.png -------------------------------------------------------------------------------- /docs/images/column-selection-inline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/column-selection-inline.png -------------------------------------------------------------------------------- /docs/images/column-selection-submenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/column-selection-submenu.png -------------------------------------------------------------------------------- /docs/images/dragdrop-dropbackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-dropbackground.png -------------------------------------------------------------------------------- /docs/images/dragdrop-feedbackcolor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/dragdrop-feedbackcolor.png -------------------------------------------------------------------------------- /docs/images/foobar-lookalike-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/foobar-lookalike-small.png -------------------------------------------------------------------------------- /docs/images/gettingstarted-example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/gettingstarted-example1.png -------------------------------------------------------------------------------- /docs/images/gettingstarted-example2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/gettingstarted-example2.png -------------------------------------------------------------------------------- /docs/images/gettingstarted-example3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/gettingstarted-example3.png -------------------------------------------------------------------------------- /docs/images/gettingstarted-example4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/gettingstarted-example4.png -------------------------------------------------------------------------------- /docs/images/gettingstarted-example5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/gettingstarted-example5.png -------------------------------------------------------------------------------- /docs/images/gettingstarted-example6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/gettingstarted-example6.png -------------------------------------------------------------------------------- /docs/images/text-filter-highlighting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/text-filter-highlighting.png -------------------------------------------------------------------------------- /ObjectListView/Resources/clear-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/Resources/clear-filter.png -------------------------------------------------------------------------------- /ObjectListView/Resources/filter-icons3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/Resources/filter-icons3.png -------------------------------------------------------------------------------- /docs/.static/objectListView-animation.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/objectListView-animation.swf -------------------------------------------------------------------------------- /docs/Help/ObjectListView-Documentation.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/Help/ObjectListView-Documentation.chm -------------------------------------------------------------------------------- /docs/images/hierarchical-checkboxes-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/hierarchical-checkboxes-1.png -------------------------------------------------------------------------------- /ListViewPrinterDemo/Resources/compass16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ListViewPrinterDemo/Resources/compass16.png -------------------------------------------------------------------------------- /ObjectListView/Resources/sort-ascending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/Resources/sort-ascending.png -------------------------------------------------------------------------------- /ObjectListView/Resources/sort-descending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/ObjectListView/Resources/sort-descending.png -------------------------------------------------------------------------------- /docs/images/blog8-greytext-colourimages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/blog8-greytext-colourimages.png -------------------------------------------------------------------------------- /docs/images/column-selection-modaldialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/images/column-selection-modaldialog.png -------------------------------------------------------------------------------- /docs/.static/objectListView-simple-animation.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/drxaero/ObjectListView/HEAD/docs/.static/objectListView-simple-animation.swf -------------------------------------------------------------------------------- /Tests/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/majorClasses.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: First steps in learning to love ListView 4 | 5 | Major Classes Reference 6 | ======================= 7 | -------------------------------------------------------------------------------- /docs/.static/master.css: -------------------------------------------------------------------------------- 1 | /***** Master CSS include *****/ 2 | 3 | @import url("reset.css"); 4 | @import url("initial.css"); 5 | /* @import url("default.css"); */ 6 | @import url("dialog.css"); 7 | @import url("global.css"); 8 | @import url("structure.css"); 9 | -------------------------------------------------------------------------------- /ListViewPrinterDemo/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Tests/OLVTests.nunit: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ListViewPrinterDemo/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Windows.Forms; 4 | 5 | namespace ListViewPrinterDemo 6 | { 7 | static class Program 8 | { 9 | /// 10 | /// The main entry point for the application. 11 | /// 12 | [STAThread] 13 | static void Main() 14 | { 15 | Application.EnableVisualStyles(); 16 | Application.SetCompatibleTextRenderingDefault(false); 17 | Application.Run(new Form1()); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Tests/MainForm.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * [File purpose] 3 | * Author: Phillip Piper 4 | * Date: 10/21/2008 11:01 PM 5 | * 6 | * CHANGE LOG: 7 | * when who what 8 | * 10/21/2008 JPP Initial Version 9 | */ 10 | 11 | using System.Windows.Forms; 12 | 13 | 14 | namespace BrightIdeasSoftware.Tests 15 | { 16 | /// 17 | /// Description of MainForm. 18 | /// 19 | public partial class MainForm : Form 20 | { 21 | public MainForm() 22 | { 23 | // 24 | // The InitializeComponent() call is required for Windows Forms designer support. 25 | // 26 | InitializeComponent(); 27 | 28 | // 29 | // TODO: Add constructor code after the InitializeComponent() call. 30 | // 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Tests/SetupTestSuite.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * [File purpose] 3 | * Author: Phillip Piper 4 | * Date: 10/25/2008 10:31 PM 5 | * 6 | * CHANGE LOG: 7 | * when who what 8 | * 10/25/2008 JPP Initial Version 9 | */ 10 | 11 | using System; 12 | using System.Drawing; 13 | using NUnit.Framework; 14 | 15 | namespace BrightIdeasSoftware.Tests 16 | { 17 | [SetUpFixture] 18 | public class MyGlobals 19 | { 20 | [SetUp] 21 | public void RunBeforeAnyTests() 22 | { 23 | MyGlobals.mainForm = new MainForm(); 24 | MyGlobals.mainForm.Size = new Size(); 25 | MyGlobals.mainForm.Show(); 26 | } 27 | public static MainForm mainForm; 28 | 29 | [TearDown] 30 | public void RunAfterAnyTests() 31 | { 32 | MyGlobals.mainForm.Close(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /docs/.static/reset.css: -------------------------------------------------------------------------------- 1 | /* =INITIAL 2 | v2.1, by Faruk Ates - www.kurafire.net 3 | Addendum by Robert Nyman - www.robertnyman.com 4 | Addition by Christian Montoya - www.christianmontoya.net */ 5 | 6 | /* Neutralize styling: 7 | Elements we want to clean out entirely: */ 8 | html, body, form, fieldset { 9 | margin: 0; 10 | padding: 0; 11 | font: 100%/120% Verdana, Arial, Helvetica, sans-serif; 12 | } 13 | 14 | /* Neutralize styling: 15 | Elements with a vertical margin: */ 16 | h1, h2, h3, h4, h5, h6, p, pre, 17 | blockquote, ul, ol, dl, address { 18 | margin: 1em 0; 19 | padding: 0; 20 | } 21 | 22 | /* Apply left margin: 23 | Only to the few elements that need it: */ 24 | li, dd, blockquote { 25 | margin-left: 1em; 26 | } 27 | 28 | /* Miscellaneous conveniences: */ 29 | form label { 30 | cursor: pointer; 31 | } 32 | fieldset { 33 | border: none; 34 | } 35 | input, select, textarea { 36 | font-size: 100%; 37 | font-family: inherit; 38 | } -------------------------------------------------------------------------------- /docs/blog.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: Learning from the difficulties of loving .NET ListView 4 | 5 | .. _blog: 6 | 7 | Technical Blog 8 | ============== 9 | 10 | These articles document some of the difficulties that were encountered while writing 11 | `ObjectListView` and how they were (more or less) solved. 12 | 13 | If you are looking for how to actually use an `ObjectListView`, you want to look 14 | at the :ref:`Cookbook`. 15 | 16 | * :ref:`Enabling disabling (20 May 2014)` 17 | * :ref:`Creating hierarchical checkboxes (26 February 2014)` 18 | * :ref:`Flickering on virtual lists and the .NET bug that causes it (5 May 2012)` 19 | * :ref:`Lifting up the downtrodden ListViewGroup (20 April 2012)` 20 | * :ref:`Making a rearrangeable TreeListView (9 May 2011, updated April 2012)` 21 | * :ref:`The story of a little bug (1 August 2009)` 22 | * :ref:`What's wrong with .NET's ToolTip? (27 May 2009)` 23 | * :ref:`Developing overlays (1 May 2009)` 24 | -------------------------------------------------------------------------------- /Tests/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | #region Using directives 2 | 3 | using System.Reflection; 4 | using System.Runtime.CompilerServices; 5 | using System.Runtime.InteropServices; 6 | 7 | #endregion 8 | 9 | // General Information about an assembly is controlled through the following 10 | // set of attributes. Change these attribute values to modify the information 11 | // associated with an assembly. 12 | [assembly: AssemblyTitle("Tests")] 13 | [assembly: AssemblyDescription("")] 14 | [assembly: AssemblyConfiguration("")] 15 | [assembly: AssemblyCompany("")] 16 | [assembly: AssemblyProduct("Tests")] 17 | [assembly: AssemblyCopyright("")] 18 | [assembly: AssemblyTrademark("")] 19 | [assembly: AssemblyCulture("")] 20 | 21 | // This sets the default COM visibility of types in the assembly to invisible. 22 | // If you need to expose a type to COM, use [ComVisible(true)] on that type. 23 | [assembly: ComVisible(false)] 24 | 25 | // The assembly version has following format : 26 | // 27 | // Major.Minor.Build.Revision 28 | // 29 | // You can specify all the values or you can use the default the Revision and 30 | // Build Numbers by using the '*' as shown below: 31 | [assembly: AssemblyVersion("1.0.*")] 32 | -------------------------------------------------------------------------------- /docs/.static/global.css: -------------------------------------------------------------------------------- 1 | 2 | /***********************************************/ 3 | /* HTML tag styles */ 4 | /***********************************************/ 5 | 6 | ul{ 7 | list-style-type: square; 8 | } 9 | 10 | ul ul{ 11 | list-style-type: disc; 12 | } 13 | 14 | ol{ 15 | list-style-type:decimal; 16 | } 17 | 18 | ol ul{ 19 | list-style-type: disc; 20 | padding-bottom: 0px; 21 | } 22 | 23 | hr { 24 | height:0px; 25 | border:0px; 26 | border-top:1px solid #ff1493; 27 | } 28 | 29 | code { 30 | color: #990000; 31 | font-family: "Courier New", Courier, mono; 32 | } 33 | 34 | pre { 35 | margin: 0px 0px 16px 0px; 36 | padding: 8px; 37 | font-size: 0.9em; 38 | background-color: #FBEDBB; 39 | } 40 | 41 | .dialog.type2 .content, 42 | .dialog.type2 .t, 43 | .dialog.type2 .b, 44 | .dialog.type2 .b div { 45 | background-image:url(light-blue-800x1600.png); 46 | } 47 | 48 | .dialog.sidebar .content, 49 | .dialog.sidebar .t, 50 | .dialog.sidebar .b, 51 | .dialog.sidebar .b div { 52 | background-image:url(orange-800x1600.png); 53 | } 54 | 55 | #separator { 56 | clear: both; 57 | padding: 0; 58 | margin: 0; 59 | height: 1px; 60 | } 61 | -------------------------------------------------------------------------------- /ListViewPrinterDemo/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:2.0.50727.3053 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ListViewPrinterDemo.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ObjectListView/CustomDictionary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | br 6 | Canceled 7 | Center 8 | Color 9 | Colors 10 | f 11 | fmt 12 | g 13 | gdi 14 | hti 15 | i 16 | lightbox 17 | lv 18 | lvi 19 | lvsi 20 | m 21 | multi 22 | Munger 23 | n 24 | olv 25 | olvi 26 | p 27 | parms 28 | r 29 | Renderer 30 | s 31 | SubItem 32 | Unapply 33 | Unpause 34 | x 35 | y 36 | 37 | 38 | ComPlus 39 | 40 | 41 | 42 | 43 | OLV 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Demo/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Information about this assembly is defined by the following 6 | // attributes. 7 | // 8 | // change them to the information which is associated with the assembly 9 | // you compile. 10 | 11 | [assembly: AssemblyTitle("ObjectListViewDemo")] 12 | [assembly: AssemblyDescription("A demonstration of how easy an ObjectListView is to use (and how powerful).")] 13 | [assembly: AssemblyConfiguration("")] 14 | [assembly: AssemblyCompany("Bright Ideas Software")] 15 | [assembly: AssemblyProduct("ObjectListViewDemo")] 16 | [assembly: AssemblyCopyright("Copyright 2006-2014 All Rights Reserved")] 17 | [assembly: AssemblyTrademark("")] 18 | [assembly: AssemblyCulture("")] 19 | 20 | // This sets the default COM visibility of types in the assembly to invisible. 21 | // If you need to expose a type to COM, use [ComVisible(true)] on that type. 22 | [assembly: ComVisible(false)] 23 | 24 | // The assembly version has following format : 25 | // 26 | // Major.Minor.Build.Revision 27 | // 28 | // You can specify all values by your own or you can build default build and revision 29 | // numbers with the '*' character (the default): 30 | 31 | [assembly: AssemblyVersion("2.5.0.*")] 32 | [assembly: AssemblyFileVersionAttribute("2.5.0.0")] 33 | [assembly: System.CLSCompliant(true)] 34 | -------------------------------------------------------------------------------- /ListViewPrinterDemo/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ListViewPrinterDemo")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("ListViewPrinterDemo")] 13 | [assembly: AssemblyCopyright("Copyright © 2007")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("201c17f3-3fe1-432f-b705-7fa1b622d709")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | [assembly: AssemblyVersion("1.0.0.0")] 33 | [assembly: AssemblyFileVersion("1.0.0.0")] 34 | -------------------------------------------------------------------------------- /ObjectListView/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("ObjectListView")] 8 | [assembly: AssemblyDescription("A much easier to use ListView and friends")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("Bright Ideas Software")] 11 | [assembly: AssemblyProduct("ObjectListView")] 12 | [assembly: AssemblyCopyright("Copyright © 2006-2014")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("ef28c7a8-77ae-442d-abc3-bb023fa31e57")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Revision and Build Numbers 32 | // by using the '*' as shown below: 33 | [assembly: AssemblyVersion("2.7.0.*")] 34 | [assembly: AssemblyFileVersion("2.7.0.0")] 35 | [assembly: System.CLSCompliant(true)] 36 | -------------------------------------------------------------------------------- /ListViewPrinter/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ListViewPrinter")] 9 | [assembly: AssemblyDescription("A class to take a ListView or ObjectListView and make it into a beatiful report")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Bright Ideas Software")] 12 | [assembly: AssemblyProduct("ListViewPrinter")] 13 | [assembly: AssemblyCopyright("Copyright © 2008-2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("213c7c43-b654-47cb-b817-fc602282c9df")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("2.5.0.*")] 35 | [assembly: AssemblyFileVersion("2.5.0.0")] 36 | -------------------------------------------------------------------------------- /SparkleLibrary/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Sparkle Library")] 9 | [assembly: AssemblyDescription("An animation library to add some sparkly eye candy to an application")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Bright Ideas Software")] 12 | [assembly: AssemblyProduct("SparkleLibrary")] 13 | [assembly: AssemblyCopyright("Copyright © 2010")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("6bc11313-3880-41ce-94af-39b60ab4ef33")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /docs/.static/dialog.css: -------------------------------------------------------------------------------- 1 | /* 2 | -- Even more rounded corners with CSS: Base stylesheet -- 3 | */ 4 | 5 | .dialog { 6 | position:relative; 7 | margin:0px auto; 8 | min-width:8em; 9 | max-width:860px; /* based on image dimensions - not quite consistent with drip styles yet */ 10 | color:#fff; 11 | z-index:1; 12 | margin-left:24px; /* default, width of left corner */ 13 | margin-bottom:0.5em; /* spacing under dialog */ 14 | } 15 | 16 | .dialog .content, 17 | .dialog .t, 18 | .dialog .b, 19 | .dialog .b div { 20 | background:transparent url(dark-blue-800x1600.png) no-repeat top right; 21 | /* _background-image:url(../images/dark-blue-800x1600.png) no-repeat top right;*/ 22 | } 23 | 24 | .dialog .content { 25 | position:relative; 26 | zoom:1; 27 | _overflow-y:hidden; 28 | padding:0px 24px 0px 0px; 29 | } 30 | 31 | .dialog .t { 32 | /* top+left vertical slice */ 33 | position:absolute; 34 | left:0px; 35 | top:0px; 36 | width:24px; /* top slice width */ 37 | margin-left:-24px; 38 | height:100%; 39 | _height:1600px; /* arbitrary long height, IE 6 */ 40 | background-position:top left; 41 | } 42 | 43 | .dialog .b { 44 | /* bottom */ 45 | position:relative; 46 | width:100%; 47 | } 48 | 49 | .dialog .b, 50 | .dialog .b div { 51 | height:30px; /* height of bottom cap/shade */ 52 | font-size:1px; 53 | 54 | } 55 | 56 | .dialog .b { 57 | background-position:bottom right; 58 | } 59 | 60 | .dialog .b div { 61 | position:relative; 62 | width:24px; /* bottom corner width */ 63 | margin-left:-24px; 64 | background-position:bottom left; 65 | } 66 | 67 | .dialog .hd, 68 | .dialog .bd, 69 | .dialog .ft { 70 | position:relative; 71 | } 72 | -------------------------------------------------------------------------------- /Tests/TestAdornments.cs: -------------------------------------------------------------------------------- 1 | using System.Drawing; 2 | using NUnit.Framework; 3 | 4 | namespace BrightIdeasSoftware.Tests 5 | { 6 | 7 | [TestFixture] 8 | public class TestAdornments 9 | { 10 | [Test] 11 | public void TestCalculateAlignedPosition() { 12 | GraphicAdornment ga = new GraphicAdornment(); 13 | Rectangle r = new Rectangle(10, 20, 30, 40); 14 | Point pt = new Point(100, 200); 15 | Size sz = new Size(50, 60); 16 | Assert.AreEqual(pt, ga.CalculateAlignedPosition(pt, sz, ContentAlignment.TopLeft)); 17 | Assert.AreEqual(pt - sz, ga.CalculateAlignedPosition(pt, sz, ContentAlignment.BottomRight)); 18 | Assert.AreEqual(new Point(75, 170), ga.CalculateAlignedPosition(pt, sz, ContentAlignment.MiddleCenter)); 19 | } 20 | 21 | [Test] 22 | public void TestCalculateCorner() { 23 | GraphicAdornment ga = new GraphicAdornment(); 24 | Rectangle r = new Rectangle(10, 20, 30, 40); 25 | Assert.AreEqual(r.Location, ga.CalculateCorner(r, ContentAlignment.TopLeft)); 26 | Assert.AreEqual(new Point(40, 20), ga.CalculateCorner(r, ContentAlignment.TopRight)); 27 | Assert.AreEqual(new Point(25, 40), ga.CalculateCorner(r, ContentAlignment.MiddleCenter)); 28 | Assert.AreEqual(new Point(10, 60), ga.CalculateCorner(r, ContentAlignment.BottomLeft)); 29 | Assert.AreEqual(r.Location + r.Size, ga.CalculateCorner(r, ContentAlignment.BottomRight)); 30 | } 31 | 32 | [Test] 33 | public void TestCreateAlignedRectangle() { 34 | GraphicAdornment ga = new GraphicAdornment(); 35 | Rectangle r = new Rectangle(10, 20, 30, 40); 36 | Size sz = new Size(50, 60); 37 | Size offset = new Size(1, 1); 38 | Assert.AreEqual(new Rectangle(r.Location + offset, sz), 39 | ga.CreateAlignedRectangle(r, sz, ContentAlignment.TopLeft, ContentAlignment.TopLeft, offset)); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Tests/TestTypedListView.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using NUnit.Framework; 3 | 4 | namespace BrightIdeasSoftware.Tests { 5 | [TestFixture] 6 | public class TestTypedListView { 7 | [Test] 8 | public void Test_Objects_All() { 9 | this.tolv.Objects = PersonDb.All; 10 | Assert.AreEqual(PersonDb.All.Count, this.tolv.Objects.Count); 11 | } 12 | 13 | [Test] 14 | public void Test_GenerateAspectGetters_ExtractsData() { 15 | this.tolv.GenerateAspectGetters(); 16 | this.tolv.Objects = PersonDb.All; 17 | Person p = this.tolv.ListView.GetItem(0).RowObject as Person; 18 | Assert.AreEqual(p.Name, this.tolv.ListView.Items[0].SubItems[0].Text); 19 | } 20 | 21 | [Test] 22 | public void Test_GenerateAspectGetters_NullDataObject() { 23 | this.tolv.GenerateAspectGetters(); 24 | List list = new List(); 25 | list.Add(null); 26 | this.tolv.Objects = list; 27 | Assert.AreEqual(list.Count, this.tolv.Objects.Count); 28 | } 29 | 30 | [Test] 31 | public void Test_GenerateAspectGetters_ClearObjects() { 32 | this.tolv.GenerateAspectGetters(); 33 | this.tolv.Objects = PersonDb.All; 34 | this.tolv.ListView.ClearObjects(); 35 | Assert.AreEqual(0, this.tolv.Objects.Count); 36 | this.tolv.Objects = PersonDb.All; 37 | Assert.AreEqual(PersonDb.All.Count, this.tolv.Objects.Count); 38 | } 39 | 40 | [TearDown] 41 | public void TestTearDown() { 42 | // Clear any aspect getters that were generated 43 | for (int i = 0; i < this.tolv.ListView.Columns.Count; i++) 44 | this.tolv.ListView.GetColumn(i).AspectGetter = null; 45 | } 46 | 47 | [TestFixtureSetUp] 48 | public void Init() { 49 | this.tolv = new TypedObjectListView(MyGlobals.mainForm.objectListView1); 50 | } 51 | 52 | protected TypedObjectListView tolv; 53 | } 54 | } -------------------------------------------------------------------------------- /ObjectListView/Filtering/ICluster.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * ICluster - A cluster is a group of objects that can be included or excluded as a whole 3 | * 4 | * Author: Phillip Piper 5 | * Date: 4-March-2011 11:59 pm 6 | * 7 | * Change log: 8 | * 2011-03-04 JPP - First version 9 | * 10 | * Copyright (C) 2011-2014 Phillip Piper 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation, either version 3 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program. If not, see . 24 | * 25 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 26 | */ 27 | 28 | using System; 29 | using System.Collections.Generic; 30 | using System.Text; 31 | 32 | namespace BrightIdeasSoftware { 33 | 34 | /// 35 | /// A cluster is a like collection of objects that can be usefully filtered 36 | /// as whole using the filtering UI provided by the ObjectListView. 37 | /// 38 | public interface ICluster : IComparable { 39 | /// 40 | /// Gets or sets how many items belong to this cluster 41 | /// 42 | int Count { get; set; } 43 | 44 | /// 45 | /// Gets or sets the label that will be shown to the user to represent 46 | /// this cluster 47 | /// 48 | string DisplayLabel { get; set; } 49 | 50 | /// 51 | /// Gets or sets the actual data object that all members of this cluster 52 | /// have commonly returned. 53 | /// 54 | object ClusterKey { get; set; } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /SparkleLibrary/Animation/Events.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Events - All events triggerable by an animation 3 | * 4 | * Author: Phillip Piper 5 | * Date: 8/02/2010 17:35 6 | * 7 | * Change log: 8 | * 2010-02-08 JPP - Initial version 9 | * 10 | * To do: 11 | * 12 | * Copyright (C) 2010 Phillip Piper 13 | * 14 | * This program is free software: you can redistribute it and/or modify 15 | * it under the terms of the GNU General Public License as published by 16 | * the Free Software Foundation, either version 3 of the License, or 17 | * (at your option) any later version. 18 | * 19 | * This program is distributed in the hope that it will be useful, 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | * GNU General Public License for more details. 23 | * 24 | * You should have received a copy of the GNU General Public License 25 | * along with this program. If not, see . 26 | * 27 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 28 | */ 29 | 30 | using System; 31 | using System.Collections.Generic; 32 | using System.Drawing; 33 | using System.ComponentModel; 34 | using System.Windows.Forms; 35 | 36 | namespace BrightIdeasSoftware 37 | { 38 | public class StartAnimationEventArgs : EventArgs 39 | { 40 | } 41 | 42 | public class TickEventArgs : EventArgs 43 | { 44 | /// 45 | /// Gets or sets if the tick event was completely handled 46 | /// 47 | public bool Handled; 48 | } 49 | 50 | public class RedrawEventArgs : EventArgs 51 | { 52 | public RedrawEventArgs() { 53 | this.Damage = new Rectangle(-100000, -100000, 200000, 200000); 54 | } 55 | 56 | public RedrawEventArgs(Rectangle r) { 57 | this.Damage = r; 58 | } 59 | 60 | /// 61 | /// Gets the area of the animation that was damaged 62 | /// 63 | public Rectangle Damage; 64 | } 65 | 66 | public class StopAnimationEventArgs : EventArgs 67 | { 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /docs/download.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: Show me the code! 4 | 5 | .. _downloads: 6 | 7 | Downloads 8 | ========= 9 | 10 | OK. Now that you're interested, how do you actually get the code? 11 | 12 | Stable releases 13 | --------------- 14 | 15 | v2.7.0 released on 30 October 2012 is the most recent stable release. 16 | 17 | `Click here to download the full package`_, which includes the ObjectListView control, demos, documentation and unit tests (2.9 MB). 18 | 19 | .. _Click here to download the full package: http://sourceforge.net/projects/objectlistview/files/objectlistview/2.6.0/ObjectListViewFull-2.6.0.zip/download 20 | 21 | `Click here`_ to download just the source code of the ObjectListView project (740 KB). 22 | 23 | .. _Click here: http://sourceforge.net/projects/objectlistview/files/objectlistview/2.6.0/ObjectListView-2.6.0.zip/download 24 | 25 | `Click here to download a CHM`_ documentation file built from the source code (4.6 MB). This is a reference only and not particularly readable. 26 | 27 | .. _Click here to download a CHM: http://sourceforge.net/projects/objectlistview/files/objectlistview/2.6.0/ObjectListView-Documentation.chm/download 28 | 29 | `Click here to see all releases`_. 30 | 31 | .. _Click here to see all releases: https://sourceforge.net/projects/objectlistview/files/objectlistview/ 32 | 33 | Not-so-stable releases 34 | ---------------------- 35 | 36 | There are currently no not-so-stable releases. 37 | 38 | Bleeding-edge source 39 | -------------------- 40 | 41 | If you are a very keen developer, you can access the SVN repository directly for this 42 | project. The following SVN command will fetch the most recent version from the repository:: 43 | 44 | svn co https://objectlistview.svn.sourceforge.net/svnroot/objectlistview/cs/trunk objectlistview 45 | 46 | There are details on `how to use Subversion here `_ on SourceForge. 47 | 48 | Please remember that code within the SVN is bleeding edge. It has not been well-tested and 49 | is almost certainly full of bugs. If you just want to play with the ObjectListView, it's 50 | better to stay with the official releases, where the bugs are (hopefully) less obvious. 51 | -------------------------------------------------------------------------------- /ObjectListView.shfb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | All ObjectListView appears in this namespace 8 | 9 | 10 | ObjectListViewDemo demonstrates helpful techniques when using an ObjectListView 11 | Summary, Parameter, Returns, AutoDocumentCtors, Namespace 12 | InheritedMembers, Protected, SealedProtected 13 | 14 | 15 | .\Help\ 16 | 17 | 18 | True 19 | True 20 | HtmlHelp1x 21 | True 22 | False 23 | 2.0.50727 24 | True 25 | False 26 | True 27 | False 28 | 29 | ObjectListView Reference 30 | Documentation 31 | en-US 32 | 33 | (c) Copyright 2006-2008 Phillip Piper All Rights Reserved 34 | phillip_piper@bigfoot.com 35 | 36 | 37 | Local 38 | Msdn 39 | Blank 40 | Prototype 41 | Guid 42 | CSharp 43 | False 44 | AboveNamespaces 45 | 46 | 47 | -------------------------------------------------------------------------------- /ObjectListView/ObjectListView.shfb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | All ObjectListView appears in this namespace 8 | 9 | 10 | ObjectListViewDemo demonstrates helpful techniques when using an ObjectListView 11 | Summary, Parameter, Returns, AutoDocumentCtors, Namespace 12 | InheritedMembers, Protected, SealedProtected 13 | 14 | 15 | .\Help\ 16 | 17 | 18 | True 19 | True 20 | HtmlHelp1x 21 | True 22 | False 23 | 2.0.50727 24 | True 25 | False 26 | True 27 | False 28 | 29 | ObjectListView Reference 30 | Documentation 31 | en-US 32 | 33 | (c) Copyright 2006-2008 Phillip Piper All Rights Reserved 34 | phillip_piper@bigfoot.com 35 | 36 | 37 | Local 38 | Msdn 39 | Blank 40 | Prototype 41 | Guid 42 | CSharp 43 | False 44 | AboveNamespaces 45 | 46 | 47 | -------------------------------------------------------------------------------- /ObjectListView/Filtering/ClustersFromGroupsStrategy.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * ClusteringStrategy - Implements a simple clustering strategy 3 | * 4 | * Author: Phillip Piper 5 | * Date: 1-April-2011 8:12am 6 | * 7 | * Change log: 8 | * 2011-04-01 JPP - First version 9 | * 10 | * Copyright (C) 2011-2014 Phillip Piper 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation, either version 3 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program. If not, see . 24 | * 25 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 26 | */ 27 | 28 | using System; 29 | using System.Collections.Generic; 30 | using System.Text; 31 | 32 | namespace BrightIdeasSoftware { 33 | 34 | /// 35 | /// This class calculates clusters from the groups that the column uses. 36 | /// 37 | /// 38 | /// 39 | /// This is the default strategy for all non-date, filterable columns. 40 | /// 41 | /// 42 | /// This class does not strictly mimic the groups created by the given column. 43 | /// In particular, if the programmer changes the default grouping technique 44 | /// by listening for grouping events, this class will not mimic that behaviour. 45 | /// 46 | /// 47 | public class ClustersFromGroupsStrategy : ClusteringStrategy { 48 | 49 | /// 50 | /// Get the cluster key by which the given model will be partitioned by this strategy 51 | /// 52 | /// 53 | /// 54 | public override object GetClusterKey(object model) { 55 | return this.Column.GetGroupKey(model); 56 | } 57 | 58 | /// 59 | /// Gets the display label that the given cluster should use 60 | /// 61 | /// 62 | /// 63 | public override string GetClusterDisplayLabel(ICluster cluster) { 64 | string s = this.Column.ConvertGroupKeyToTitle(cluster.ClusterKey); 65 | if (String.IsNullOrEmpty(s)) 66 | s = EMPTY_LABEL; 67 | return this.ApplyDisplayFormat(cluster, s); 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /ObjectListView2005.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 9.00 3 | # Visual C# Express 2005 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListView", "ObjectListView\ObjectListView2005.csproj", "{18FEDA0C-D147-4286-B39A-01204808106A}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListViewDemo", "Demo\ObjectListViewDemo2005.csproj", "{C5332EAB-17B3-48B9-948E-33934B341AB0}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinter", "ListViewPrinter\ListViewPrinter2005.csproj", "{E73A10BD-2B5A-4BAC-897F-3A58CFC07631}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinterDemo", "ListViewPrinterDemo\ListViewPrinterDemo2005.csproj", "{40719365-FC03-46B8-8B6E-5FD1454712B6}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests2005.csproj", "{8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}" 13 | EndProject 14 | Global 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 16 | Debug|Any CPU = Debug|Any CPU 17 | Release|Any CPU = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.Build.0 = Release|Any CPU 24 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 25 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.Build.0 = Debug|Any CPU 26 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.ActiveCfg = Release|Any CPU 27 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.Build.0 = Release|Any CPU 28 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 29 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.Build.0 = Debug|Any CPU 30 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.ActiveCfg = Release|Any CPU 31 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.Build.0 = Release|Any CPU 32 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 33 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.Build.0 = Debug|Any CPU 34 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.ActiveCfg = Release|Any CPU 35 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.Build.0 = Release|Any CPU 36 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 37 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.Build.0 = Debug|Any CPU 38 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.ActiveCfg = Release|Any CPU 39 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.Build.0 = Release|Any CPU 40 | EndGlobalSection 41 | GlobalSection(SolutionProperties) = preSolution 42 | HideSolutionNode = FALSE 43 | EndGlobalSection 44 | EndGlobal 45 | -------------------------------------------------------------------------------- /ListViewPrinterDemo/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.261 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ListViewPrinterDemo.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ListViewPrinterDemo.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /ListViewPrinter/ListViewPrinter2005.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Debug 4 | AnyCPU 5 | 8.0.50727 6 | 2.0 7 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631} 8 | Library 9 | Properties 10 | BrightIdeasSoftware 11 | ListViewPrinter 12 | 13 | 14 | true 15 | full 16 | false 17 | bin\Debug\ 18 | DEBUG;TRACE 19 | prompt 20 | 4 21 | 22 | 23 | pdbonly 24 | true 25 | bin\Release\ 26 | TRACE 27 | prompt 28 | 4 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | Form 41 | 42 | 43 | BrushForm.cs 44 | 45 | 46 | 47 | 48 | 49 | Component 50 | 51 | 52 | 53 | 54 | 55 | BrushForm.cs 56 | Designer 57 | 58 | 59 | 60 | 61 | {18FEDA0C-D147-4286-B39A-01204808106A} 62 | ObjectListView 63 | 64 | 65 | 66 | 73 | -------------------------------------------------------------------------------- /ObjectListView/Filtering/IClusteringStrategy.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * IClusterStrategy - Encapsulates the ability to create a list of clusters from an ObjectListView 3 | * 4 | * Author: Phillip Piper 5 | * Date: 4-March-2011 11:59 pm 6 | * 7 | * Change log: 8 | * 2012-05-23 JPP - Added CreateFilter() method to interface to allow the strategy 9 | * to control the actual model filter that is created. 10 | * v2.5 11 | * 2011-03-04 JPP - First version 12 | * 13 | * Copyright (C) 2011-2014 Phillip Piper 14 | * 15 | * This program is free software: you can redistribute it and/or modify 16 | * it under the terms of the GNU General Public License as published by 17 | * the Free Software Foundation, either version 3 of the License, or 18 | * (at your option) any later version. 19 | * 20 | * This program is distributed in the hope that it will be useful, 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 | * GNU General Public License for more details. 24 | * 25 | * You should have received a copy of the GNU General Public License 26 | * along with this program. If not, see . 27 | * 28 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 29 | */ 30 | 31 | using System; 32 | using System.Collections; 33 | using System.Collections.Generic; 34 | using System.Text; 35 | 36 | namespace BrightIdeasSoftware{ 37 | 38 | /// 39 | /// Implementation of this interface control the selecting of cluster keys 40 | /// and how those clusters will be presented to the user 41 | /// 42 | public interface IClusteringStrategy { 43 | 44 | /// 45 | /// Gets or sets the column upon which this strategy will operate 46 | /// 47 | OLVColumn Column { get; set; } 48 | 49 | /// 50 | /// Get the cluster key by which the given model will be partitioned by this strategy 51 | /// 52 | /// If the returned value is an IEnumerable, the given model is considered 53 | /// to belong to multiple clusters 54 | /// 55 | /// 56 | object GetClusterKey(object model); 57 | 58 | /// 59 | /// Create a cluster to hold the given cluster key 60 | /// 61 | /// 62 | /// 63 | ICluster CreateCluster(object clusterKey); 64 | 65 | /// 66 | /// Gets the display label that the given cluster should use 67 | /// 68 | /// 69 | /// 70 | string GetClusterDisplayLabel(ICluster cluster); 71 | 72 | /// 73 | /// Create a filter that will include only model objects that 74 | /// match one or more of the given values. 75 | /// 76 | /// 77 | /// 78 | IModelFilter CreateFilter(IList valuesChosenForFiltering); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /ObjectListView/Implementation/NullableDictionary.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * NullableDictionary - A simple Dictionary that can handle null as a key 3 | * 4 | * Author: Phillip Piper 5 | * Date: 31-March-2011 5:53 pm 6 | * 7 | * Change log: 8 | * 2011-03-31 JPP - Split into its own file 9 | * 10 | * Copyright (C) 2011-2014 Phillip Piper 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation, either version 3 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program. If not, see . 24 | * 25 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 26 | */ 27 | 28 | using System; 29 | using System.Collections.Generic; 30 | using System.Text; 31 | using System.Collections; 32 | 33 | namespace BrightIdeasSoftware { 34 | 35 | /// 36 | /// A simple-minded implementation of a Dictionary that can handle null as a key. 37 | /// 38 | /// The type of the dictionary key 39 | /// The type of the values to be stored 40 | /// This is not a full implementation and is only meant to handle 41 | /// collecting groups by their keys, since groups can have null as a key value. 42 | internal class NullableDictionary : Dictionary { 43 | private bool hasNullKey; 44 | private TValue nullValue; 45 | 46 | new public TValue this[TKey key] { 47 | get { 48 | if (key != null) 49 | return base[key]; 50 | 51 | if (this.hasNullKey) 52 | return this.nullValue; 53 | 54 | throw new KeyNotFoundException(); 55 | } 56 | set { 57 | if (key == null) { 58 | this.hasNullKey = true; 59 | this.nullValue = value; 60 | } else 61 | base[key] = value; 62 | } 63 | } 64 | 65 | new public bool ContainsKey(TKey key) { 66 | return key == null ? this.hasNullKey : base.ContainsKey(key); 67 | } 68 | 69 | new public IList Keys { 70 | get { 71 | ArrayList list = new ArrayList(base.Keys); 72 | if (this.hasNullKey) 73 | list.Add(null); 74 | return list; 75 | } 76 | } 77 | 78 | new public IList Values { 79 | get { 80 | List list = new List(base.Values); 81 | if (this.hasNullKey) 82 | list.Add(this.nullValue); 83 | return list; 84 | } 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /SparkleLibrary/SparkleLibrary2010.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 9.0.30729 7 | 2.0 8 | {D63F9786-B608-4085-AF08-D909448B0426} 9 | Library 10 | Properties 11 | SparkleLibrary 12 | SparkleLibrary 13 | v4.0 14 | 512 15 | 16 | 17 | 18 | 19 | 3.5 20 | 21 | 22 | true 23 | full 24 | false 25 | bin\Debug\ 26 | DEBUG;TRACE 27 | prompt 28 | 4 29 | 30 | 31 | pdbonly 32 | true 33 | bin\Release\ 34 | TRACE 35 | prompt 36 | 4 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 71 | -------------------------------------------------------------------------------- /Tests/Tests2005.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9} 4 | Debug 5 | AnyCPU 6 | WinExe 7 | Tests 8 | Tests 9 | 10 | 11 | bin\Debug\ 12 | True 13 | Full 14 | False 15 | True 16 | DEBUG;TRACE 17 | 18 | 19 | bin\Debug\ 20 | true 21 | full 22 | True 23 | true 24 | DEBUG;TRACE 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Form 39 | 40 | 41 | MainForm.cs 42 | 43 | 44 | 45 | 46 | 47 | 48 | Code 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | {18FEDA0C-D147-4286-B39A-01204808106A} 67 | ObjectListView 68 | 69 | 70 | 71 | 72 | MainForm.cs 73 | Designer 74 | 75 | 76 | -------------------------------------------------------------------------------- /SparkleLibrary/SparkleLibrary.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 9.0.30729 7 | 2.0 8 | {D63F9786-B608-4085-AF08-D909448B0426} 9 | Library 10 | Properties 11 | SparkleLibrary 12 | SparkleLibrary 13 | v3.5 14 | 512 15 | true 16 | sparkle-keyfile.snk 17 | 18 | 19 | true 20 | full 21 | false 22 | bin\Debug\ 23 | DEBUG;TRACE 24 | prompt 25 | 4 26 | 27 | 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 71 | -------------------------------------------------------------------------------- /docs/.static/initial.css: -------------------------------------------------------------------------------- 1 | /***** Global Settings *****/ 2 | 3 | html, body { 4 | border:0; 5 | margin:0; 6 | padding:0; 7 | font-size:100.01%; 8 | /* background-color: #d7d7ed;*/ 9 | background-color: #fafafa; 10 | } 11 | 12 | body { 13 | font:1em "gill sans mt", arial, helvetica, sans-serif; 14 | } 15 | 16 | /***** Common Formatting *****/ 17 | 18 | h1, h2, h3, h4, h5, h6 { 19 | margin:0; 20 | padding:0; 21 | font-weight:normal; 22 | } 23 | 24 | h1 { 25 | padding:30px 0 25px 0; 26 | letter-spacing:-1px; 27 | font:2em "gill sans mt", arial, helvetica, sans-serif; 28 | } 29 | 30 | h2 { 31 | padding:20px 0; 32 | letter-spacing:-1px; 33 | font:1.5em "gill sans mt", arial, helvetica, sans-serif; 34 | } 35 | 36 | h3 { 37 | padding:8px 0 8px; 38 | font:1.2em "gill sans mt", arial, helvetica, sans-serif; 39 | } 40 | 41 | h4 { 42 | padding:8px 0 8px; 43 | font:1.0em "gill sans mt", arial, helvetica, sans-serif; 44 | font-weight:bold; 45 | } 46 | 47 | p, ul, ol { 48 | margin:0; 49 | padding:0 0 18px 0; 50 | border-top: 1; 51 | } 52 | 53 | ul, ol { 54 | list-style:none; 55 | padding:0 0 18px 40px; 56 | } 57 | 58 | blockquote { 59 | margin:22px 40px; 60 | padding:0; 61 | } 62 | 63 | small { 64 | font-size:0.85em; 65 | } 66 | 67 | img { 68 | border:0; 69 | } 70 | 71 | sup { 72 | position:relative; 73 | bottom:0.3em; 74 | vertical-align:baseline; 75 | } 76 | 77 | sub { 78 | position:relative; 79 | bottom:-0.2em; 80 | vertical-align:baseline; 81 | } 82 | 83 | acronym, abbr { 84 | cursor:help; 85 | letter-spacing:1px; 86 | border-bottom:1px dashed; 87 | } 88 | 89 | /***** Links *****/ 90 | 91 | a, a:visited { 92 | text-decoration:none; 93 | } 94 | 95 | a:hover { 96 | text-decoration:underline; 97 | } 98 | /***** Forms *****/ 99 | 100 | form { 101 | margin:0; 102 | padding:0; 103 | display:inline; 104 | } 105 | 106 | input, select, textarea { 107 | font:1em "gill sans mt", arial, helvetica, sans-serif; 108 | } 109 | 110 | textarea { 111 | line-height:1.25; 112 | } 113 | 114 | label { 115 | cursor:pointer; 116 | } 117 | 118 | /***** Tables *****/ 119 | 120 | table { 121 | border:0; 122 | margin:0 0 18px 0; 123 | padding:0; 124 | } 125 | 126 | table tr td { 127 | padding:2px; 128 | } 129 | 130 | /***** Wrapper *****/ 131 | 132 | #wrap { 133 | width:960px; 134 | margin:0 auto; 135 | } 136 | 137 | /***** Global Classes *****/ 138 | 139 | .clear { clear:both; } 140 | 141 | .float-left { float:left; } 142 | .float-right { float:right; } 143 | 144 | .text-left { text-align:left; } 145 | .text-right { text-align:right; } 146 | .text-center { text-align:center; } 147 | .text-justify { text-align:justify; } 148 | 149 | .small { font:0.5em; } 150 | .bold { font-weight:bold; } 151 | .italic { font-style:italic; } 152 | .underline { border-bottom:1px solid; } 153 | .highlight { background:#ffc; } 154 | 155 | .wrap { width:960px;margin:0 auto; } 156 | 157 | .img-left { float:left;margin:4px 10px 4px 0; } 158 | .img-right { float:right;margin:4px 0 4px 10px; } 159 | 160 | .nomargin { margin:0; } 161 | .nopadding { padding:0; } 162 | .noindent { margin-left:0;padding-left:0; } 163 | .nobullet { list-style:none;list-style-image:none; } 164 | -------------------------------------------------------------------------------- /ObjectListView2008.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 10.00 3 | # Visual C# Express 2008 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListView2008", "ObjectListView\ObjectListView2008.csproj", "{18FEDA0C-D147-4286-B39A-01204808106A}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListViewDemo2008", "Demo\ObjectListViewDemo2008.csproj", "{C5332EAB-17B3-48B9-948E-33934B341AB0}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinter2008", "ListViewPrinter\ListViewPrinter2008.csproj", "{E73A10BD-2B5A-4BAC-897F-3A58CFC07631}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinterDemo2008", "ListViewPrinterDemo\ListViewPrinterDemo2008.csproj", "{40719365-FC03-46B8-8B6E-5FD1454712B6}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLibrary", "SparkleLibrary\SparkleLibrary.csproj", "{D63F9786-B608-4085-AF08-D909448B0426}" 13 | EndProject 14 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests2008", "Tests\Tests2008.csproj", "{8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}" 15 | EndProject 16 | Global 17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 18 | Debug|Any CPU = Debug|Any CPU 19 | Release|Any CPU = Release|Any CPU 20 | EndGlobalSection 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 22 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.Build.0 = Release|Any CPU 30 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 31 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.Build.0 = Debug|Any CPU 32 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.ActiveCfg = Release|Any CPU 33 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.Build.0 = Release|Any CPU 34 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 35 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.Build.0 = Debug|Any CPU 36 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.ActiveCfg = Release|Any CPU 37 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.Build.0 = Release|Any CPU 38 | {D63F9786-B608-4085-AF08-D909448B0426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {D63F9786-B608-4085-AF08-D909448B0426}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {D63F9786-B608-4085-AF08-D909448B0426}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {D63F9786-B608-4085-AF08-D909448B0426}.Release|Any CPU.Build.0 = Release|Any CPU 42 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 43 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.Build.0 = Debug|Any CPU 44 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.ActiveCfg = Release|Any CPU 45 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.Build.0 = Release|Any CPU 46 | EndGlobalSection 47 | GlobalSection(SolutionProperties) = preSolution 48 | HideSolutionNode = FALSE 49 | EndGlobalSection 50 | EndGlobal 51 | -------------------------------------------------------------------------------- /ObjectListView2010.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListView2010", "ObjectListView\ObjectListView2010.csproj", "{18FEDA0C-D147-4286-B39A-01204808106A}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListViewDemo2010", "Demo\ObjectListViewDemo2010.csproj", "{C5332EAB-17B3-48B9-948E-33934B341AB0}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinter2010", "ListViewPrinter\ListViewPrinter2010.csproj", "{E73A10BD-2B5A-4BAC-897F-3A58CFC07631}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinterDemo2010", "ListViewPrinterDemo\ListViewPrinterDemo2010.csproj", "{40719365-FC03-46B8-8B6E-5FD1454712B6}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLibrary2010", "SparkleLibrary\SparkleLibrary2010.csproj", "{D63F9786-B608-4085-AF08-D909448B0426}" 13 | EndProject 14 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests2010", "Tests\Tests2010.csproj", "{8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}" 15 | EndProject 16 | Global 17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 18 | Debug|Any CPU = Debug|Any CPU 19 | Release|Any CPU = Release|Any CPU 20 | EndGlobalSection 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 22 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.Build.0 = Release|Any CPU 30 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 31 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.Build.0 = Debug|Any CPU 32 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.ActiveCfg = Release|Any CPU 33 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.Build.0 = Release|Any CPU 34 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 35 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.Build.0 = Debug|Any CPU 36 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.ActiveCfg = Release|Any CPU 37 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.Build.0 = Release|Any CPU 38 | {D63F9786-B608-4085-AF08-D909448B0426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {D63F9786-B608-4085-AF08-D909448B0426}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {D63F9786-B608-4085-AF08-D909448B0426}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {D63F9786-B608-4085-AF08-D909448B0426}.Release|Any CPU.Build.0 = Release|Any CPU 42 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 43 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.Build.0 = Debug|Any CPU 44 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.ActiveCfg = Release|Any CPU 45 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.Build.0 = Release|Any CPU 46 | EndGlobalSection 47 | GlobalSection(SolutionProperties) = preSolution 48 | HideSolutionNode = FALSE 49 | EndGlobalSection 50 | EndGlobal 51 | -------------------------------------------------------------------------------- /ObjectListView2012.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2012 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListView2012", "ObjectListView\ObjectListView2012.csproj", "{18FEDA0C-D147-4286-B39A-01204808106A}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectListViewDemo2012", "Demo\ObjectListViewDemo2012.csproj", "{C5332EAB-17B3-48B9-948E-33934B341AB0}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinter2012", "ListViewPrinter\ListViewPrinter2012.csproj", "{E73A10BD-2B5A-4BAC-897F-3A58CFC07631}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewPrinterDemo2012", "ListViewPrinterDemo\ListViewPrinterDemo2012.csproj", "{40719365-FC03-46B8-8B6E-5FD1454712B6}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SparkleLibrary2012", "SparkleLibrary\SparkleLibrary2012.csproj", "{D63F9786-B608-4085-AF08-D909448B0426}" 13 | EndProject 14 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests2012", "Tests\Tests2012.csproj", "{8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}" 15 | EndProject 16 | Global 17 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 18 | Debug|Any CPU = Debug|Any CPU 19 | Release|Any CPU = Release|Any CPU 20 | EndGlobalSection 21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 22 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {18FEDA0C-D147-4286-B39A-01204808106A}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {18FEDA0C-D147-4286-B39A-01204808106A}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {C5332EAB-17B3-48B9-948E-33934B341AB0}.Release|Any CPU.Build.0 = Release|Any CPU 30 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 31 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Debug|Any CPU.Build.0 = Debug|Any CPU 32 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.ActiveCfg = Release|Any CPU 33 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631}.Release|Any CPU.Build.0 = Release|Any CPU 34 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 35 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Debug|Any CPU.Build.0 = Debug|Any CPU 36 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.ActiveCfg = Release|Any CPU 37 | {40719365-FC03-46B8-8B6E-5FD1454712B6}.Release|Any CPU.Build.0 = Release|Any CPU 38 | {D63F9786-B608-4085-AF08-D909448B0426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 39 | {D63F9786-B608-4085-AF08-D909448B0426}.Debug|Any CPU.Build.0 = Debug|Any CPU 40 | {D63F9786-B608-4085-AF08-D909448B0426}.Release|Any CPU.ActiveCfg = Release|Any CPU 41 | {D63F9786-B608-4085-AF08-D909448B0426}.Release|Any CPU.Build.0 = Release|Any CPU 42 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 43 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Debug|Any CPU.Build.0 = Debug|Any CPU 44 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.ActiveCfg = Release|Any CPU 45 | {8BB7445D-3428-40CC-AE38-14F6BC6C1BF9}.Release|Any CPU.Build.0 = Release|Any CPU 46 | EndGlobalSection 47 | GlobalSection(SolutionProperties) = preSolution 48 | HideSolutionNode = FALSE 49 | EndGlobalSection 50 | EndGlobal 51 | -------------------------------------------------------------------------------- /Tests/TestDateClusteringStrategy.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using NUnit.Framework; 3 | 4 | namespace BrightIdeasSoftware.Tests { 5 | 6 | [TestFixture] 7 | public class TestDateClusteringStrategy { 8 | 9 | readonly DateTime DATE1 = new DateTime(1998, 11, 30, 22, 23, 24); 10 | readonly DateTime DATE2 = new DateTime(1999, 12, 31, 22, 23, 24); 11 | 12 | [Test] 13 | public void Test_Construction_Empty() { 14 | DateTimeClusteringStrategy strategy = new DateTimeClusteringStrategy(); 15 | strategy.Column = new OLVColumn(); 16 | strategy.Column.AspectGetter = delegate(object x) { return DATE2; }; 17 | object result = strategy.GetClusterKey(null); 18 | 19 | Assert.AreEqual(new DateTime(1999, 12, 1), result); 20 | } 21 | 22 | [Test] 23 | public void Test_Construction_WithPortions() { 24 | DateTimeClusteringStrategy strategy = new DateTimeClusteringStrategy(DateTimePortion.Hour | DateTimePortion.Minute, "HH:mm"); 25 | strategy.Column = new OLVColumn(); 26 | strategy.Column.AspectGetter = delegate(object x) { return DATE1; }; 27 | object result = strategy.GetClusterKey(null); 28 | 29 | Assert.AreEqual(new DateTime(1, 1, 1, 22, 23, 0), result); 30 | } 31 | 32 | [Test] 33 | public void Test_Extracting_FromNull() { 34 | DateTimeClusteringStrategy strategy = new DateTimeClusteringStrategy(DateTimePortion.Hour | DateTimePortion.Minute, "HH:mm"); 35 | strategy.Column = new OLVColumn(); 36 | strategy.Column.AspectGetter = delegate(object x) { return null; }; 37 | object result = strategy.GetClusterKey(null); 38 | Assert.IsNull(result); 39 | } 40 | 41 | [Test] 42 | public void Test_GetClusterDisplayLabel_Plural() { 43 | DateTimeClusteringStrategy strategy = new DateTimeClusteringStrategy(DateTimePortion.Hour | DateTimePortion.Minute, "HH:mm"); 44 | strategy.Column = new OLVColumn(); 45 | strategy.Column.AspectGetter = delegate(object x) { return DATE1; }; 46 | ICluster cluster = new Cluster(strategy.GetClusterKey(null)); 47 | cluster.Count = 2; 48 | string result = strategy.GetClusterDisplayLabel(cluster); 49 | Assert.AreEqual("22:23 (2 items)", result); 50 | } 51 | 52 | [Test] 53 | public void Test_GetClusterDisplayLabel_Singular() { 54 | DateTimeClusteringStrategy strategy = new DateTimeClusteringStrategy(DateTimePortion.Year | DateTimePortion.Month, "MM-yy"); 55 | strategy.Column = new OLVColumn(); 56 | strategy.Column.AspectGetter = delegate(object x) { return DATE1; }; 57 | ICluster cluster = new Cluster(strategy.GetClusterKey(null)); 58 | cluster.Count = 1; 59 | string result = strategy.GetClusterDisplayLabel(cluster); 60 | Assert.AreEqual("11-98 (1 item)", result); 61 | } 62 | 63 | [Test] 64 | public void Test_GetClusterDisplayLabel_NullValue() { 65 | DateTimeClusteringStrategy strategy = new DateTimeClusteringStrategy(DateTimePortion.Year | DateTimePortion.Month, "HH:mm"); 66 | strategy.Column = new OLVColumn(); 67 | strategy.Column.AspectGetter = delegate(object x) { return DATE1; }; 68 | ICluster cluster = new Cluster(null); 69 | cluster.Count = 1; 70 | string result = strategy.GetClusterDisplayLabel(cluster); 71 | Assert.AreEqual(ClusteringStrategy.NULL_LABEL + " (1 item)", result); 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /ObjectListView/Implementation/Enums.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Enums - All enum definitions used in ObjectListView 3 | * 4 | * Author: Phillip Piper 5 | * Date: 31-March-2011 5:53 pm 6 | * 7 | * Change log: 8 | * 2011-03-31 JPP - Split into its own file 9 | * 10 | * Copyright (C) 2011-2014 Phillip Piper 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation, either version 3 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program. If not, see . 24 | * 25 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 26 | */ 27 | 28 | using System; 29 | using System.Collections.Generic; 30 | using System.Text; 31 | 32 | namespace BrightIdeasSoftware { 33 | 34 | public partial class ObjectListView { 35 | /// 36 | /// How does a user indicate that they want to edit cells? 37 | /// 38 | public enum CellEditActivateMode { 39 | /// 40 | /// This list cannot be edited. F2 does nothing. 41 | /// 42 | None = 0, 43 | 44 | /// 45 | /// A single click on a subitem will edit the value. Single clicking the primary column, 46 | /// selects the row just like normal. The user must press F2 to edit the primary column. 47 | /// 48 | SingleClick = 1, 49 | 50 | /// 51 | /// Double clicking a subitem or the primary column will edit that cell. 52 | /// F2 will edit the primary column. 53 | /// 54 | DoubleClick = 2, 55 | 56 | /// 57 | /// Pressing F2 is the only way to edit the cells. Once the primary column is being edited, 58 | /// the other cells in the row can be edited by pressing Tab. 59 | /// 60 | F2Only = 3 61 | } 62 | 63 | /// 64 | /// These values specify how column selection will be presented to the user 65 | /// 66 | public enum ColumnSelectBehaviour { 67 | /// 68 | /// No column selection will be presented 69 | /// 70 | None, 71 | 72 | /// 73 | /// The columns will be show in the main menu 74 | /// 75 | InlineMenu, 76 | 77 | /// 78 | /// The columns will be shown in a submenu 79 | /// 80 | Submenu, 81 | 82 | /// 83 | /// A model dialog will be presented to allow the user to choose columns 84 | /// 85 | ModelDialog, 86 | 87 | /* 88 | * NonModelDialog is just a little bit tricky since the OLV can change views while the dialog is showing 89 | * So, just comment this out for the time being. 90 | 91 | /// 92 | /// A non-model dialog will be presented to allow the user to choose columns 93 | /// 94 | NonModelDialog 95 | * 96 | */ 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /docs/.static/sparkle-animations.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Sparkle - Animation Examples 6 | 7 | 8 | 9 | 10 |

Simple animation

11 |

12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 |

Content on this page requires a newer version of Adobe Flash Player.

30 |

Get Adobe Flash player

31 |
32 | 33 |
34 | 35 |
36 |

37 |

Garish example

38 |

39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 |

Content on this page requires a newer version of Adobe Flash Player.

57 |

Get Adobe Flash player

58 |
59 | 60 |
61 | 62 |
63 |

64 | 65 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /docs/.static/structure.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | margin: 0 auto; 4 | position: relative; 5 | z-index: 1; 6 | margin-bottom: 50px; 7 | width:auto; 8 | max-width:900px; 9 | width:expression(document.body.clientWidth > 900 ? "900px": "auto" ); /* IE6 hack for missing max-width */ 10 | top: 0px; 11 | background-color: #fafafa; 12 | } 13 | 14 | cite { 15 | font-style: normal; 16 | color: #cc6C00; 17 | } 18 | 19 | .docutils tr { 20 | border: 1px solid #CCCCCC; 21 | } 22 | 23 | .pull-quote { 24 | font-style: italic; 25 | } 26 | 27 | .pull-quote p { 28 | padding: 1px 0px 2px 0px; 29 | } 30 | 31 | .attribution { 32 | font-style: normal; 33 | font-size: 0.9em; 34 | } 35 | 36 | .left-padded { 37 | padding: 0 15px 0px 0px; 38 | float: left; 39 | } 40 | 41 | .dialog h1 { 42 | color: #FFFFFF; 43 | padding: 20px 0 0 8px; 44 | font-size: 3em; 45 | } 46 | .dialog h1 a { 47 | color: #FFFFFF; 48 | } 49 | .dialog h2 { 50 | color: #E0E0E0; 51 | padding: 0 0 0 8px; 52 | font-size: 1.5em; 53 | } 54 | .dialog h4 { 55 | color: #E0E0E0; 56 | padding: 20px 0 0 8px; 57 | font-size: 1.5em; 58 | text-align:center; 59 | } 60 | .dialog h4 a { 61 | color: #E0E0E0; 62 | } 63 | 64 | .rubric { 65 | margin: 20px 20px 0px 10px; 66 | font: italic 1.2em georgia; 67 | text-align:left; 68 | } 69 | 70 | div.navBar{ 71 | float:right; 72 | width: 25%; 73 | text-align:center; 74 | padding: 0 0 0 20px; 75 | } 76 | div.navBar h3 { 77 | padding: 10px 0px 0px 0px; 78 | font-size: 1.2em; 79 | font-weight: normal; 80 | } 81 | div.navBar p { 82 | color: #333333; 83 | font-size: 0.7em; 84 | padding: 0; 85 | } 86 | 87 | div.body { 88 | width: 95%; 89 | color: #333333; 90 | margin: 0px 20px 0px 20px; 91 | } 92 | div.body h1 { 93 | display: none; 94 | background-color: #00ff00; 95 | } 96 | 97 | div.body h2 { 98 | padding: 0; 99 | margin: 20px 0px 20px 0px; 100 | border-bottom: dotted #0066FF 2px; 101 | } 102 | 103 | div.body h3 { 104 | padding: 0; 105 | margin:8px 0 12px; 106 | border-bottom: solid #6699FF 1px; 107 | } 108 | 109 | div.body h4 { 110 | padding: 0; 111 | margin:8px 0 12px; 112 | border-bottom: dotted #6699FF 1px; 113 | } 114 | 115 | .singlelinecallout.admonition { 116 | margin: 0px 0px 20px 0px; 117 | padding: 4px 4px 4px 4px; 118 | background-color: #FFBF80; 119 | border: solid #9999FF 1px; 120 | } 121 | .first.admonition-title { 122 | font: italic 1.2em georgia; 123 | padding: 0px 0px 0px 0px; 124 | text-align:center; 125 | } 126 | 127 | .singlelinecallout.admonition .last { 128 | display: none; 129 | } 130 | 131 | #sidebar { 132 | float: right; 133 | width: 40%; 134 | } 135 | #sidebar h3 { 136 | font: bold italic 1.2em georgia; 137 | padding: 12px 0px 12px 0px; 138 | text-align:center; 139 | } 140 | #sidebar p { 141 | line-height: 1.4; 142 | color: #333333; 143 | } 144 | 145 | a.headerlink { 146 | color: #c60f0f; 147 | font-size: 0.8em; 148 | padding: 0 4px 0 4px; 149 | text-decoration: none; 150 | visibility: hidden; 151 | } 152 | 153 | h1:hover > a.headerlink, 154 | h2:hover > a.headerlink, 155 | h3:hover > a.headerlink, 156 | h4:hover > a.headerlink, 157 | h5:hover > a.headerlink, 158 | h6:hover > a.headerlink, 159 | dt:hover > a.headerlink { 160 | visibility: visible; 161 | } 162 | 163 | a.headerlink:hover { 164 | background-color: #c60f0f; 165 | color: white; 166 | } 167 | 168 | .footer { 169 | margin-top: 16px; 170 | padding-top: 8px; 171 | border-top: dotted #6699FF 1px; 172 | text-align: center; 173 | color: #666666; 174 | } 175 | 176 | .recipes { 177 | font-size: 1.1em; 178 | } 179 | -------------------------------------------------------------------------------- /docs/.static/objectlistview-animations.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ObjectListView - Animation Examples 6 | 7 | 8 | 9 | 10 |

ObjectListView animations

11 |

12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 |

Content on this page requires a newer version of Adobe Flash Player.

30 |

Get Adobe Flash player

31 |
32 | 33 |
34 | 35 |
36 |

37 |

Simple star spinning example

38 |

39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 |

Content on this page requires a newer version of Adobe Flash Player.

57 |

Get Adobe Flash player

58 |
59 | 60 |
61 | 62 |
63 |

64 | 65 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /docs/.templates/layout.html: -------------------------------------------------------------------------------- 1 | {# Filename: .templates/layout.html #} 2 | {% extends '!layout.html' %} 3 | 4 | {% block extrahead %} 5 | 6 | 7 | {% endblock %} 8 | 9 | {% block rootrellink %} 10 |
  • 11 | ObjectListView (v{{ release }}) 12 | » 13 |
  • 14 | {% endblock %} 15 | 16 | {% block relbar1 %} 17 |
    18 |
    19 |
    20 | 21 | 22 |

    {{ title }}

    23 | {% if current_page_name == "search" %} 24 |

    Darn! Where is that needle?

    25 | {% else %} 26 | {% if current_page_name == "genindex" %} 27 |

    What should I put here?

    28 | {% else %} 29 |

    {{ meta["Subtitle"] }}

    30 | {% endif %} 31 | {% endif %} 32 |
    33 |
    34 |
    35 |
    36 | 63 | {% endblock %} 64 | 65 | {% block relbar2 %} 66 | 75 | 76 | {% endblock %} 77 | 78 | {% block sidebar1 %} 79 | {% endblock %} 80 | 81 | {% block sidebar2 %} 82 | {% endblock %} 83 | -------------------------------------------------------------------------------- /ListViewPrinterDemo/ListViewPrinterDemo2005.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Debug 4 | AnyCPU 5 | 8.0.50727 6 | 2.0 7 | {40719365-FC03-46B8-8B6E-5FD1454712B6} 8 | WinExe 9 | Properties 10 | ListViewPrinterDemo 11 | ListViewPrinterDemo 12 | 13 | 14 | true 15 | full 16 | false 17 | bin\Debug\ 18 | DEBUG;TRACE 19 | prompt 20 | 4 21 | 22 | 23 | pdbonly 24 | true 25 | bin\Release\ 26 | TRACE 27 | prompt 28 | 4 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | Form 41 | 42 | 43 | Form1.cs 44 | 45 | 46 | 47 | 48 | Form1.cs 49 | Designer 50 | 51 | 52 | ResXFileCodeGenerator 53 | Resources.Designer.cs 54 | Designer 55 | 56 | 57 | True 58 | Resources.resx 59 | 60 | 61 | SettingsSingleFileGenerator 62 | Settings.Designer.cs 63 | 64 | 65 | True 66 | Settings.settings 67 | True 68 | 69 | 70 | 71 | 72 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631} 73 | ListViewPrinter 74 | 75 | 76 | {18FEDA0C-D147-4286-B39A-01204808106A} 77 | ObjectListView 78 | 79 | 80 | 81 | 82 | Always 83 | 84 | 85 | 86 | 93 | -------------------------------------------------------------------------------- /SparkleLibrary/Animation/Animateable.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Animateable - A item that can be placed in an animation 3 | * 4 | * Author: Phillip Piper 5 | * Date: 23/10/2009 10:39 PM 6 | * 7 | * Change log: 8 | * 2009-10-23 JPP - Initial version 9 | * 10 | * To do: 11 | * 12 | * Copyright (C) 2009 Phillip Piper 13 | * 14 | * This program is free software: you can redistribute it and/or modify 15 | * it under the terms of the GNU General Public License as published by 16 | * the Free Software Foundation, either version 3 of the License, or 17 | * (at your option) any later version. 18 | * 19 | * This program is distributed in the hope that it will be useful, 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | * GNU General Public License for more details. 23 | * 24 | * You should have received a copy of the GNU General Public License 25 | * along with this program. If not, see . 26 | * 27 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 28 | */ 29 | 30 | using System; 31 | using System.Collections.Generic; 32 | 33 | namespace BrightIdeasSoftware 34 | { 35 | public interface IAnimateable 36 | { 37 | /// 38 | /// Gets or sets the animation that this component belongs to 39 | /// 40 | Animation Animation { get; set; } 41 | 42 | /// 43 | /// This component is being started. It should acquire any resources that it needs 44 | /// 45 | void Start(); 46 | 47 | /// 48 | /// A unit of time has passed and the animation component should advance its state 49 | /// if sufficient time has passed. 50 | /// 51 | /// The number of milliseconds since Start() was called. 52 | /// True if Tick() should be called again 53 | bool Tick(long elapsed); 54 | 55 | /// 56 | /// Revert this component to its initial state. 57 | /// 58 | void Reset(); 59 | 60 | /// 61 | /// This component has been stopped. It should release any resources acquired in Start(). 62 | /// 63 | void Stop(); 64 | } 65 | 66 | /// 67 | /// A Animateable is the base class for any item that can be 68 | /// placed within an Animation. 69 | /// 70 | public class Animateable : IAnimateable 71 | { 72 | /// 73 | /// Gets or sets the animation that this component belongs to 74 | /// 75 | public Animation Animation { 76 | get { return animation; } 77 | set { animation = value; } 78 | } 79 | private Animation animation; 80 | 81 | /// 82 | /// This component is being started. It should acquire any resources that it needs 83 | /// 84 | public virtual void Start() { 85 | } 86 | 87 | /// 88 | /// A unit of time has passed and the animation component should advance its state 89 | /// if sufficient time has passed. 90 | /// 91 | /// The number of milliseconds since Start() was called. 92 | /// True if Tick() should be called again 93 | public virtual bool Tick(long elapsed) { 94 | return false; 95 | } 96 | 97 | /// 98 | /// Revert this component to its initial state. 99 | /// 100 | public virtual void Reset() { 101 | } 102 | 103 | /// 104 | /// This component has been stopped. It should release any resources acquired in Start(). 105 | /// 106 | public virtual void Stop() { 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /Tests/TestFlagClusteringStrategy.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using NUnit.Framework; 4 | 5 | namespace BrightIdeasSoftware.Tests { 6 | [TestFixture] 7 | public class TestFlagClusteringStrategy { 8 | 9 | [Test] 10 | public void Test_EnumConstruction_Values() { 11 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 12 | Assert.AreEqual(4, strategy.Values.Length); 13 | Assert.Contains(2, strategy.Values); 14 | Assert.Contains(4, strategy.Values); 15 | Assert.Contains(8, strategy.Values); 16 | Assert.Contains(16, strategy.Values); 17 | } 18 | 19 | [Test] 20 | public void Test_EnumConstruction_Labels() { 21 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 22 | Assert.AreEqual(4, strategy.Labels.Length); 23 | Assert.Contains("FlagValue1", strategy.Labels); 24 | Assert.Contains("FlagValue2", strategy.Labels); 25 | Assert.Contains("FlagValue3", strategy.Labels); 26 | Assert.Contains("FlagValue4", strategy.Labels); 27 | } 28 | 29 | [Test] 30 | public void Test_GetClusterKey() { 31 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 32 | strategy.Column = new OLVColumn(); 33 | strategy.Column.AspectGetter = delegate(object x) { return TestFlagEnum.FlagValue1 | TestFlagEnum.FlagValue4; }; 34 | object result = strategy.GetClusterKey(null); 35 | Assert.IsInstanceOf(result); 36 | Assert.AreEqual(2, ((ICollection)result).Count); 37 | Assert.Contains((ulong)TestFlagEnum.FlagValue1, result as ICollection); 38 | Assert.Contains((ulong)TestFlagEnum.FlagValue4, result as ICollection); 39 | } 40 | 41 | [Test] 42 | public void Test_GetClusterKey_ZeroValue() { 43 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 44 | strategy.Column = new OLVColumn(); 45 | strategy.Column.AspectGetter = delegate(object x) { return 0; }; 46 | object result = strategy.GetClusterKey(null); 47 | Assert.IsInstanceOf(result); 48 | Assert.AreEqual(0, ((ICollection)result).Count); 49 | } 50 | 51 | [Test] 52 | public void Test_GetClusterKey_NonNumericValue() { 53 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 54 | strategy.Column = new OLVColumn(); 55 | strategy.Column.AspectGetter = delegate(object x) { return "not number"; }; 56 | object result = strategy.GetClusterKey(null); 57 | Assert.IsInstanceOf(result); 58 | Assert.AreEqual(0, ((ICollection)result).Count); 59 | } 60 | 61 | [Test] 62 | public void Test_GetClusterKey_NonConvertibleValue() { 63 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 64 | strategy.Column = new OLVColumn(); 65 | strategy.Column.AspectGetter = delegate(object x) { return new object(); }; 66 | object result = strategy.GetClusterKey(null); 67 | Assert.IsInstanceOf(result); 68 | Assert.AreEqual(0, ((ICollection)result).Count); 69 | } 70 | 71 | [Test] 72 | public void Test_GetClusterDisplayLabel() { 73 | FlagClusteringStrategy strategy = new FlagClusteringStrategy(typeof(TestFlagEnum)); 74 | ICluster cluster = new Cluster(TestFlagEnum.FlagValue2); 75 | cluster.Count = 2; 76 | string result = strategy.GetClusterDisplayLabel(cluster); 77 | Assert.AreEqual("FlagValue2 (2 items)", result); 78 | } 79 | 80 | [Flags] 81 | private enum TestFlagEnum { 82 | FlagValue1 = 2, 83 | FlagValue2 = 4, 84 | FlagValue3 = 8, 85 | FlagValue4 = 16 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /docs/blog7.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: Taking care of the hierarchy 4 | 5 | .. _blog-hierarchicalcheckboxes: 6 | 7 | Hierarchy-aware checkboxes 8 | ========================== 9 | 10 | 2014-02-26 11 | 12 | Hierarchical checkboxes is that neat ability where the checked-ness of a branch summarizes the checked-ness of all its subitems. If the branch is checked, you know that everything under that branch is checked. If the branch is unchecked, then similarly everything under that branch is unchecked. If the branch is indeterminate, you know that there is a mix of checked and unchecked items within that branch. 13 | 14 | Logic wise, the task is simple. When a TreeListView is first shown, examine all subitems recursively of every top level branch: if all the subitems (recursively) are checked, the branch should be checked; if all the subitems (again, recursively) are unchecked, the branch should be unchecked. Otherwise, the branch is indeterminate. Once displayed, when the user checks a branch, check all items recursively under that branch. When the user unchecks a branch, uncheck all the subitems. 15 | 16 | For small trees, this would work fine. But for large trees, that would be terrible. In the ObjectListView demo, there is a `TreeListView` that browses the C: drive. On my dev machine, to determine if the top level branch should be checked or not, the control would have to traverse more than 600,000 files in 80,000 directories! Checking or unchecking the c: branch would require checking/unchecking about 700,000 subitems. It doesn't matter how fast your computer is, processing that many items is going to take a good chunk of time. Worse, all the processing is UI related, so it's going to happen on the UI thread, freezing the interface while it's going on. We have to find a better way. 17 | 18 | Break the problem into two parts: deciding if a branch is checked or not, marking a branch as checked or unchecked. 19 | 20 | One major problem is that we don't know the checkedness of all the subitems. When an ObjectListView has a `CheckStateGetter` installed, the only way we can know if an item is checked is by calling the `CheckStateGetter` on that item. We can't reason about what is checked or unchecked -- we always have to ask. In our disk browser example, we would have to ask all 700,000 items if it was checked. That's never going to work, so with hierarchical checkboxes, we don't allow `CheckStateGetters` to be installed. 21 | 22 | If nothing is checked, the problem is simple. 23 | 24 | If the complete sets of checked items is given to the control (setting the `CheckedObjects` property), we can solve the problem: 25 | 26 | #. Clear the checkedness of all items. 27 | #. Check all the given items 28 | #. For each ancestor of the given items, calculate the ancestors checkedness by looking at the checkedness of its immediate subitems. 29 | 30 | To calculate the ancestors of an item, we need a new delegate: `ParentGetter`. This is only used when using hierarchical checkboxes. 31 | 32 | Normally, the TreeListView calculates the checkedness of an item just before it is displayed. But for hierarchical checkboxes, we need to know that checkedness of each subitem to know the checkedness of a branch. 33 | 34 | Hierarchy and `CheckedObjects` 35 | ------------------------------ 36 | 37 | The next problem is how does the `TreeListView` tell the programmer which objects have been checked. This is done through the `CheckedObjects` collection. This collection will return: 38 | 39 | * all objects which were specifically checked by the user 40 | * all objects that were set in the `CheckedObjects` collection, and that have not been unchecked by the user 41 | * all objects whose ancestor was checked by the user AND that have been made visible in the control 42 | 43 | What happens if you check an object that doesn't exist in the tree? Should it still be returned in `CheckedObjects`? 44 | 45 | Yes. There is no easy way for the control to know the difference between an object that doesn't exist and an object that hasn't yet been revealed. So, if an object is checked (either through calling `CheckObject()` or through setting `CheckedObjects`), it will be returned in `CheckedObjects` property. 46 | 47 | Filtering 48 | --------- 49 | 50 | Filtering and `TreeListView` is always tricky. 51 | 52 | Hierarchical checkboxes ignores filtering. If the user checks a parent, all descendents will also be checked, regardless of whether or not they pass any installed filtering. 53 | -------------------------------------------------------------------------------- /ObjectListView/Filtering/Cluster.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Cluster - Implements a simple cluster 3 | * 4 | * Author: Phillip Piper 5 | * Date: 3-March-2011 10:53 pm 6 | * 7 | * Change log: 8 | * 2011-03-03 JPP - First version 9 | * 10 | * Copyright (C) 2011-2014 Phillip Piper 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation, either version 3 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program. If not, see . 24 | * 25 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 26 | */ 27 | 28 | using System; 29 | using System.Collections.Generic; 30 | using System.Text; 31 | 32 | namespace BrightIdeasSoftware { 33 | 34 | /// 35 | /// Concrete implementation of the ICluster interface. 36 | /// 37 | public class Cluster : ICluster { 38 | 39 | #region Life and death 40 | 41 | /// 42 | /// Create a cluster 43 | /// 44 | /// The key for the cluster 45 | public Cluster(object key) { 46 | this.Count = 1; 47 | this.ClusterKey = key; 48 | } 49 | 50 | #endregion 51 | 52 | #region Public overrides 53 | 54 | /// 55 | /// Return a string representation of this cluster 56 | /// 57 | /// 58 | public override string ToString() { 59 | return this.DisplayLabel ?? "[empty]"; 60 | } 61 | 62 | #endregion 63 | 64 | #region Implementation of ICluster 65 | 66 | /// 67 | /// Gets or sets how many items belong to this cluster 68 | /// 69 | public int Count { 70 | get { return count; } 71 | set { count = value; } 72 | } 73 | private int count; 74 | 75 | /// 76 | /// Gets or sets the label that will be shown to the user to represent 77 | /// this cluster 78 | /// 79 | public string DisplayLabel { 80 | get { return displayLabel; } 81 | set { displayLabel = value; } 82 | } 83 | private string displayLabel; 84 | 85 | /// 86 | /// Gets or sets the actual data object that all members of this cluster 87 | /// have commonly returned. 88 | /// 89 | public object ClusterKey { 90 | get { return clusterKey; } 91 | set { clusterKey = value; } 92 | } 93 | private object clusterKey; 94 | 95 | #endregion 96 | 97 | #region Implementation of IComparable 98 | 99 | /// 100 | /// Return an indication of the ordering between this object and the given one 101 | /// 102 | /// 103 | /// 104 | public int CompareTo(object other) { 105 | if (other == null || other == System.DBNull.Value) 106 | return 1; 107 | 108 | ICluster otherCluster = other as ICluster; 109 | if (otherCluster == null) 110 | return 1; 111 | 112 | string keyAsString = this.ClusterKey as string; 113 | if (keyAsString != null) 114 | return String.Compare(keyAsString, otherCluster.ClusterKey as string, StringComparison.CurrentCultureIgnoreCase); 115 | 116 | IComparable keyAsComparable = this.ClusterKey as IComparable; 117 | if (keyAsComparable != null) 118 | return keyAsComparable.CompareTo(otherCluster.ClusterKey); 119 | 120 | return -1; 121 | } 122 | 123 | #endregion 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /ObjectListView/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.1 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace BrightIdeasSoftware.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BrightIdeasSoftware.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | internal static System.Drawing.Bitmap ClearFiltering { 64 | get { 65 | object obj = ResourceManager.GetObject("ClearFiltering", resourceCulture); 66 | return ((System.Drawing.Bitmap)(obj)); 67 | } 68 | } 69 | 70 | internal static System.Drawing.Bitmap ColumnFilterIndicator { 71 | get { 72 | object obj = ResourceManager.GetObject("ColumnFilterIndicator", resourceCulture); 73 | return ((System.Drawing.Bitmap)(obj)); 74 | } 75 | } 76 | 77 | internal static System.Drawing.Bitmap Filtering { 78 | get { 79 | object obj = ResourceManager.GetObject("Filtering", resourceCulture); 80 | return ((System.Drawing.Bitmap)(obj)); 81 | } 82 | } 83 | 84 | internal static System.Drawing.Bitmap SortAscending { 85 | get { 86 | object obj = ResourceManager.GetObject("SortAscending", resourceCulture); 87 | return ((System.Drawing.Bitmap)(obj)); 88 | } 89 | } 90 | 91 | internal static System.Drawing.Bitmap SortDescending { 92 | get { 93 | object obj = ResourceManager.GetObject("SortDescending", resourceCulture); 94 | return ((System.Drawing.Bitmap)(obj)); 95 | } 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /docs/blog2.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: What's wrong with the ToolTip class? 4 | 5 | .. _blog-tooltip: 6 | 7 | Technical Blog - Tool tips 8 | ========================== 9 | 10 | 27 May 2009 11 | 12 | I wanted to be able to customise the tool tip that shows when the mouse is 13 | hovered over a listview cell. Primarily, I wanted to be able to make it look 14 | like a balloon, but any other customisations would be a bonus. 15 | 16 | As always, the simplest approach is the best, so I created a `ToolTip` and installed it on the `ObjectListView`:: 17 | 18 | protected override void OnCreateControl() { 19 | this.toolTip = new ToolTip(); 20 | this.toolTip.BackColor = Color.Red; 21 | this.toolTip.SetToolTip(this, "using normal tooltip"); 22 | } 23 | 24 | This works and gives tooltips with a red background. You can even make the hover 25 | tooltip show a balloon like this:: 26 | 27 | protected override void OnCreateControl() { 28 | this.toolTip = new ToolTip(); 29 | this.toolTip.IsBalloon = true; 30 | this.toolTip.SetToolTip(this, "using normal tooltip"); 31 | } 32 | 33 | .. image:: images/blog2-balloon1.png 34 | 35 | Winner! Less than an hour and I can customise the tool tip. 36 | 37 | 38 | Reality bites back 39 | ------------------ 40 | 41 | But then I noticed 42 | one small problem -- it didn't actually work. 43 | If I did this:: 44 | 45 | protected override void OnCreateControl() { 46 | this.toolTip = new ToolTip(); 47 | this.toolTip.SetToolTip(this, "using normal tooltip"); 48 | this.toolTip.IsBalloon = true; 49 | } 50 | 51 | No tool tip appeared at all. In fact, changing one of several properties 52 | (*IsBalloon*, *ShowAlways*, *StripAmpersands*, *UseAnimation*, *UseFading*) after the tool 53 | tip was installed AND the listview was created caused the tooltip to disappear. 54 | 55 | The problem is that when these properties are changed on a `ToolTip`, the 56 | underlying handle is destroyed and then recreated. However, when the underlying 57 | control handle is recreated, it is not reinstalled into the `ListView` (or any 58 | other control that uses a `ToolTip`). 59 | 60 | We could get around this by subclassing `ToolTip`, and whenever any of those 61 | properties are changed, we could call `SetToolTip()` to force the new handle to 62 | be installed. 63 | 64 | This almost works except that I wanted to be able to change these settings 65 | during a `TTN_GETDISPINFO` callback (this is the notification message that is sent 66 | when a tooltip control wants to know what text it should show). I want to do 67 | this so that each cell can decide how it wants its tooltip to appear. If 68 | something in a cell is important, it should be able to be in red with an icon 69 | and title. 70 | 71 | But it seems that this is just impossible. Any trick I tried during that 72 | callback simply resulted in the tooltip disappearing for good. 73 | 74 | Not getting a Handle on things 75 | ------------------------------ 76 | 77 | It should be possible to get around all these problems and just change the 78 | `IsBalloon` setting by changing the `WindowStyle`. To do that, all we need is 79 | the handle to the tooltip control. But `ToolTip` doesn't make that available: it 80 | doesn't have a `Handle` property. It also doesn't expose a `WndProc` method that can 81 | be overridden. At this point, I began to be seriously displeased with the 82 | `ToolTip` class. 83 | 84 | Another ToolTipControl 85 | ---------------------- 86 | 87 | To get around all these problems, I wrote `ToolTipControl`, a `NativeWindow` 88 | which wraps a tooltip control. It is not a replacement for a `ToolTip`, but that 89 | does all the tool tip shown by a `ListView` or its header to be customised in just 90 | about any way you would like. 91 | 92 | .. image:: images/blog2-balloon2.png 93 | 94 | The Vista from here is not so good 95 | ---------------------------------- 96 | 97 | But it's still not perfect. It works flawlessly on XP, but under Vista, it has some 98 | limits. Most significantly, changing to balloon style during an event does not work 99 | reliably. It works mostly, but occassionally, the tool tip doesn't recalculate 100 | its display rectangle correctly. It displays the balloon tip using the same bounds 101 | as if it wasn't a balloon. If you set `IsBalloon` outside of an event, it works fine. 102 | 103 | One final problem is that setting the `ForeColor` and `BackColor` simply doesn't work. 104 | I suspect that these colours are controlled by the system theme, but I'm not sure about 105 | that. It's certainly not documented anywhere. 106 | -------------------------------------------------------------------------------- /docs/overlays.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: What's underneath the Overlays 4 | 5 | .. _overlays-label: 6 | 7 | Overlays and Decorations 8 | ======================== 9 | 10 | Overlays grew out of the desire to put a background image on a ListView. 11 | (See :ref:`blog-overlays` for the details). 12 | 13 | `ObjectListView` provides a normal set of operations to manage overlays:: 14 | 15 | public void AddOverlay(IOverlay overlay); 16 | public bool HasOverlay(IOverlay overlay); 17 | public void RemoveOverlay(IOverlay overlay); 18 | 19 | The `IOverlay` interface is very simple:: 20 | 21 | public interface IOverlay { 22 | void Draw(ObjectListView olv, Graphics g, Rectangle r); 23 | } 24 | 25 | Within the `Draw()` method, your implementation can draw whatever it likes. 26 | 27 | In the Overlays.cs file, you can find several examples of overlays that 28 | can serve as your model for implementation. The two most common overlays 29 | are image overlays and text overlays. 30 | 31 | * `ImageOverlay` draws an image over the `ObjectListView` 32 | 33 | * `TextOverlay` is a highly configurable overlay that can draw bordered, colored 34 | and backgrounded text. The text can be rotated. 35 | 36 | These two overlays are so common that `ObjectListView` comes with one of each 37 | predefined. These predefined overlays are exposed to the IDE, so that they 38 | can be configured directly from there. So, for the majority of cases, this 39 | is the only understanding of overlays that you will need. 40 | 41 | Disabling overlays 42 | ------------------ 43 | 44 | Though they seem simple, overlays are actually quite tricky underneath. 45 | If they are causing problems (for example, if you are seeing `GlassPanelForms` 46 | turn up where you are not expecting them), you can completely disable them 47 | by setting `UseOverlays` to *false*. 48 | 49 | Implementation 50 | -------------- 51 | 52 | Overlays are implemented using the Layered Window API. This API allows a 53 | toplevel windows to be translucent and partially transparent. Internally, 54 | the `ObjectListView` creates a transparent window, positions it above the 55 | control, and then paints the overlays onto that window. 56 | 57 | .. image:: images/overlay.png 58 | 59 | So, when displaying overlays, the `ObjectListView` creates a new 60 | top-level window, and puts that above the control. In this way, 61 | it looks like the overlays are drawn onto the list, but in reality, 62 | they are completely separate. 63 | 64 | And the two shall become one 65 | ---------------------------- 66 | 67 | The tricky bits of the overlay implementation are making the 68 | overlay window acts as if it is actually part of the `ObjectListView`. 69 | 70 | Obviously, when the `ObjectListView` moves, the overlay window must 71 | move too. If we could make the overlay window a child window of the 72 | `ObjectListView`, then Windows would make that happen for us. But 73 | layered windows *have* to be top level windows. So we have to 74 | manually move the overlay window when the `ObjectListView` moves. 75 | 76 | Similarly, when the `ObjectListView` is resized, we have to manually 77 | resize the overlay window to match the new size. If we do this resizing 78 | in realtime as the user is resizing the window, it slows down the resizing 79 | considerably. Apparently, resizing a large Layered window is an expensive 80 | operation. So, we simply hide the overlays while the window is resized, 81 | and then show them again once the resizing is complete. 82 | 83 | The most difficult bit of making the overlay behaves as if it 84 | were part of the `ObjectListView` is when the `ObjectListView` is hidden. 85 | Simply being hidden (i.e. Visible = false) isn't a problem, but hidden 86 | by placing other controls over the top of the `ObjectListView` is a major 87 | problem. 88 | 89 | Remember the overlay window is a separate top level window. Changing the 90 | ordering of child windows within another top level window doesn't affect the 91 | overlay window - it thinks it is still directly over the `ObjectListView`. Which 92 | it is, in a way, it's just that other controls are now over the top of the 93 | `ObjectListView`. The overlay window will still be visible, but the 94 | `ObjectListView` will not be, so the overlays will be drawn on top of whatever 95 | controls are over the `ObjectListView`. 96 | 97 | If you think putting controls over the top of other control sounds like a 98 | very unlikely scenario, this is exactly how tab controls work. They play with 99 | the z-ordering of their TabPanels, moving the current TabPanel in front of the 100 | other tabs. As currently implemented, `ObjectListView` understand the standard 101 | Window Forms TabControl, and will correctly hide their overlays when a parent 102 | TabControl switches tabs. 103 | 104 | But if you are using a non-standard TabControl-like control, you will have to 105 | do this hiding of overlay windows yourself. It is enough to call `HideOverlays()` 106 | at the right time. `ObjectListView` will show their overlays when they are needed. 107 | 108 | So, if you find in your app, that a parent control is hiding your `ObjectListView` 109 | (as it should), but you can still see the overlays (when you shouldn't), 110 | you have to call `HideOverlays()` when the `ObjectListView` is hidden. 111 | -------------------------------------------------------------------------------- /docs/samples.rst: -------------------------------------------------------------------------------- 1 | .. -*- coding: UTF-8 -*- 2 | 3 | :Subtitle: Graphic examples of loving a ListView 4 | 5 | .. _samples-label: 6 | 7 | Samples 8 | ======= 9 | 10 | These are examples of what can be done with an `ObjectListView`. 11 | 12 | +------------------------------------------+----------------------------------------------+ 13 | | | | 14 | | `Rearrangeable TreeListView`_ | .. image:: images/dragdrop-tlv-small.png | 15 | | | :align: center | 16 | | Shows how to drag and drop branches on | | 17 | | a `TreeListView`. | | 18 | | | | 19 | | | | 20 | +------------------------------------------+----------------------------------------------+ 21 | | | | 22 | | `Foobar Lookalike`_ | .. image:: images/foobar-lookalike-small.png | 23 | | | :align: center | 24 | | Shows how to creatively use decorations, | | 25 | | and hot item styles. | | 26 | | | | 27 | | | | 28 | | | | 29 | +------------------------------------------+----------------------------------------------+ 30 | | | | 31 | | `Task List`_ | .. image:: images/task-list-small.png | 32 | | | :align: center | 33 | | Shows a more sophisticated renderer as | | 34 | | well as demonstrating how to combine a | | 35 | | decoration with a renderer. | | 36 | | | | 37 | +------------------------------------------+----------------------------------------------+ 38 | 39 | 40 | Rearrangeable TreeListView 41 | -------------------------- 42 | 43 | `TreeListViews` are cool, but it seems that they are tricky. One task that seems to 44 | cause problems for some people is how to make the tree rearrangeable -- that is, 45 | how can I let the users drag the branches around. 46 | 47 | `This sample`_ shows how to do exactly that, and :ref:`this blog ` describes the whole process. 48 | 49 | .. _This sample: http://sourceforge.net/projects/objectlistview/files/objectlistview/TreeListViewDragDrop.7z 50 | 51 | .. image:: images/dragdrop-tlv.png 52 | 53 | Foobar Lookalike 54 | ---------------- 55 | 56 | Those who dwell in the house of cool know that black goes with everything. 57 | 58 | .. image:: images/foobar-lookalike.png 59 | 60 | A normal ListView cannot display things that exceed the bounds of their cells. 61 | But `ObjectListView` has decorations and overlays so it is much more flexible. 62 | 63 | The dark background is a simple `BackColor` setting. The different colored text 64 | is handled throught a `FormatCell` event. The hot row highlighting is handled 65 | through normal `HotItemStyle` mechanism. The only interesting bit is that it 66 | uses the `LeftColumn` property to limit the cells that are highlighted as hot. 67 | 68 | The clever bit is getting the album artwork into the control. This is done 69 | through two types of decorations. In the first row in an album, cell 0 is given 70 | an `ImageDecoration` which shows a thumbnail of the artwork. This works, but the 71 | artwork isn't always correctly redrawn: it's only redrawn properly when cell 0 72 | is visible. 73 | 74 | To get around this problem, we install proxy decorations on cell 0 of all the 75 | other rows in the album. These proxies simply make the artwork decoration draw 76 | itself. In this way, the artwork is redrawn even when cell 0 of the first row is 77 | not visible. 78 | 79 | `Download from here`_ 80 | 81 | .. _Download from here: http://sourceforge.net/projects/objectlistview/files/objectlistview/FoobarLookalike.7z 82 | 83 | Task List 84 | --------- 85 | 86 | The Foobar example is cool, but this task list is useful. Displaying this kind 87 | of icon-title-description combination is a common task in many UI situations. 88 | 89 | .. image:: images/task-list.png 90 | 91 | This sample shows a custom `Decoration` that draws an icon, title and multiline 92 | description. 93 | 94 | `ObjectListView` comes with `DescribedTaskRenderer` which is a `Renderer` that 95 | does the same task. 96 | 97 | `Download sample project from here`_ 98 | 99 | .. _Download sample project from here: http://sourceforge.net/projects/objectlistview/files/objectlistview/VistaSelection.7z 100 | 101 | -------------------------------------------------------------------------------- /docs/Sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | http://objectlistview.sourceforge.net/cs/ 11 | 2009-05-12T21:17:01+00:00 12 | monthly 13 | 14 | 15 | http://objectlistview.sourceforge.net/cs/index.html 16 | 2009-05-12T21:17:01+00:00 17 | monthly 18 | 19 | 20 | http://objectlistview.sourceforge.net/cs/whatsnew.html 21 | 2009-05-12T21:17:14+00:00 22 | monthly 23 | 24 | 25 | http://objectlistview.sourceforge.net/cs/features.html 26 | 2009-05-12T13:50:01+00:00 27 | monthly 28 | 29 | 30 | http://objectlistview.sourceforge.net/cs/gettingStarted.html 31 | 2009-05-12T13:50:09+00:00 32 | monthly 33 | 34 | 35 | http://objectlistview.sourceforge.net/cs/recipes.html 36 | 2009-05-12T13:50:40+00:00 37 | monthly 38 | 39 | 40 | http://objectlistview.sourceforge.net/cs/faq.html 41 | 2009-05-12T13:49:55+00:00 42 | monthly 43 | 44 | 45 | http://objectlistview.sourceforge.net/cs/download.html 46 | 2009-05-12T13:49:45+00:00 47 | monthly 48 | 49 | 50 | http://objectlistview.sourceforge.net/cs/search.html 51 | 2009-05-12T21:17:03+00:00 52 | monthly 53 | 54 | 55 | http://objectlistview.sourceforge.net/cs/ownerDraw.html 56 | 2009-05-12T13:50:30+00:00 57 | monthly 58 | 59 | 60 | http://objectlistview.sourceforge.net/cs/cellEditing.html 61 | 2009-05-12T13:49:25+00:00 62 | monthly 63 | 64 | 65 | http://objectlistview.sourceforge.net/cs/dragdrop.html 66 | 2009-05-12T13:49:49+00:00 67 | monthly 68 | 69 | 70 | http://objectlistview.sourceforge.net/cs/blog.html 71 | 2009-05-12T13:49:20+00:00 72 | monthly 73 | 74 | 75 | http://objectlistview.sourceforge.net/cs/overlays.html 76 | 2009-05-12T13:50:22+00:00 77 | monthly 78 | 79 | 80 | http://objectlistview.sourceforge.net/cs/changelog.html 81 | 2009-05-12T21:16:56+00:00 82 | monthly 83 | 84 | 85 | http://objectlistview.sourceforge.net/python/ 86 | 2008-09-06T22:32:45+00:00 87 | monthly 88 | 89 | 90 | http://objectlistview.sourceforge.net/python/index.html 91 | 2008-09-06T22:32:45+00:00 92 | monthly 93 | 94 | 95 | http://objectlistview.sourceforge.net/python/whatsnew.html 96 | 2008-09-06T22:34:14+00:00 97 | monthly 98 | 99 | 100 | http://objectlistview.sourceforge.net/python/features.html 101 | 2008-09-06T22:32:14+00:00 102 | monthly 103 | 104 | 105 | http://objectlistview.sourceforge.net/python/gettingStarted.html 106 | 2008-09-06T22:32:32+00:00 107 | monthly 108 | 109 | 110 | http://objectlistview.sourceforge.net/python/recipes.html 111 | 2008-09-06T22:42:34+00:00 112 | monthly 113 | 114 | 115 | http://objectlistview.sourceforge.net/python/faq.html 116 | 2008-09-06T22:32:07+00:00 117 | monthly 118 | 119 | 120 | http://objectlistview.sourceforge.net/python/majorClasses.html 121 | 2008-09-06T22:33:56+00:00 122 | monthly 123 | 124 | 125 | http://objectlistview.sourceforge.net/python/search.html 126 | 2008-09-06T22:34:10+00:00 127 | monthly 128 | 129 | 130 | http://objectlistview.sourceforge.net/python/cellEditing.html 131 | 2008-09-06T22:31:45+00:00 132 | monthly 133 | 134 | 135 | http://objectlistview.sourceforge.net/python/groupListView.html 136 | 2008-09-06T22:32:40+00:00 137 | monthly 138 | 139 | 140 | http://objectlistview.sourceforge.net/python/listCtrlPrinter.html 141 | 2008-09-06T22:32:54+00:00 142 | monthly 143 | 144 | -------------------------------------------------------------------------------- /ListViewPrinter/ListViewPrinter2010.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 9.0.30729 7 | 2.0 8 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631} 9 | Library 10 | Properties 11 | BrightIdeasSoftware 12 | ListViewPrinter 13 | 14 | 15 | 16 | 17 | 3.5 18 | v4.0 19 | false 20 | publish\ 21 | true 22 | Disk 23 | false 24 | Foreground 25 | 7 26 | Days 27 | false 28 | false 29 | true 30 | 0 31 | 1.0.0.%2a 32 | false 33 | true 34 | 35 | 36 | true 37 | full 38 | false 39 | bin\Debug\ 40 | DEBUG;TRACE 41 | prompt 42 | 4 43 | 44 | 45 | pdbonly 46 | true 47 | bin\Release\ 48 | TRACE 49 | prompt 50 | 4 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | Form 63 | 64 | 65 | BrushForm.cs 66 | 67 | 68 | 69 | 70 | 71 | Component 72 | 73 | 74 | 75 | 76 | 77 | BrushForm.cs 78 | Designer 79 | 80 | 81 | 82 | 83 | {18FEDA0C-D147-4286-B39A-01204808106A} 84 | ObjectListView2010 85 | 86 | 87 | 88 | 89 | False 90 | .NET Framework 3.5 SP1 Client Profile 91 | false 92 | 93 | 94 | False 95 | .NET Framework 2.0 %28x86%29 96 | false 97 | 98 | 99 | False 100 | .NET Framework 3.0 %28x86%29 101 | false 102 | 103 | 104 | False 105 | .NET Framework 3.5 106 | false 107 | 108 | 109 | False 110 | .NET Framework 3.5 SP1 111 | true 112 | 113 | 114 | False 115 | Windows Installer 3.1 116 | true 117 | 118 | 119 | 120 | 127 | -------------------------------------------------------------------------------- /ListViewPrinter/ListViewPrinter2012.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 9.0.30729 7 | 2.0 8 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631} 9 | Library 10 | Properties 11 | BrightIdeasSoftware 12 | ListViewPrinter 13 | 14 | 15 | 16 | 17 | 3.5 18 | v4.0 19 | false 20 | publish\ 21 | true 22 | Disk 23 | false 24 | Foreground 25 | 7 26 | Days 27 | false 28 | false 29 | true 30 | 0 31 | 1.0.0.%2a 32 | false 33 | true 34 | 35 | 36 | true 37 | full 38 | false 39 | bin\Debug\ 40 | DEBUG;TRACE 41 | prompt 42 | 4 43 | 44 | 45 | pdbonly 46 | true 47 | bin\Release\ 48 | TRACE 49 | prompt 50 | 4 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | Form 63 | 64 | 65 | BrushForm.cs 66 | 67 | 68 | 69 | 70 | 71 | Component 72 | 73 | 74 | 75 | 76 | 77 | BrushForm.cs 78 | Designer 79 | 80 | 81 | 82 | 83 | {18FEDA0C-D147-4286-B39A-01204808106A} 84 | ObjectListView2012 85 | 86 | 87 | 88 | 89 | False 90 | .NET Framework 3.5 SP1 Client Profile 91 | false 92 | 93 | 94 | False 95 | .NET Framework 2.0 %28x86%29 96 | false 97 | 98 | 99 | False 100 | .NET Framework 3.0 %28x86%29 101 | false 102 | 103 | 104 | False 105 | .NET Framework 3.5 106 | false 107 | 108 | 109 | False 110 | .NET Framework 3.5 SP1 111 | true 112 | 113 | 114 | False 115 | Windows Installer 3.1 116 | true 117 | 118 | 119 | 120 | 127 | -------------------------------------------------------------------------------- /ObjectListView/FastDataListView.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * FastDataListView - A data bindable listview that has the speed of a virtual list 3 | * 4 | * Author: Phillip Piper 5 | * Date: 22/09/2010 8:11 AM 6 | * 7 | * Change log: 8 | * 2010-09-22 JPP - Initial version 9 | * 10 | * Copyright (C) 2006-2014 Phillip Piper 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation, either version 3 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program. If not, see . 24 | * 25 | * If you wish to use this code in a closed source application, please contact phillip_piper@bigfoot.com. 26 | */ 27 | 28 | using System; 29 | using System.Collections; 30 | using System.Collections.Generic; 31 | using System.Data; 32 | using System.ComponentModel; 33 | using System.Windows.Forms; 34 | using System.Drawing.Design; 35 | 36 | namespace BrightIdeasSoftware 37 | { 38 | /// 39 | /// A FastDataListView virtualizes the display of data from a DataSource. It operates on 40 | /// DataSets and DataTables in the same way as a DataListView, but does so much more efficiently. 41 | /// 42 | /// 43 | /// 44 | /// A FastDataListView still has to load all its data from the DataSource. If you have SQL statement 45 | /// that returns 1 million rows, all 1 million rows will still need to read from the database. 46 | /// However, once the rows are loaded, the FastDataListView will only build rows as they are displayed. 47 | /// 48 | /// 49 | public class FastDataListView : FastObjectListView 50 | { 51 | #region Public Properties 52 | 53 | /// 54 | /// Get or set the VirtualListDataSource that will be displayed in this list view. 55 | /// 56 | /// The VirtualListDataSource should implement either , , 57 | /// or . Some common examples are the following types of objects: 58 | /// 59 | /// 60 | /// 61 | /// 62 | /// 63 | /// 64 | /// 65 | /// When binding to a list container (i.e. one that implements the 66 | /// interface, such as ) 67 | /// you must also set the property in order 68 | /// to identify which particular list you would like to display. You 69 | /// may also set the property even when 70 | /// VirtualListDataSource refers to a list, since can 71 | /// also be used to navigate relations between lists. 72 | /// 73 | [Category("Data"), 74 | TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design")] 75 | public virtual Object DataSource { 76 | get { return this.Adapter.DataSource; } 77 | set { this.Adapter.DataSource = value; } 78 | } 79 | 80 | /// 81 | /// Gets or sets the name of the list or table in the data source for which the DataListView is displaying data. 82 | /// 83 | /// If the data source is not a DataSet or DataViewManager, this property has no effect 84 | [Category("Data"), 85 | Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design", typeof(UITypeEditor)), 86 | DefaultValue("")] 87 | public virtual string DataMember { 88 | get { return this.Adapter.DataMember; } 89 | set { this.Adapter.DataMember = value; } 90 | } 91 | 92 | #endregion 93 | 94 | #region Implementation properties 95 | 96 | /// 97 | /// Gets or sets the DataSourceAdaptor that does the bulk of the work needed 98 | /// for data binding. 99 | /// 100 | protected DataSourceAdapter Adapter { 101 | get { 102 | if (adapter == null) 103 | adapter = this.CreateDataSourceAdapter(); 104 | return adapter; 105 | } 106 | set { adapter = value; } 107 | } 108 | private DataSourceAdapter adapter; 109 | 110 | #endregion 111 | 112 | #region Implementation 113 | 114 | /// 115 | /// Create the DataSourceAdapter that this control will use. 116 | /// 117 | /// A DataSourceAdapter configured for this list 118 | /// Subclasses should overrride this to create their 119 | /// own specialized adapters 120 | protected virtual DataSourceAdapter CreateDataSourceAdapter() { 121 | return new DataSourceAdapter(this); 122 | } 123 | 124 | #endregion 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /ListViewPrinter/ListViewPrinter2008.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Debug 4 | AnyCPU 5 | 9.0.30729 6 | 2.0 7 | {E73A10BD-2B5A-4BAC-897F-3A58CFC07631} 8 | Library 9 | Properties 10 | BrightIdeasSoftware 11 | ListViewPrinter 12 | 13 | 14 | 15 | 16 | 2.0 17 | v3.5 18 | publish\ 19 | true 20 | Disk 21 | false 22 | Foreground 23 | 7 24 | Days 25 | false 26 | false 27 | true 28 | 0 29 | 1.0.0.%2a 30 | false 31 | false 32 | true 33 | true 34 | lvp-keyfile.snk 35 | 36 | 37 | true 38 | full 39 | false 40 | bin\Debug\ 41 | DEBUG;TRACE 42 | prompt 43 | 4 44 | 45 | 46 | pdbonly 47 | true 48 | bin\Release\ 49 | TRACE 50 | prompt 51 | 4 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | Form 64 | 65 | 66 | BrushForm.cs 67 | 68 | 69 | 70 | 71 | 72 | Component 73 | 74 | 75 | 76 | 77 | 78 | BrushForm.cs 79 | Designer 80 | 81 | 82 | 83 | 84 | {18FEDA0C-D147-4286-B39A-01204808106A} 85 | ObjectListView2008 86 | 87 | 88 | 89 | 90 | False 91 | .NET Framework Client Profile 92 | false 93 | 94 | 95 | False 96 | .NET Framework 2.0 %28x86%29 97 | false 98 | 99 | 100 | False 101 | .NET Framework 3.0 %28x86%29 102 | false 103 | 104 | 105 | False 106 | .NET Framework 3.5 107 | false 108 | 109 | 110 | False 111 | .NET Framework 3.5 SP1 112 | true 113 | 114 | 115 | False 116 | Windows Installer 3.1 117 | true 118 | 119 | 120 | 121 | 122 | 123 | 124 | 131 | --------------------------------------------------------------------------------