mirror of
https://git.femboyfinancial.jp/james/lipsync.git
synced 2024-11-26 04:12:00 -08:00
390 lines
14 KiB
C#
390 lines
14 KiB
C#
/*
|
||
* 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;
|
||
|
||
/// <summary>
|
||
/// プロパティ・ビューの値が変更されたときに発生します
|
||
/// </summary>
|
||
public event PropertyValueChangedEventHandler PropertyValueChanged;
|
||
/// <summary>
|
||
/// テロップの追加が要求されたときに発生します
|
||
/// </summary>
|
||
public event TelopAddingEventHandler TelopAdding;
|
||
/// <summary>
|
||
/// テロップの削除が要求されたときに発生します
|
||
/// </summary>
|
||
public event TelopDeletingEventHandler TelopDeleting;
|
||
/// <summary>
|
||
/// オブジェクトリストで選択アイテムが変更されたとき発生します
|
||
/// </summary>
|
||
public event EventHandler SelectedIndexChanged;
|
||
public event EditingItemChangedEventHandler EditingItemChanged;
|
||
/// <summary>
|
||
/// オブジェクトリストの更新が必要となったとき発生します
|
||
/// </summary>
|
||
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<ListViewItem> sorting = new List<ListViewItem>();
|
||
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() );
|
||
}
|
||
|
||
/// <summary>
|
||
/// 第index1項目が第index2項目より順位が低いときtrue,そうでないときfalse
|
||
/// </summary>
|
||
/// <param name="index1"></param>
|
||
/// <param name="index2"></param>
|
||
/// <returns></returns>
|
||
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<ListViewItem> coll = new List<ListViewItem>();
|
||
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<int> list = new List<int>();
|
||
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;
|
||
}
|
||
}
|
||
|
||
}
|