/*
* Property.cs
* Copyright (c) 2007-2009 kbinani
*
* This file is part of LipSync.
*
* LipSync is free software; you can redistribute it and/or
* modify it under the terms of the BSD License.
*
* LipSync 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.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Boare.Lib.AppUtil;
namespace LipSync {
public delegate void TelopAddingEventHandler();
public delegate void TelopDeletingEventHandler( ZorderItem e );
public delegate void EditingItemChangedEventHandler( ZorderItem e );
public delegate void ListUpdateRequiredEventHandler();
public partial class Property : UserControl {
private ZorderItem m_editing = null;
FormObjectList m_form_objectlist;
int m_last_splitter_distance = 126;
bool[] m_sort_ascend = new bool[] { true, true, true }; // start, type, abstの各項目が昇順で並べ替えられているかどうかを表す
int[] m_sort_order = new int[] { 0, 1, 2 }; // start, type, abstの列のデータが,項目を並べ替える際に順番の判定に使用される順位.
private static Property m_instance = null;
///
/// プロパティ・ビューの値が変更されたときに発生します
///
public event PropertyValueChangedEventHandler PropertyValueChanged;
///
/// テロップの追加が要求されたときに発生します
///
public event TelopAddingEventHandler TelopAdding;
///
/// テロップの削除が要求されたときに発生します
///
public event TelopDeletingEventHandler TelopDeleting;
///
/// オブジェクトリストで選択アイテムが変更されたとき発生します
///
public event EventHandler SelectedIndexChanged;
public event EditingItemChangedEventHandler EditingItemChanged;
///
/// オブジェクトリストの更新が必要となったとき発生します
///
public event ListUpdateRequiredEventHandler ListUpdateRequired;
public void UpdateLayout() {
// panel1
titleUpper.Left = 0;
titleUpper.Top = 0;
titleUpper.Width = sContainer.Panel1.Width;
panelListView.Left = 0;
panelListView.Top = titleUpper.Height;
panelListView.Width = sContainer.Panel1.Width;
panelListView.Height = sContainer.Panel1.Height - titleUpper.Height;
// panel2
titleLower.Left = 0;
titleLower.Top = 0;
titleLower.Width = sContainer.Panel2.Width;
panel1.Left = 0;
panel1.Top = titleLower.Height;
panel1.Width = sContainer.Panel2.Width;
panel1.Height = sContainer.Panel2.Height - titleLower.Height;
}
public void ApplyLanguage() {
menuAddTelop.Text = _( "Add Telop" ) + "(&A)";
menuDeleteTelop.Text = _( "Delte Delop" ) + "(&D)";
m_form_objectlist.ApplyLanguage();
}
public static string _( string s ) {
return Messaging.GetMessage( s );
}
public static Property Instance {
get {
return m_instance;
}
}
public void Sort() {
if ( listView.Items.Count < 2 ) {
return;
}
bool changed = true;
List sorting = new List();
for ( int i = 0; i < listView.Items.Count; i++ ) {
sorting.Add( listView.Items[i] );
}
while ( changed ) {
changed = false;
for ( int i = 0; i < sorting.Count - 1; i++ ) {
if ( Compare( sorting[i], sorting[i + 1] ) > 0 ) {
ListViewItem cp = (ListViewItem)sorting[i].Clone();
sorting[i] = (ListViewItem)sorting[i + 1].Clone();
sorting[i + 1] = cp;
changed = true;
}
}
}
listView.Items.Clear();
listView.Items.AddRange( sorting.ToArray() );
}
///
/// 第index1項目が第index2項目より順位が低いときtrue,そうでないときfalse
///
///
///
///
public int Compare( ListViewItem item1, ListViewItem item2 ) {
int[] order = new int[3];
order[0] = CompareWithStart( item1, item2 );
order[1] = CompareWithType( item1, item2 );
order[2] = CompareWithAbst( item1, item2 );
if ( order[m_sort_order[0]] == 0 ) {
if ( order[m_sort_order[1]] == 0 ) {
return order[m_sort_order[2]];
} else {
return order[m_sort_order[1]];
}
} else {
return order[m_sort_order[0]];
}
}
private int CompareWithAbst( ListViewItem item1, ListViewItem item2 ) {
string t1 = item1.SubItems[2].Text;
string t2 = item2.SubItems[2].Text;
int res = t1.CompareTo( t2 );
if ( !m_sort_ascend[2] ) {
res = -1 * res;
}
return res;
}
private int CompareWithType( ListViewItem item1, ListViewItem item2 ) {
if ( !(item1.Tag is ZorderItem) || !(item2.Tag is ZorderItem) ) {
return 0;
}
ZorderItem zitem1 = (ZorderItem)item1.Tag;
ZorderItem zitem2 = (ZorderItem)item2.Tag;
ZorderItemType t1 = zitem1.Type;
ZorderItemType t2 = zitem2.Type;
int res = t1.CompareTo( t2 );
if ( !m_sort_ascend[1] ) {
res = -1 * res;
}
return res;
}
private int CompareWithStart( ListViewItem item1, ListViewItem item2 ) {
float titem1 = ((ZorderItem)item1.Tag).Start;
float titem2 = ((ZorderItem)item2.Tag).Start;
int res = 0;
if ( titem1 > titem2 ) {
res = 1;
} else if ( titem1 < titem2 ) {
res = -1;
} else {
res = 0;
}
if ( !m_sort_ascend[0] ) {
res = -1 * res;
}
return res;
}
public ZorderItem this[int index] {
get {
return (ZorderItem)listView.Items[index].Tag;
}
}
public int Count {
get {
return listView.Items.Count;
}
}
public int SelectedIndex {
get {
if ( listView.SelectedItems.Count > 0 ) {
foreach ( ListViewItem item in listView.SelectedItems ) {
return item.Index;
}
}
return -1;
}
set {
for ( int i = 0; i < listView.Items.Count; i++ ) {
if ( i == value ) {
listView.Items[i].Selected = true;
} else {
listView.Items[i].Selected = false;
}
}
}
}
public ZorderItem SelectedItem {
get {
int index = SelectedIndex;
if ( index < 0 || listView.Items.Count <= index ) {
return null;
} else {
return (ZorderItem)listView.Items[index].Tag;
}
}
}
public ListView ListView {
get {
return listView;
}
}
public ZorderItem Editing {
get {
return m_editing;
}
set {
m_editing = value;
if ( this.EditingItemChanged != null ) {
this.EditingItemChanged( m_editing );
}
}
}
public object SelectedObject {
get {
return PropertyGrid.SelectedObject;
}
set {
PropertyGrid.SelectedObject = value;
}
}
public Property() {
InitializeComponent();
m_form_objectlist = new FormObjectList();
m_form_objectlist.FormClosing += new FormClosingEventHandler( m_form_objectlist_FormClosing );
m_instance = this;
}
void m_form_objectlist_FormClosing( object sender, FormClosingEventArgs e ) {
listView.Parent = panelListView;
listView.Dock = DockStyle.Fill;
sContainer.SplitterDistance = m_last_splitter_distance;
sContainer.IsSplitterFixed = false;
}
private void PropertyGrid_Click( object sender, EventArgs e ) {
this.sContainer.Panel2.Focus();
}
private void splitContainer1_Panel2_Enter( object sender, EventArgs e ) {
this.titleLower.BackColor = SystemColors.ActiveCaption;
this.titleLower.ForeColor = SystemColors.ActiveCaptionText;
}
private void splitContainer1_Panel2_Leave( object sender, EventArgs e ) {
this.titleLower.BackColor = SystemColors.InactiveCaption;
this.titleLower.ForeColor = SystemColors.InactiveCaptionText;
}
private void splitContainer1_Panel1_Leave( object sender, EventArgs e ) {
this.titleUpper.BackColor = SystemColors.InactiveCaption;
this.titleUpper.ForeColor = SystemColors.InactiveCaptionText;
}
private void splitContainer1_Panel1_Enter( object sender, EventArgs e ) {
this.titleUpper.BackColor = SystemColors.ActiveCaption;
this.titleUpper.ForeColor = SystemColors.ActiveCaptionText;
}
private void titleUpper_MouseDown( object sender, MouseEventArgs e ) {
this.sContainer.Panel1.Focus();
}
private void titleLower_MouseDown( object sender, MouseEventArgs e ) {
this.sContainer.Panel2.Focus();
}
private void ListView_Enter( object sender, EventArgs e ) {
this.titleUpper.BackColor = SystemColors.ActiveCaption;
this.titleUpper.ForeColor = SystemColors.ActiveCaptionText;
}
private void PropertyGrid_PropertyValueChanged( object s, PropertyValueChangedEventArgs e ) {
if ( this.PropertyValueChanged != null ) {
this.PropertyValueChanged( s, e );
}
if ( ListUpdateRequired != null ) {
ListUpdateRequired();
}
}
private void menuAddTelop_Click( object sender, EventArgs e ) {
if ( this.TelopAdding != null ) {
this.TelopAdding();
}
if ( ListUpdateRequired != null ) {
ListUpdateRequired();
}
}
private void menuDeleteTelop_Click( object sender, EventArgs e ) {
if ( this.SelectedIndex < 0 ) {
return;
}
if ( this.TelopDeleting != null ) {
this.TelopDeleting( this.SelectedItem );
}
if ( ListUpdateRequired != null ) {
ListUpdateRequired();
}
}
public ZorderItem Selected {
get {
return m_editing;
}
}
void listView_SelectedIndexChanged( object sender, EventArgs e ) {
if ( listView.SelectedItems.Count > 0 && this.EditingItemChanged != null ) {
ZorderItem zi = (ZorderItem)listView.SelectedItems[0].Tag;
Editing = zi;
}
}
private void TreeView_MouseDown( object sender, MouseEventArgs e ) {
if ( this.PropertyValueChanged != null ) {
this.PropertyValueChanged( sender, null );
}
}
private void titleUpper_DoubleClick( object sender, EventArgs e ) {
m_form_objectlist.Show( listView );
m_last_splitter_distance = sContainer.SplitterDistance;
sContainer.SplitterDistance = 0;
sContainer.IsSplitterFixed = true;
}
private void listView_ColumnClick( object sender, ColumnClickEventArgs e ) {
int column = e.Column;
if ( m_sort_order[0] == column ) {
m_sort_ascend[column] = !m_sort_ascend[column];
List coll = new List();
for ( int i = listView.Items.Count - 1; i >= 0; i-- ) {
coll.Add( listView.Items[i] );
}
listView.Items.Clear();
listView.Items.AddRange( coll.ToArray() );
this.Sort();
} else {
List list = new List();
for ( int i = 0; i < 3; i++ ) {
if ( m_sort_order[i] != column ) {
list.Add( m_sort_order[i] );
}
}
m_sort_order[0] = column;
m_sort_order[1] = list[0];
m_sort_order[2] = list[1];
this.Sort();
}
}
private void Property_FontChanged( object sender, EventArgs e ) {
cmenu.Font = this.Font;
}
}
}