L'altra volta avevo accennato all'idea di poter organizzare le emoticons in sotto-folder, contenuti in: C:\Documents and Settings\All Users\Application Data\VivendoByte Emoticons. Notare che la directory non è più per-user. Questo implica il fatto che una volta che il plug-in viene installato, tutti gli utenti condividano lo stesso set di emoticons. Niente di male, direi.
L'altra volta avevo accennato al fatto che i Button che contengono le emoticons sono contenuti all'interno di un WrapPanel. Tale WrapPanel è definito nello XAML della Window ChooseEmoticon.
<WrapPanel Grid.Column="0" Grid.Row="1"
Name="MainPanel" ItemHeight="{StaticResource Size}" ItemWidth="{StaticResource Size}">
</WrapPanel>
La classe ChooseEmoticon dispone di un metodo privato populateIcons(), che viene chiamato nel costruttore e successivamente ogni volta che viene cambiata directory. Tale metodo fa quanto segue:
- svuota i Children del WrapPanel
- eventualmente aggiunge un pulsante per tornare su di una directory
- aggiunge tanti FolderButton quanti sono i sotto-folder presenti nella directory corrente
- aggiunge tanti Button quanti sono i files .GIF presenti nella directory corrente
- aggiorna la proprietà Text del TextBlock per indicare all'utente quante emoticons ci sono
Il punto (2) richiede un breve chiarimento. Non voglio che l'utente navighi al di fuori di C:\Documents and Settings\All Users\Application Data\VivendoByte Emoticons, pertanto il FolderButton che torna su appare solo se ci troviamo in una sua sotto-directory, e non negli altri casi.
Anche il punto (3) richiede un chiarimento. La classe FolderButton infatti non esiste nel FW3.0, ma l'ho creata io attraverso un piccolo blocco di XAML. Lo XAML ovviamente non serve solo a creare Window o Page, ma a creare qualsiasi classe. La classe FolderButton eredita da un normale Button, ma ne specializza l'aspetto: utilizza una risorsa folder.bmp, in modo tale da creare un pulsante che come contenuto ha un'immagine che fa capire che si tratta di una directory. Ecco lo XAML che ho utilizzato per definire la classe FolderButton:
<Button x:Class="VivendoByte.Emoticons.FolderButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions>
<Grid.RowDefinitions><RowDefinition></RowDefinition></Grid.RowDefinitions>
<Image Grid.Column="0" Grid.Row="0">
<Image.Source>
<BitmapImage UriSource="Images/folder.bmp" />
</Image.Source>
</Image>
<TextBlock
Name="folderName"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Grid.Column="0" Grid.Row="0">..</TextBlock>
</Grid>
</Button>
Di default la classe FolderButton crea un Button con dentro l'immagine di un folder ed il cui testo è "..". Un FolderButton contiene una Grid con una sola riga ed una sola colonna. L'unica cella contiene sia l'immagine che un oggetto TextBlock, nel cui testo finisce il nome della directory a cui si fa riferimento. Notare che l'immagine viene caricata dalla risorsa /Images/folder.bmp: ovviamente tale file è stato inserito nella soluzione come Resource.
Nel metodo populateIcons di cui parlavo prima, posso scrivere una cosa tipo:
private FrameworkElement getFolderElement(string directoryName)
{
FolderButton btn = new FolderButton();
btn.ToolTip = directoryName;
btn.Tag = directoryName;
btn.MouseDoubleClick += new MouseButtonEventHandler(FolderDoubleClicked);
return (btn);
}
Questo metodo ritorna un'istanza di FrameworkElement: nella fattispecie proprio un FolderButton. Ad ogni istanza associo un tooltip, imposto il tag ed assegno l'handler per l'evento MouseButtonDoubleClick: quando l'utente doppio-clicca su un FolderButton, faccio altre cosine e richiamo la populateIcons() per reimpostare il WrapPanel.
Vorrei sinceramente mettere altro codice, però il fatto di non poter avere scrollbar nei blocchi di codice causa la comparsa di post lunghi un chilometro: preferisco non farlo.