2007-10-31 20:34:09 +00:00
|
|
|
|
|
|
|
#region ================== Copyright (c) 2007 Pascal vd Heiden
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
|
|
|
|
* This program is released under GNU General Public License
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Namespaces
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.ComponentModel;
|
|
|
|
using System.Drawing;
|
|
|
|
using System.Text;
|
|
|
|
using System.Windows.Forms;
|
|
|
|
using Microsoft.Win32;
|
|
|
|
using System.Diagnostics;
|
|
|
|
using CodeImp.DoomBuilder.Controls;
|
|
|
|
using CodeImp.DoomBuilder.Data;
|
|
|
|
using CodeImp.DoomBuilder.Config;
|
2007-10-31 21:33:06 +00:00
|
|
|
using CodeImp.DoomBuilder.Rendering;
|
2007-11-04 22:19:30 +00:00
|
|
|
using SlimDX.Direct3D9;
|
|
|
|
using System.Drawing.Imaging;
|
|
|
|
using System.Drawing.Drawing2D;
|
2007-10-31 20:34:09 +00:00
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
namespace CodeImp.DoomBuilder.Interface
|
|
|
|
{
|
|
|
|
public partial class ImageBrowser : UserControl
|
|
|
|
{
|
2007-11-04 22:19:30 +00:00
|
|
|
#region ================== Delegates / Events
|
2007-10-31 20:34:09 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
public delegate void SelectedItemChangedDelegate();
|
2007-10-31 20:34:09 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
public event SelectedItemChangedDelegate SelectedItemChanged;
|
|
|
|
|
2007-10-31 20:34:09 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Variables
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// States
|
|
|
|
private bool updating;
|
2007-10-31 21:33:06 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// All items
|
2007-10-31 21:33:06 +00:00
|
|
|
private List<ImageBrowserItem> items;
|
2007-10-31 20:34:09 +00:00
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Properties
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
public string LabelText { get { return label.Text; } set { label.Text = value; objectname.Left = label.Right + label.Margin.Right + objectname.Margin.Left; } }
|
|
|
|
public ListViewItem SelectedItem { get { if(list.SelectedItems.Count > 0) return list.SelectedItems[0]; else return null; } }
|
|
|
|
|
2007-10-31 20:34:09 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Constructor / Disposer
|
|
|
|
|
|
|
|
// Constructor
|
|
|
|
public ImageBrowser()
|
|
|
|
{
|
2007-10-31 22:16:53 +00:00
|
|
|
// Initialize
|
|
|
|
InitializeComponent();
|
2007-10-31 21:33:06 +00:00
|
|
|
items = new List<ImageBrowserItem>();
|
2007-11-04 22:19:30 +00:00
|
|
|
|
|
|
|
// Move textbox with label
|
|
|
|
objectname.Left = label.Right + label.Margin.Right + objectname.Margin.Left;
|
2007-10-31 22:16:53 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Rendering
|
|
|
|
|
|
|
|
// Draw item
|
|
|
|
private void list_DrawItem(object sender, DrawListViewItemEventArgs e)
|
2007-10-31 22:16:53 +00:00
|
|
|
{
|
2007-11-04 22:19:30 +00:00
|
|
|
if(!updating)
|
|
|
|
e.Graphics.DrawImageUnscaled((e.Item as ImageBrowserItem).GetImage(e.Bounds), e.Bounds);
|
2007-10-31 20:34:09 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// Resfresher
|
|
|
|
private void refreshtimer_Tick(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
// Go for all items
|
|
|
|
foreach(ImageBrowserItem i in list.Items)
|
|
|
|
{
|
|
|
|
// Items needs to be redrawn?
|
|
|
|
if(i.CheckRedrawNeeded(i.Bounds))
|
|
|
|
{
|
|
|
|
// Redraw item
|
|
|
|
i.GetImage(i.Bounds);
|
|
|
|
|
|
|
|
// Refresh item in list
|
|
|
|
list.RedrawItems(i.Index, i.Index, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Continue refreshing only when still loading data
|
|
|
|
refreshtimer.Enabled = General.Map.Data.IsLoading;
|
|
|
|
}
|
|
|
|
|
2007-10-31 20:34:09 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Events
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// Name typed
|
|
|
|
private void objectname_TextChanged(object sender, EventArgs e)
|
2007-10-31 20:34:09 +00:00
|
|
|
{
|
2007-11-04 23:09:21 +00:00
|
|
|
Point spos;
|
|
|
|
|
|
|
|
// Update list
|
2007-11-04 22:19:30 +00:00
|
|
|
RefillList();
|
2007-11-04 23:09:21 +00:00
|
|
|
|
|
|
|
// No item selected?
|
|
|
|
if(list.SelectedItems.Count == 0)
|
|
|
|
{
|
|
|
|
// Select first
|
|
|
|
SelectFirstItem();
|
|
|
|
}
|
2007-10-31 20:34:09 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// Key pressed
|
|
|
|
private void objectname_KeyDown(object sender, KeyEventArgs e)
|
|
|
|
{
|
|
|
|
// Check what key is pressed
|
|
|
|
switch(e.KeyData)
|
|
|
|
{
|
|
|
|
// Cursor keys
|
|
|
|
case Keys.Left: SelectNextItem(SearchDirectionHint.Left); e.SuppressKeyPress = true; break;
|
|
|
|
case Keys.Right: SelectNextItem(SearchDirectionHint.Right); e.SuppressKeyPress = true; break;
|
|
|
|
case Keys.Up: SelectNextItem(SearchDirectionHint.Up); e.SuppressKeyPress = true; break;
|
|
|
|
case Keys.Down: SelectNextItem(SearchDirectionHint.Down); e.SuppressKeyPress = true; break;
|
|
|
|
}
|
|
|
|
}
|
2007-10-31 21:33:06 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// Selection changed
|
|
|
|
private void list_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
|
2007-10-31 22:16:53 +00:00
|
|
|
{
|
2007-11-04 22:19:30 +00:00
|
|
|
// Raise event
|
|
|
|
if(SelectedItemChanged != null) SelectedItemChanged();
|
2007-10-31 22:16:53 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Methods
|
2007-10-31 20:34:09 +00:00
|
|
|
|
2007-11-04 23:09:21 +00:00
|
|
|
// This selects an item by name
|
|
|
|
public void SelectItem(string name)
|
|
|
|
{
|
|
|
|
ListViewItem lvi;
|
|
|
|
|
|
|
|
// Find item with this text
|
|
|
|
lvi = list.FindItemWithText(name);
|
|
|
|
if(lvi != null)
|
|
|
|
{
|
|
|
|
// Does the text really match?
|
|
|
|
if(lvi.Text == name)
|
|
|
|
{
|
|
|
|
// Select this item
|
|
|
|
list.SelectedItems.Clear();
|
|
|
|
lvi.Selected = true;
|
|
|
|
lvi.EnsureVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// This performs item sleection by keys
|
|
|
|
private void SelectNextItem(SearchDirectionHint dir)
|
|
|
|
{
|
|
|
|
ListViewItem lvi;
|
|
|
|
Point spos;
|
|
|
|
|
|
|
|
// Nothing selected?
|
|
|
|
if(list.SelectedItems.Count == 0)
|
|
|
|
{
|
|
|
|
// Select first
|
2007-11-04 23:09:21 +00:00
|
|
|
SelectFirstItem();
|
2007-11-04 22:19:30 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Get selected item
|
|
|
|
lvi = list.SelectedItems[0];
|
|
|
|
|
|
|
|
// Determine point to start searching from
|
|
|
|
switch(dir)
|
|
|
|
{
|
|
|
|
case SearchDirectionHint.Left: spos = new Point(lvi.Bounds.Left - 1, lvi.Bounds.Top + 1); break;
|
|
|
|
case SearchDirectionHint.Right: spos = new Point(lvi.Bounds.Left + 1, lvi.Bounds.Top + 1); break;
|
|
|
|
case SearchDirectionHint.Up: spos = new Point(lvi.Bounds.Left + 1, lvi.Bounds.Top - 1); break;
|
|
|
|
case SearchDirectionHint.Down: spos = new Point(lvi.Bounds.Left + 1, lvi.Bounds.Bottom + 1); break;
|
|
|
|
default: spos = new Point(0, 0); break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Find next item
|
|
|
|
//lvi = list.SelectedItems[0].FindNearestItem(dir);
|
|
|
|
lvi = list.FindNearestItem(dir, spos);
|
|
|
|
if(lvi != null)
|
|
|
|
{
|
|
|
|
// Select next item
|
|
|
|
list.SelectedItems.Clear();
|
|
|
|
lvi.Selected = true;
|
2007-11-04 23:09:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Make selection visible
|
|
|
|
if(list.SelectedItems.Count > 0) list.SelectedItems[0].EnsureVisible();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// This selectes the first item
|
|
|
|
private void SelectFirstItem()
|
|
|
|
{
|
|
|
|
ListViewItem lvi;
|
|
|
|
|
|
|
|
// Select first
|
|
|
|
if(list.Items.Count > 0)
|
|
|
|
{
|
|
|
|
list.SelectedItems.Clear();
|
|
|
|
lvi = list.FindNearestItem(SearchDirectionHint.Down, new Point(1, -100000));
|
|
|
|
if(lvi != null)
|
|
|
|
{
|
|
|
|
lvi.Selected = true;
|
2007-11-04 22:19:30 +00:00
|
|
|
lvi.EnsureVisible();
|
|
|
|
}
|
|
|
|
}
|
2007-10-31 21:33:06 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// This adds a group
|
|
|
|
public ListViewGroup AddGroup(string name)
|
|
|
|
{
|
|
|
|
ListViewGroup grp = new ListViewGroup(name);
|
|
|
|
list.Groups.Add(grp);
|
|
|
|
return grp;
|
|
|
|
}
|
2007-10-31 20:34:09 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// This begins adding items
|
|
|
|
public void BeginAdding()
|
|
|
|
{
|
2007-11-04 23:09:21 +00:00
|
|
|
// Stop updating
|
2007-11-04 22:19:30 +00:00
|
|
|
refreshtimer.Enabled = false;
|
|
|
|
}
|
2007-10-31 20:34:09 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// This ends adding items
|
|
|
|
public void EndAdding()
|
|
|
|
{
|
2007-11-04 23:09:21 +00:00
|
|
|
// Fill list with items
|
2007-11-04 22:19:30 +00:00
|
|
|
RefillList();
|
2007-11-04 23:09:21 +00:00
|
|
|
|
|
|
|
// Start updating if needed
|
2007-11-04 22:19:30 +00:00
|
|
|
refreshtimer.Enabled = true;
|
2007-11-04 23:09:21 +00:00
|
|
|
|
|
|
|
// Select first item
|
|
|
|
SelectFirstItem();
|
2007-11-04 22:19:30 +00:00
|
|
|
}
|
|
|
|
|
2007-10-31 20:34:09 +00:00
|
|
|
// This adds an item
|
2007-11-04 22:19:30 +00:00
|
|
|
public void Add(string text, ImageData image, object tag, ListViewGroup group)
|
2007-10-31 20:34:09 +00:00
|
|
|
{
|
2007-11-04 22:19:30 +00:00
|
|
|
ImageBrowserItem i = new ImageBrowserItem(text, image, tag);
|
|
|
|
i.ListGroup = group;
|
|
|
|
i.Group = group;
|
|
|
|
items.Add(i);
|
|
|
|
}
|
2007-10-31 21:33:06 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// This fills the list based on the objectname filter
|
|
|
|
private void RefillList()
|
|
|
|
{
|
|
|
|
List<ListViewItem> showitems = new List<ListViewItem>();
|
2007-10-31 20:34:09 +00:00
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// Begin updating list
|
|
|
|
updating = true;
|
|
|
|
list.SuspendLayout();
|
|
|
|
list.BeginUpdate();
|
|
|
|
|
|
|
|
// Clear list first
|
|
|
|
// Group property of items will be set to null, we will restore it later
|
|
|
|
list.Items.Clear();
|
|
|
|
|
|
|
|
// Go for all items NOT in the list
|
|
|
|
foreach(ImageBrowserItem i in items)
|
|
|
|
{
|
|
|
|
// Add item if valid
|
|
|
|
if(ValidateItem(i))
|
|
|
|
{
|
|
|
|
i.Group = i.ListGroup;
|
2007-11-04 23:09:21 +00:00
|
|
|
i.Selected = false;
|
2007-11-04 22:19:30 +00:00
|
|
|
showitems.Add(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fill list
|
|
|
|
list.Items.AddRange(showitems.ToArray());
|
|
|
|
|
|
|
|
// Done updating list
|
|
|
|
updating = false;
|
|
|
|
list.EndUpdate();
|
|
|
|
list.ResumeLayout();
|
|
|
|
|
|
|
|
// Raise event
|
|
|
|
if(SelectedItemChanged != null) SelectedItemChanged();
|
2007-10-31 20:34:09 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 22:19:30 +00:00
|
|
|
// This validates an item
|
|
|
|
private bool ValidateItem(ImageBrowserItem i)
|
|
|
|
{
|
|
|
|
return i.Text.Contains(objectname.Text);
|
|
|
|
}
|
|
|
|
|
2007-11-04 23:09:21 +00:00
|
|
|
// This sends the focus to the textbox
|
|
|
|
public void FocusTextbox()
|
|
|
|
{
|
|
|
|
objectname.Focus();
|
|
|
|
}
|
|
|
|
|
2007-10-31 20:34:09 +00:00
|
|
|
#endregion
|
|
|
|
}
|
|
|
|
}
|