Components – Owl's Blog on .NET development http://www.componentowl.com/blog Component Owl codes Better ListView control all night so you don't have to. Tue, 04 Sep 2018 13:10:05 +0000 en-US hourly 1 https://wordpress.org/?v=4.9.8 Activation issues and how to solve them http://www.componentowl.com/blog/activation-issues-and-how-to-solve-them/ http://www.componentowl.com/blog/activation-issues-and-how-to-solve-them/#respond Wed, 01 Mar 2017 17:22:52 +0000 http://www.componentowl.com/blog/?p=927 Dear Readers,
Periodically we get emails from users having problems with the activation. So we put together a check list on how to deal with the most frequent issues. In case these fixes do not help you solve your problem, please contact contact support at support@componentowl.com and we will be happy to help you out.
Below, you will find some obstacles we have stumbled across in the past.

  1. Try to rebuild the project/solution
  2. Restart Visual Studio if rebuilding the solution did not stop the nag screen
  3. If you use Better ListView in a Class Library project, it should be referenced and activated in both, the main project and the Class Library project.
  4. Do the main project (executable) and all referenced projects contain the licenses.licx file within the Properties folder? If not, rebuild the main project (executable) and copy the licenses.licx file to the appropriate location in all referenced projects (Class Library or other executables).
  5. The licenses.licx file should contain only a single reference to Better ListView with the current version number (e.g. ComponentOwl.BetterListView.BetterListView, BetterListView, Version=3.7.2.0, Culture=neutral, PublicKeyToken=e6c91a3add447be2). If there are more lines referencing Better ListView, remove the obsolete ones. You can also delete the licenses.licx file and rebuild the project to regenerate it.
  6. Run the Activator application (installed along with the product) and check if it displays a valid license (license info should be displayed in green).
  7. You can try to finish the activation via the Activator app and then rebuild the main project. The Activator allows custom proxy settings for activation from behind a web proxy (often present in corporate environments).
  8. Check, if the license-blv.dat file is present in the “C:\ProgramData\Component Owl\” folder after activation. If not, please contact support at support@componentowl.com
  9. Check, if your projects reference the same version of Better ListView as the one that is installed. Open the „Reference Properties“ window by right clicking on Better ListView reference in the Solution Explorer. Then check if there is a Specific Version property set to true. If so, remove the reference and add a new reference to Better ListView with the correct version. You can also just set Specific Version property to false.
  10. The Better ListView has to be activated on each machine where it is built. Do not copy the license-blv.dat file because this is specific to each machine. Rather follow the activation process on each machine.

We hope these clues can help you, in case you encounter a problem during the activation. As mentioned before, please contact support, if the issues persist.

]]>
http://www.componentowl.com/blog/activation-issues-and-how-to-solve-them/feed/ 0
Custom Scroll Bar Size in Better ListView http://www.componentowl.com/blog/custom-scroll-bar-size-in-better-listview/ http://www.componentowl.com/blog/custom-scroll-bar-size-in-better-listview/#comments Tue, 19 Mar 2013 15:56:22 +0000 http://www.componentowl.com/blog/?p=878 Better ListView custom scroll bar size

Better ListView custom scroll bar size

Better ListView 3.7.0 contains two new properties that allow you to set custom horizontal and vertical scroll bar sizes:

  • HScrollBarWidth
  • VScrollBarHeight

Of course, you can set these custom sizes in design-time as well as in run-time.

Larger scroll bars are practical on modern touch-enabled devices with high resolution screens. The default scroll bar size (17 pixels) may be too small and you may want to make it just large enough for your index finger.

This features works in both Better ListView and Better ListView Express.

 

 

 

 

]]>
http://www.componentowl.com/blog/custom-scroll-bar-size-in-better-listview/feed/ 4
Binding Images in Better ListView http://www.componentowl.com/blog/binding-images-in-better-listview/ http://www.componentowl.com/blog/binding-images-in-better-listview/#respond Mon, 28 Jan 2013 03:54:22 +0000 http://www.componentowl.com/blog/?p=850 Better ListView 3.5 have improved data binding functionality. You can adjust how the data rows will be converted to items/sub-items and vice versa. For example, you can show images based on the bound data:

Better ListView with bound list

Better ListView with bound list

Say you have a simple Server type:

C#

[csharp gutter=”false” toolbar=”false”]
public class Server
{
public string ServerName
{
get;
set;
}

public int ServerStatus
{
get;
set;
}

public Server(string name, int status)
{
ServerName = name;
ServerStatus = status;
}
}
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
Public Class Server

Public Property ServerName() As String
Get
Return m_ServerName
End Get
Set
m_ServerName = Value
End Set
End Property

Public Property ServerStatus() As Integer
Get
Return m_ServerStatus
End Get
Set
m_ServerStatus = Value
End Set
End Property

Private m_ServerName As String
Private m_ServerStatus As Integer

Public Sub New(name As String, status As Integer)
ServerName = name
ServerStatus = status
End Sub

End Class
[/vb]

This class contains two properties representing server name and its status. The server name is a textual property and one would like this mapped to item label as usual. However, the server status is a numerical value which have no meaning to the user even when converted to string. In fact, the numerical value can be 0 (offline), 1 (idle) or 2 (running). You may like to display color icons instead of plain strings or numbers. What if we would like to even highlight some items or change other properties during data binding? This is possible through Better ListView data binding customization.

First, let’s create a list of Server objects and bind this to a Better ListView. We would like to have columns auto-generated, so we set DataBindColumns to true:

C#

[csharp gutter=”false” toolbar=”false”]
Server[] servers = new[]
{
new Server(“Andromeda”, 2),
new Server(“Taurus”, 1),
new Server(“Himalia”, 2),
new Server(“Nanda”, 2),
new Server(“Elara”, 0),
new Server(“Perseus”, 2),
new Server(“Titan”, 1)
};

ImageList imageList = new ImageList();

imageList.ColorDepth = ColorDepth.Depth32Bit;
imageList.ImageSize = new Size(16, 16);
imageList.Images.AddStrip(Image.FromFile(“status.png”));

BetterListView listView = new CustomListView();

listView.DataBindColumns = true;
listView.DataSource = servers;
listView.ImageList = imageList;
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
Dim servers As Server() = New () {New Server(“Andromeda”, 2), New Server(“Taurus”, 1), New Server(“Himalia”, 2), New Server(“Nanda”, 2), New Server(“Elara”, 0), New Server(“Perseus”, 2), _
New Server(“Titan”, 1)}

Dim imageList As New ImageList()

imageList.ColorDepth = ColorDepth.Depth32Bit
imageList.ImageSize = New Size(16, 16)
imageList.Images.AddStrip(Image.FromFile(“status.png”))

Dim listView As BetterListView = New CustomListView()

listView.DataBindColumns = True
listView.DataSource = servers
listView.ImageList = imageList
[/vb]

Let’s take a look on the result:

Better ListView with bound list

Better ListView with bound list

 

The columns were auto-generated and Server properties properly converted to item and sub-item labels. The generated column header labels are just names of the corresponding properties (ServerName, ServerStatus). You can make the names more convenient by providing DisplayNameAttribute on the respective properties:

C#

[csharp gutter=”false” toolbar=”false”]

[DisplayName(“Server Name”)]
public string ServerName
{
get;
set;
}

[DisplayName(“Status”)]
public int ServerStatus
{
get;
set;
}


[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]

_
Public Property ServerName() As String
Get
Return m_ServerName
End Get
Set
m_ServerName = Value
End Set
End Property

_
Public Property ServerStatus() As Integer
Get
Return m_ServerStatus
End Get
Set
m_ServerStatus = Value
End Set
End Property


[/vb]

Now the column names are more user friendly:

Better ListView with bound list

Better ListView with bound list

We will finally add state images (instead of the numbers) and highlight some items. To do that, we have to override DataCreateItem method in a class derived from BetterListView:

C#

[csharp gutter=”false” toolbar=”false”]
public class CustomListView : BetterListView
{
protected override BetterListViewItem DataCreateItem(
CurrencyManager currentDataManager,
BindingMemberInfo[] currentDisplayMembers,
int index)
{
// create item using the base implementation
BetterListViewItem item = base.DataCreateItem(
currentDataManager,
currentDisplayMembers,
index);

// get server status from the current Server object
int serverStatus = ((Server)currentDataManager.List[index]).ServerStatus;

if (serverStatus == 0)
{
// bold item when server status is 0
item.IsBold = true;
}

// get sub-item corresponding to server status
BetterListViewSubItem subItemStatus = item.SubItems[1];

subItemStatus.ImageIndex = serverStatus; // set image for the sub-item
subItemStatus.Text = “”; // clear sub-item text

return item;
}
}
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
Public Class CustomListView
Inherits BetterListView

Protected Overrides Function DataCreateItem(currentDataManager As CurrencyManager, currentDisplayMembers As BindingMemberInfo(), index As Integer) As BetterListViewItem

‘ create item using the base implementation
Dim item As BetterListViewItem = MyBase.DataCreateItem(currentDataManager, currentDisplayMembers, index)

‘ get server status from the current Server object
Dim serverStatus As Integer = DirectCast(currentDataManager.List(index), Server).ServerStatus

If serverStatus = 0 Then
‘ bold item when server status is 0
item.IsBold = True
End If

‘ get sub-item corresponding to server status
Dim subItemStatus As BetterListViewSubItem = item.SubItems(1)

subItemStatus.ImageIndex = serverStatus
‘ set image for the sub-item
subItemStatus.Text = “”
‘ clear sub-item text
Return item

End Function

End Class
[/vb]

Now the control displays adjusted images and a highlighted item:

Better ListView with bound list

Better ListView with bound list

Note that you can customize data binding the other way as well by overriding the DataUpdateSubItemToSource method. This method is responsible for updating the bound data source when item/sub-item value have been modified.

]]>
http://www.componentowl.com/blog/binding-images-in-better-listview/feed/ 0
Enabling Search Highlight in Better ListView http://www.componentowl.com/blog/enabling-search-highlight-in-better-listview/ http://www.componentowl.com/blog/enabling-search-highlight-in-better-listview/#comments Fri, 11 Jan 2013 02:00:17 +0000 http://www.componentowl.com/blog/?p=843 We have improved item searching capabilities of Better ListView by introducing Search Highlight feature. This feature automatically shows search matches and works out of the box with both searching by typing and searching from code (e.g. using search box):

Search Highlight Feature

Search Highlight Feature

 

To enable the highlight, simply add UpdateSearchHighlight option in the search settings:

C#

[csharp gutter=”false” toolbar=”false”]
listView.SearchSettings = new BetterListViewSearchSettings(
listView.SearchSettings.Mode,
listView.SearchSettings.Options | BetterListViewSearchOptions.UpdateSearchHighlight,
listView.SearchSettings.SubItemIndices);
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
ListView.SearchSettings = New BetterListViewSearchSettings(
listView.SearchSettings.Mode,
listView.SearchSettings.Options Or BetterListViewSearchOptions.UpdateSearchHighlight,
listView.SearchSettings.SubItemIndices)
[/vb]

Every item contains information about the match in the BetterListViewItem.SearchHighlight property. When BetterListViewItem.SearchHighlight.IsEmpty is true, the item was not matched by the search. Otherwise it contains information about the matched substring: its index and number of characters.

Highlight colors can be adjusted by three properties: ColorSearchHighlightColorSearchHighlightBorder and ColorSearchHighlightText:

Search Highlight Properties

Search Highlight Properties

The display can be adjusted even further with owner drawing:

Customized Search Highlight Feature

Customized Search Highlight Feature

Here we have used ellipses drawn on item background by modifying OnDrawItem and OnDrawItemBackground methods of BetterListView:

C#

[csharp gutter=”false” toolbar=”false”]
using System.Drawing;
using System.Drawing.Drawing2D;

using BetterListView;

internal sealed class CustomListView : BetterListView
{
protected override void OnDrawItem(BetterListViewDrawItemEventArgs eventArgs)
{
// do not draw search highlight because we will draw our own
eventArgs.DrawSearchHighlight = false;

base.OnDrawItem(eventArgs);
}

protected override void OnDrawItemBackground(BetterListViewDrawItemBackgroundEventArgs eventArgs)
{
base.OnDrawItemBackground(eventArgs);

// draw custom search highlight on item background
BetterListViewSearchHighlight searchHighlight = eventArgs.Item.SearchHighlight;

if (searchHighlight.IsEmpty == false)
{
eventArgs.Graphics.SmoothingMode = SmoothingMode.HighQuality;

Rectangle rectHighlight = eventArgs.ItemBounds.SubItemBounds[searchHighlight.ColumnIndex].BoundsSearchHighlight;

Brush brushHighlight = new SolidBrush(Color.FromArgb(128, Color.MediumPurple));
Pen penHighlight = new Pen(Color.Purple, 1.0f);

eventArgs.Graphics.FillEllipse(brushHighlight, rectHighlight);
eventArgs.Graphics.DrawEllipse(penHighlight, rectHighlight);

brushHighlight.Dispose();
penHighlight.Dispose();
}
}
}
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
Imports System.Drawing
Imports System.Drawing.Drawing2D

Imports BetterListView

Friend NotInheritable Class CustomListView
Inherits BetterListView
Protected Overrides Sub OnDrawItem(eventArgs As BetterListViewDrawItemEventArgs)
‘ do not draw search highlight because we will draw our own
eventArgs.DrawSearchHighlight = False

MyBase.OnDrawItem(eventArgs)
End Sub

Protected Overrides Sub OnDrawItemBackground(eventArgs As BetterListViewDrawItemBackgroundEventArgs)
MyBase.OnDrawItemBackground(eventArgs)

‘ draw custom search highlight on item background
Dim searchHighlight As BetterListViewSearchHighlight = eventArgs.Item.SearchHighlight

If searchHighlight.IsEmpty = False Then
eventArgs.Graphics.SmoothingMode = SmoothingMode.HighQuality

Dim rectHighlight As Rectangle = eventArgs.ItemBounds.SubItemBounds(searchHighlight.ColumnIndex).BoundsSearchHighlight

Dim brushHighlight As Brush = New SolidBrush(Color.FromArgb(128, Color.MediumPurple))
Dim penHighlight As New Pen(Color.Purple, 1F)

eventArgs.Graphics.FillEllipse(brushHighlight, rectHighlight)
eventArgs.Graphics.DrawEllipse(penHighlight, rectHighlight)

brushHighlight.Dispose()
penHighlight.Dispose()
End If
End Sub
End Class
[/vb]

]]>
http://www.componentowl.com/blog/enabling-search-highlight-in-better-listview/feed/ 1
Custom label edit: How to rename file names without extension in Better ListView http://www.componentowl.com/blog/custom-label-edit-how-to-rename-file-names-without-extension-in-better-listview/ http://www.componentowl.com/blog/custom-label-edit-how-to-rename-file-names-without-extension-in-better-listview/#respond Thu, 20 Dec 2012 17:42:14 +0000 http://www.componentowl.com/blog/?p=831

Let’s suppose you want to display files with extensions in Better ListView, but allow user to rename just the file name, leaving the file extension intact after the editing.

The code for this is very simple. Just turn on label editing and handle two events: BeforeLabelEdit and AfterLabelEditCancel:

C#

[csharp gutter=”false” toolbar=”false”]
betterListView.LabelEdit = true;

betterListView.BeforeLabelEdit += BetterListViewBeforeLabelEdit;
betterListView.AfterLabelEditCancel += BetterListViewAfterLabelEditCancel;

void BetterListViewBeforeLabelEdit(object sender, BetterListViewLabelEditCancelEventArgs eventArgs)
{
string labelOriginal = eventArgs.Label;

// keep only file name in the modified label
string labelNew = Path.GetFileNameWithoutExtension(labelOriginal);

eventArgs.Label = labelNew;
}

void BetterListViewAfterLabelEditCancel(object sender, BetterListViewLabelEditCancelEventArgs eventArgs)
{
string labelOriginal = eventArgs.Label;

// add extension when editing is complete
string labelNew = String.Concat(
labelOriginal,
Path.GetExtension(eventArgs.SubItem.Text));

eventArgs.Label = labelNew;
}
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
BetterListView.LabelEdit = True

AddHandler Me.betterListView.BeforeLabelEdit, AddressOf BetterListViewBeforeLabelEdit
AddHandler Me.betterListView.AfterLabelEditCancel, AddressOf BetterListViewAfterLabelEditCancel

Private Sub BetterListViewBeforeLabelEdit(sender As Object, eventArgs As BetterListViewLabelEditCancelEventArgs)
Dim labelOriginal As String = eventArgs.Label

‘ keep only file name in the modified label
Dim labelNew As String = Path.GetFileNameWithoutExtension(labelOriginal)

eventArgs.Label = labelNew
End Sub

Private Sub BetterListViewAfterLabelEditCancel(sender As Object, eventArgs As BetterListViewLabelEditCancelEventArgs)
Dim labelOriginal As String = eventArgs.Label

‘ add extension when editing is complete
Dim labelNew As String = [String].Concat(labelOriginal, Path.GetExtension(eventArgs.SubItem.Text))

eventArgs.Label = labelNew
End Sub
[/vb]

Naturally, this feature can be used not only for file names, but whenever you would like to edit different view on the data then the displayed one.

Full version of Better ListView supports even custom embedded editing controls and you have complete control over the label editing process.

]]>
http://www.componentowl.com/blog/custom-label-edit-how-to-rename-file-names-without-extension-in-better-listview/feed/ 0
Better Thumbnail Browser Component Released http://www.componentowl.com/blog/better-thumbnail-browser-component-released/ http://www.componentowl.com/blog/better-thumbnail-browser-component-released/#comments Sat, 01 Dec 2012 18:26:16 +0000 http://www.componentowl.com/blog/?p=823  

We have released a whole new WinForms component called Better Thumbnail Browser. This control is useful for anyone developing photo management software or any kind of image database:

Better Thumbnail Browser Overview

Better Thumbnail Browser Overview

The control is capable of loading image thumbnails on background and does all the dirty job of threading and synchronization for you.

My motivation to make such component as lead developer at ComponentOwl.com was to have something that can smoothly integrate in my photo management software.

Since we already have Better ListView component, which is quite mature (three major releases over two years of development), I decided to build upon it and finally make control for image thumbnails that is both extensible and powerful and have native look and feel.

Better Thumbnail Browser inherits most of its functionality from Better ListView (multi column sorting, custom paddings and spacings, multi-line text and groups to name a few). It adds image loading logic on top of it, which can handle various scenarios:

  • Load images from a folder, database or custom source automatically
  • Load thumbnails with arbitrary sizes on background while progressively displaying them
  • Handle zooming thumbnails on the fly
  • Loading thumbnail items in multiple passes (e.g. load meta-data, then low quality image, then high quality image)
  • Loading thumbnails in custom order
  • Loading visible thumbnails first, then all other (and do this even though the user is scrolling the view)
  • Manage updating individual thumbnails or their count on the fly
  • Support showing loading progress

The component is fully customizable and by default inherits native Windows theme. We tested it on Windows 8 with success:

Better Thumbnail Browser with Windows 8 Theme

Better Thumbnail Browser with Windows 8 Theme

 

Better Thumbnail Browser contains default implementation for loading thumbnail images from disk. If you want to gather all images from a given folder (say “c:\images”), display them in Better Thumbnail Browser and load them on background, the code is particularly simple:

thumbnailBrowser.Path = "c:\\images";

And that’s it!

Better Thumbnail Browser will be our third component which is used in end-user consumer-level software package. This ensures future development, improvements and support.

 

 

]]>
http://www.componentowl.com/blog/better-thumbnail-browser-component-released/feed/ 1
How to Store Better ListView Content in a String (User Request) http://www.componentowl.com/blog/how-to-store-better-listview-content-in-a-string-user-request/ http://www.componentowl.com/blog/how-to-store-better-listview-content-in-a-string-user-request/#respond Sat, 04 Aug 2012 00:03:49 +0000 http://www.componentowl.com/blog/?p=796 Is it possible to store entire Better ListView content (items with hierarchy and sub-items, columns and groups) in a single string?

Better ListView already supports saving and loading its content using SaveContent and LoadContent methods. These methods support either XML or binary format.

I chose binary format for storing data in string  because it is more compact than XML. Binary representation (basically an array of bytes) can be converted to Base64 string. Loading the content from string work similarly, the steps are performed in opposite direction:

C#

[csharp gutter=”false” toolbar=”false”]
// SAVE
// create MemoryStream to hold binary data
MemoryStream stream = new MemoryStream();
// store Better ListView content in memory stream
this.listView.SaveContentBinary(stream);
// copy content of MemoryStream to byte array
byte[] contentBinary = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
// convert byte array to Base64 string
stream.Read(contentBinary, 0, (int)stream.Length); // move to beginning of the stream
string contentStringBase64 = Convert.ToBase64String(contentBinary);
// close stream
stream.Close();
stream.Dispose();

// CLEAR
this.listView.Clear();

// LOAD
// create MemoryStream to hold binary data
stream = new MemoryStream();
// convert Base64 string to byte array
contentBinary = Convert.FromBase64String(contentStringBase64);
// write byte array to stream
stream.Write(contentBinary, 0, contentBinary.Length);
stream.Seek(0, SeekOrigin.Begin); // move to beginning of the stream
// load content of Better ListView from memory stream
this.listView.LoadContentBinary(stream);
[/csharp]

Visual Basic

[vb gutter=”false” toolbar=”false”]
‘ SAVE
‘ create MemoryStream to hold binary data
Dim stream As New MemoryStream()
‘ store Better ListView content in memory stream
Me.listView.SaveContentBinary(stream)
‘ copy content of MemoryStream to byte array
Dim contentBinary As Byte() = New Byte(stream.Length – 1) {}
stream.Seek(0, SeekOrigin.Begin)
‘ convert byte array to Base64 string
stream.Read(contentBinary, 0, CInt(stream.Length))
‘ move to beginning of the stream
Dim contentStringBase64 As String = Convert.ToBase64String(contentBinary)
‘ close stream
stream.Close()
stream.Dispose()

‘ CLEAR
Me.listView.Clear()

‘ LOAD
‘ create MemoryStream to hold binary data
stream = New MemoryStream()
‘ convert Base64 string to byte array
contentBinary = Convert.FromBase64String(contentStringBase64)
‘ write byte array to stream
stream.Write(contentBinary, 0, contentBinary.Length)
stream.Seek(0, SeekOrigin.Begin)
‘ move to beginning of the stream
‘ load content of Better ListView from memory stream
Me.listView.LoadContentBinary(stream)
[/vb]

 

Although saving and loading data this way is convenient, please consider the following drawback:

  • Standard serialization mechanism of .NET is used for converting classes and structures to XML or binary representation – hence the serialized data may not be possible to deserialize on different version of Better ListView if any public members of the serialized class have been changed.
  • The generated string is very long (few kilobytes for just two items).
  • Lots of data are stored which are not related to content itself (e.g. item colors).
  • The serialized representation is considered read-only – any changes can cause problems with deserialization; if you really want flexible way of storing ListView content, consider building a model or data layer that supports storing the data you need the way you need.

On the other hand, using this way may be convenient when you want to transfer or copy ListView content between controls on even across application domain (Better ListView itself uses this mechanism to allow Drag and Drop between two applications – this “tour de force” kind of Drag and Drop is not avaiable in regular .NET ListView).

]]>
http://www.componentowl.com/blog/how-to-store-better-listview-content-in-a-string-user-request/feed/ 0
File Explorer with Better ListView http://www.componentowl.com/blog/file-explorer-with-better-listview/ http://www.componentowl.com/blog/file-explorer-with-better-listview/#respond Tue, 09 Aug 2011 16:04:31 +0000 http://www.componentowl.com/blog/?p=340 In release 2.0.2 we added a sample demonstrating how Better ListView can be used to construct folder tree and file browser to make a standalone file explorer:

File Explorer Sample

There are two controls derived from BetterListView. One for the navigation pane (folder tree on left side) and one for the file view (on the right side).

The FolderListView control allows browsing through virtual folders as well as folders on removable drives. We needed this control in our products because .NET does not provide any similar managed control (there is only FolderBrowserDialog, but we actually need a control).

You can use it for your purposes as well, it is available in Better ListView Samples source code.

Many features of Better ListView can be used to enhance file browsing, for example:

  • Drag and Drop – moving or copying files
  • Label Edit – renaming files
  • Thumbnails – display thumbnails of image files
  • Custom Tooltips – display extra information on each file item
  • Groups – organize files into groups (e.g. by size)
  • Check Boxes – select folders and sub-folders properly with three-state check boxes
  • Images – every file type could display different image (extracted icon)
  • Context Menus – do extra operations with files, like displaying file properties
  • Searching – doing keyboard search is very easy to search for some file
  • Sorting – sort files according to multiple properties (this is demonstrated in the sample)
  • Background Image – show that the user is located in special folder by ambient image on the background
]]>
http://www.componentowl.com/blog/file-explorer-with-better-listview/feed/ 0
Synergy of Better ListView and Our Applications http://www.componentowl.com/blog/synergy-of-better-listview-and-our-applications/ http://www.componentowl.com/blog/synergy-of-better-listview-and-our-applications/#respond Thu, 27 Jan 2011 19:33:12 +0000 http://www.componentowl.com/blog/?p=40 When developing sofware application, a custom component of some non-trivial scale is sometimes needed. Complex components are often created in companies as internal, single-purpose projects and never see wider public. This would be the case with our custom ListView component, but its scale and versability convinced us to made it available for others. You can read the story behind, or just take a look on how exactly we use it.

We at Dextronet are developing several desktop applications, which benefits from custom components. Our flagship product Swift To-Do List and ImagingShop (yet in the docks) both needed a serious visual component for major part of its client area. Look at screenshots of these applications:

Swift To-Do List ImagingShop

It may not be noticeable where the ListView-like component is, so there is the highlighted version:

Swift To-Do List ImagingShop

These parts look very different, as the applications have different purpose. One is a task management/sheduling software, and the second is a photo management/editing software.

In the first case, we have to deal with specific requirements like multi-column sorting, cell highlighting, item reordering and of course many, many more

In the second case, photo application required display of arbitrarily-sized thumbnails, custom tooltips and multi-line captions.

It was apparent, that the .NET ListView is not able to fullfill all of these requirements even if we bend and customize it to the limit. ListView is also a visual component of long history dating back to the earliest versions of Microsoft Windows. During its lifetime, it grabbed problematic stuff, that have to be kept for backward compatibility.

And the .NET ListView is a wrapper around all this. It contains hacks and workarounds to make it work more properly. Even with all that, try to display a backround watermark image while retaining Vista visual style. Impossible.

So we designed a control that lacks all the bugs and drawbacks of the .NET ListView while containing all the sweet features. It was ready to use for our needs.

But it has some 40 K lines of code and aspiring to be itself a product. We decided to develop Better ListView as a commercialy available component at the very beginning of its development.

We agreed on this kind of win-win-win strategy (for the end-user, for customer-developer, and for us) and hope all will benefit from maintaining a better Better ListView :-)

]]>
http://www.componentowl.com/blog/synergy-of-better-listview-and-our-applications/feed/ 0