Archive: ComponentOwl Rails app, DB backups, go redirect script
This commit is contained in:
150
db/import/product_pages/better-listview_features.erb
Normal file
150
db/import/product_pages/better-listview_features.erb
Normal file
@@ -0,0 +1,150 @@
|
||||
<h2>Bugs and wrong behavior:</h2>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th>Regular .NET ListView Control</th>
|
||||
<th>Better ListView control</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Some events fire twice bug</td>
|
||||
<td>Fixed</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Selection behavior different from Windows Explorer</td>
|
||||
<td>Fixed; Behaves as expected</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Drag & Drop behavior different from Windows Explorer</td>
|
||||
<td>Fixed; Behaves as expected</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Checkboxes do not stay in the first column when the first column is reordered</td>
|
||||
<td>Fixed; Behaves as expected</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Non-standard checkboxes behavior (e.g. when using spacebar)</td>
|
||||
<td>Fixed</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Non-standard look, incompatible with system themes</td>
|
||||
<td>Fixed; Always uses system theme. Looks great on all Windows versions. Works with Windows 7 themes and Aero</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>Limitations:</h2>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th>Regular .NET ListView Control</th>
|
||||
<th>Better ListView control</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Just one image per item</td>
|
||||
<td>Enhanced; Each sub-item can have image</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>ImageList must be used to display images</td>
|
||||
<td>Both ImageList and Image instances can be used</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Simple sorting only</td>
|
||||
<td>Multi-column sorting; Users can use Shift+Click to add additional columns to the sort</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Three-state checkboxes not supported</td>
|
||||
<td>Support for both two-state and three-state check boxes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Very limited event data</td>
|
||||
<td>Enhanced; Many events have rich event data with useful information</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Only 1 context menu for whole ListView</td>
|
||||
<td>Up to 3 separate context menus: One for column headers, one for items, and one for empty area</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Columns can be shown only in “Details” layout</td>
|
||||
<td>Columns can be shown in all layouts</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Only “SmallIcon” and “LargeIcon” size supported</td>
|
||||
<td>Images can be of arbitrary size per layout.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Image size is static</td>
|
||||
<td>Images are scaled and centered smoothly when necessary while keeping their respective aspect ratios</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Column header images are not supported</td>
|
||||
<td>Both ImageList and custom Image instances can be set on column headers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Custom comparer for sorting has to be implemented from scratch</td>
|
||||
<td>Custom comparer can be inherited from BetterListView’s default comparer to extend its functionality; Any custom IComparer is supported as well</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Sub-item images very limited; Usable only via WinAPI with limitations in size and color depth</td>
|
||||
<td>Images for sub-item fully supported (both ImageList and custom Image instances)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Check boxes do not have animation effect like the standard control</td>
|
||||
<td>Check boxes are animated when used with mouse or keyboard the same way as the CheckBox control</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Searching with keyboard only on first column and limited to string prefixes</td>
|
||||
<td>Keyboard searching can be used on columns of choice and the searching behavior can be further adjusted (any substring, character-based or word-based search)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Only simple item tooltips supported</td>
|
||||
<td>Automatic and customizable tooltips on items, sub-items and columns are supported</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Can scroll to just one item</td>
|
||||
<td>One or several items can be specified to be scrolled into view</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Vista-look only with WinAPI extension</td>
|
||||
<td>Visual elements are used by default</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No Drag & Drop item highlighting</td>
|
||||
<td>Items under cursor are properly highlighted during dragging; Highlighting can be switched off for selected items</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>Missing features:</h2>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th>Regular .NET ListView Control</th>
|
||||
<th>Better ListView control</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No empty text support (watermark text when ListView is empty)</td>
|
||||
<td>Added support; Empty text for empty ListView is supported; You can give hint to your users now</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No inbuilt sort</td>
|
||||
<td>Added inbuilt sort support; Zero-code sorting</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No auto-scroll when reordering items</td>
|
||||
<td>Added; Auto-scroll speed can be adjusted</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No auto-scroll when reordering columns</td>
|
||||
<td>Added; Auto-scroll speed can be adjusted</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No inbuilt item/column reordering</td>
|
||||
<td>Added item/column reordering support; Zero-code reordering</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>No auto-scroll when dragging an item</td>
|
||||
<td>Added; Auto-scroll speed can be adjusted</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Complex data binding not supported</td>
|
||||
<td>Support for complex data binding; Any IList, DataSet, DataTable or several other types can be bound directly to the Better ListView</td>
|
||||
</tr>
|
||||
</table>
|
||||
191
db/import/product_pages/better-listview_pricing-licensing.erb
Normal file
191
db/import/product_pages/better-listview_pricing-licensing.erb
Normal file
@@ -0,0 +1,191 @@
|
||||
<h1>Licensing & pricing for Better ListView</h1>
|
||||
<p class="section-info">Purchase the ideal replacement component for .NET ListView.</p>
|
||||
|
||||
<ul id="buy-nav" class="nav">
|
||||
<li><%= link_to("Buy new licenses", {}, :class => "current") %></li>
|
||||
<li><%= link_to("Renew subscription", {}) %></li>
|
||||
</ul>
|
||||
|
||||
<div id="buy-panels">
|
||||
<div class="panel">
|
||||
|
||||
<% form_tag "https://secure.bmtmicro.com/servlets/Orders.ShoppingCart", :method => :get do -%>
|
||||
<%= hidden_field_tag "CID", Settings.order.cid %>
|
||||
<%= hidden_field_tag "CLR", Settings.order.clr %>
|
||||
<%= hidden_field_tag "PRODUCTID", "", :class => "product-id" %>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th colspan="4">Single developer licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Single developer license with 1 year subscription</td>
|
||||
<td class="price">$345</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300056", false, :id => "support-single" %>
|
||||
<%= label_tag "support-single", "Add 1 year priority support ($99)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300042" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Single developer license with source code and 1 year subscription</td>
|
||||
<td class="price">$795</td>
|
||||
<td class="buy"><%= buy "18300043" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">5 developers licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5 developer license with 1 year subscription</td>
|
||||
<td class="price">$995</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300057", false, :id => "support-5" %>
|
||||
<%= label_tag "support-5", "Add 1 year priority support ($295)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300044" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5 developer license with source code and 1 year subscription</td>
|
||||
<td class="price">$1995</td>
|
||||
<td class="buy"><%= buy "18300045" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Site licenses - use at 1 site (office or building)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Site license with 1 year subscription</td>
|
||||
<td class="price">$1995</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300058", false, :id => "support-site" %>
|
||||
<%= label_tag "support-site", "Add 1 year priority support ($495)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300046" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Site license with source code and 1 year subscription</td>
|
||||
<td class="price">$3995</td>
|
||||
<td class="buy"><%= buy "18300047" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Enterprise license - use world-wide at unlimited sites</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Enterprise license with source code and 1 year subscription</td>
|
||||
<td class="price">$8995</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300059", false, :id => "support-enterprise" %>
|
||||
<%= label_tag "support-enterprise", "Add 1 year priority support ($995)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300048" %></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<% end -%>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
|
||||
<% form_tag "https://secure.bmtmicro.com/servlets/Orders.ShoppingCart", :method => :get do -%>
|
||||
<%= hidden_field_tag "CID", Settings.order.cid %>
|
||||
<%= hidden_field_tag "CLR", Settings.order.clr %>
|
||||
<%= hidden_field_tag "PRODUCTID", "", :class => "product-id" %>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th colspan="4">Single developer licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew single developer 1 year subscription</td>
|
||||
<td class="price">$138</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300056", false, :id => "renew-support-single" %>
|
||||
<%= label_tag "renew-support-single", "Add 1 year priority support ($99)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300049" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew single developer 1 year subscription with source code</td>
|
||||
<td class="price">$318</td>
|
||||
<td class="buy"><%= renew "18300050" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">5 developers licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew 5 developer 1 year subscription</td>
|
||||
<td class="price">$398</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300057", false, :id => "renew-support-5" %>
|
||||
<%= label_tag "renew-support-5", "Add 1 year priority support ($295)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300051" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew 5 developer 1 year subscription with source code</td>
|
||||
<td class="price">$798</td>
|
||||
<td class="buy"><%= renew "18300052" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Site licenses - use at 1 site (office or building)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew site license 1 year subscription</td>
|
||||
<td class="price">$798</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300058", false, :id => "renew-support-site" %>
|
||||
<%= label_tag "renew-support-site", "Add 1 year priority support ($495)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300053" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renews site license 1 year subscription with source code</td>
|
||||
<td class="price">$1598</td>
|
||||
<td class="buy"><%= renew "18300054" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Enterprise license - use world-wide at unlimited sites</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew enterprise license 1 year subscription with source code</td>
|
||||
<td class="price">$3598</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300059", false, :id => "renew-support-enterprise" %>
|
||||
<%= label_tag "renew-support-enterprise", "Add 1 year priority support ($995)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300055" %></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<% end -%>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="licenses-info">
|
||||
|
||||
<div class="block">
|
||||
<p>All licenses are:</p>
|
||||
<ul class="common">
|
||||
<li>Life-time (non-expiring)</li>
|
||||
<li>Royalty free</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
<p>Subscription gets you:</p>
|
||||
<ul class="common">
|
||||
<li>Support</li>
|
||||
<li>Updates</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="block last">
|
||||
<p>Priority support gets you:</p>
|
||||
<ul class="common">
|
||||
<li>Guaranteed 24 hour reply</li>
|
||||
<li>Help with implementing new features and extending Better ListView</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
9
db/import/product_pages/better-listview_screenshots.erb
Normal file
9
db/import/product_pages/better-listview_screenshots.erb
Normal file
@@ -0,0 +1,9 @@
|
||||
<div class="screenshots">
|
||||
<% reset_cycle %>
|
||||
<% for screenshot in @product.screenshots.all_ordered %>
|
||||
<% c = cycle("odd", "even") %>
|
||||
<% if c == "odd" %><div class="screenshot-row"><% end %>
|
||||
<div class="<%= c %>"><%= screenshot_link(screenshot, :version => :thumb_big) %><strong><%= truncate(screenshot.label, 40) %></strong></div>
|
||||
<% if c == "even" || @product.screenshots.all_ordered.last == screenshot %></div><% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
91
db/import/product_pages/better-listview_story.erb
Normal file
91
db/import/product_pages/better-listview_story.erb
Normal file
@@ -0,0 +1,91 @@
|
||||
<h2>The story behind Better Listview</h2>
|
||||
|
||||
<p>Hi, my name is Jiri Novotny and I’m the founder of Dextronet.com, a small software startup that operates ComponentOwl.com among other things.
|
||||
Me and my team think of ourselves as independent software vendors (or mISV).</p>
|
||||
|
||||
<p>Surprise surprise - as it is with most independent components today, we did not originally actually intended to create Better ListView.</p>
|
||||
|
||||
<p>Our flagship product is Swift To-Do List, a desktop task management software. The old version of Swift To-Do List has been written in Visual Basic 6
|
||||
which has many limitations, so we’ve decided to make a total rewrite in VB.NET and C#. The development started in July 2009.</p>
|
||||
|
||||
<p>Because Swift To-Do List is highly list-centric product (as the name suggests ), it soon become apparent that we will need excellent ListView control.
|
||||
The ListView control included in .NET just didn’t cut it. Not only its features are very limited, but there are braincracking bugs and strange behavior
|
||||
in lots of cases. In fact, the default .NET ListView was so bad, that I’ve oftentimes wished I could just use the ListView included in VB6 –
|
||||
it has at least behaved mostly correctly.</p>
|
||||
|
||||
<p>So, because we couldn’t use the default .NET ListView, I began searching for a replacement ListView
|
||||
control. My requirements were actually not very demanding - I wanted a ListView control that looked and
|
||||
behaved similarly as the one used in Windows Explorer. </p>
|
||||
|
||||
<p>Unfortunately, I‘ve soon discovered that in reality, I want lots of things that are not taken for granted in any ListView control that I’ve found.
|
||||
My requirements for a usable .NET ListView control are:</p>
|
||||
|
||||
<ul class="common">
|
||||
<li>It must either inherit from native ListView or mimick it perfectly</li>
|
||||
<li>It must use system theme seamlessly and not have some weird inconsistent custom look</li>
|
||||
<li>It must support sub-item images flawlessly</li>
|
||||
<li>It must have excellent drag & drop support for item reordering</li>
|
||||
<li>It must have perfect implementation of selection and drag-selection</li>
|
||||
<li>It must support 3 different context menus: For items, column headers, and empty space</li>
|
||||
<li>Multi-column sort</li>
|
||||
<li>Must not be part of some huge control pack that I need to bundle with my app</li>
|
||||
<li>Must be light-weight, fast and optimized</li>
|
||||
<li>Must have all bugs and strange behavior of .NET ListView fixed</li>
|
||||
</ul>
|
||||
|
||||
<p>There was also lot of nice-to-have things that I’ve looked for, like:</p>
|
||||
<ul class="common">
|
||||
<li>Watermark text that is shown when the ListView is empty</li>
|
||||
<li>Column reordering with auto-scrolling</li>
|
||||
<li>100% managed code</li>
|
||||
<li>... co mame dal? Napady! ...</li>
|
||||
</ul>
|
||||
|
||||
<p>I did not want to use any DataGrid-based control, as it can’t really replace ListView control – it is much harder to manipulate for the user in most
|
||||
cases, and it doesn’t support many things that ListView does. </p>
|
||||
|
||||
<p>Swift To-Do List is a mass-market product, so it needed a ListView control that behaved as expected in all cases, no exceptions.
|
||||
The ListView control used in Windows Explorer is a great model: Because every user knows how to work with Windows Explorer ListView already,
|
||||
you can leverage that knowledge in your own applications. Your applications will be truly easy to use and learn.</p>
|
||||
|
||||
<p>I’ve looked over dozen of ListView controls – and I’m not afraid to name them, because they just don’t meet the above criteria.
|
||||
The controls I looked over included ListView from SoftGroup, three different open source ListView controls from CodeProject,
|
||||
ListView from Lidor systems, Grid and TreeView-Grid hybrid from DevExpres, WinListView from Infragistics, I’ve also looked at all
|
||||
ListView controls to be found at CodeGuru and ComponentSource and more – basically everything that I could Google and everything
|
||||
from all well-known (or not so well known) component providers.</p>
|
||||
|
||||
<p>I was disappointed with every single of these controls. Not one of them met my criteria.</p>
|
||||
|
||||
<p>Believe me, I *wanted* to find the perfect ListView control – after all, I desperately needed it so we could use it in our own product.
|
||||
But what I‘ve found during my extensive research? Nothing. Null. Nilch. Nada. Zero. My heart was broken. The dreams of our awesome Swift To-Do List 7
|
||||
product started to shatter, because we needed an adequate ListView control first. When it comes to user experience, we simply couldn’t settle
|
||||
for anything less than great.</p>
|
||||
|
||||
<p>But we haven’t given up. The solution? To create our own ListView control. A Better ListView control. It was not originally intended to be
|
||||
a product on it’s own, but when it has been finished, it was so good that it would be a sin to keep it selfishly just for ourselves.
|
||||
So we’ve started selling it.</p>
|
||||
|
||||
<p>When we started building our own better ListView control, we wanted it to inherit from System.Windows.Forms.ListView at first.
|
||||
We’ve tried our best, but some of the bugs of .NET ListView were simply impossible to fix, even with ridiculous hacks. However, luck has shined upon us. </p>
|
||||
|
||||
<p>We’ve met Libor Tinka, a genius C# developer with extensive experience with not just programming in general, but specifically Windows
|
||||
control development as well. He’s the author and sole developer of ImagingShop, a powerful digital photography processing desktop application
|
||||
that includes many of his custom controls, and lot’s of hardcore mathematics and unique algorithms (It has over 220k lines of code in total!).
|
||||
That guy <strong>really</strong> is a genius and let me tell you, the code he writes is just beautiful. He’s an artist.</p>
|
||||
|
||||
<p>When we’ve asked Libor to create a better ListView control for us, he accepted the challenge. </p>
|
||||
|
||||
<p>(By the way, it might look easy at first, but implementing your own ListView control is extremely difficult, daunting and complicated task –
|
||||
there are so many corner cases in the control‘s behavior that it will make your brain want run away.)</p>
|
||||
|
||||
<p>We’ve worked very closely with Libor during the intensive development process. Fast forward 10 months into the future - Better ListView is done,
|
||||
and Libor is an integral part of our team. We still work together as we support and constantly enhance BetterListview.</p>
|
||||
|
||||
<p>Better ListView is now used not just in Swift To-Do List, but also in Libor’s own product ImagingShop, so we are trully eating our own dog foot.
|
||||
This is your <strong>guarantee</strong> that we will <strong>not</strong> stop supporting Better ListView, fixing bugs and implementing new features –
|
||||
it’s the <strong>core</strong> and <strong>heart</strong> of our own desktop software products after all. We walk the talk.</p>
|
||||
|
||||
<p>If Better ListView existed before, I know I would be absolutely positively <strong>thrilled</strong> about it.
|
||||
And so I hope that you are thrilled about it now that you’ve found it.</p>
|
||||
|
||||
<p>Any questions or comments? I would love to get them. Contact me at novotny@dextronet.com
|
||||
4
db/import/product_pages/product_pages.csv
Normal file
4
db/import/product_pages/product_pages.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
"product_code","code","name","tab","position"
|
||||
"better-listview","story","Story",1,3
|
||||
"better-listview","screenshots","Screenshots",1,3
|
||||
"better-listview","pricing-licensing","Pricing & Licensing",0,1
|
||||
|
Reference in New Issue
Block a user