Commit 81b667a9 authored by tsuji's avatar tsuji

GetADocGUI(Framework4.6.1ver)を修正

parent 821380e5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
using System.Runtime.InteropServices;
namespace GetADoc
{
//親(メイン)ウインドウの中心にメッセージを表示するためのクラス
class CustomMsgBox
{/// <summary>
/// 親ウィンドウ
/// </summary>
private Window ownerWindow = null;
/// <summary>
/// フックハンドル
/// </summary>
private IntPtr hHook = IntPtr.Zero;
/// <summary>
/// メッセージボックスを表示する
/// </summary>
/// <param name="owner"></param>
/// <param name="messageBoxText"></param>
/// <param name="caption"></param>
/// <param name="button"></param>
/// <param name="icon"></param>
/// <returns></returns>
public static MessageBoxResult Show(
Window owner,
string messageBoxText,
string caption,
MessageBoxButton button,
MessageBoxImage icon)
{
if (owner.WindowState == WindowState.Minimized)
{
return MessageBox.Show(owner, messageBoxText, caption, button, icon);
}
else
{
CustomMsgBox mbox = new CustomMsgBox(owner);
return mbox.Show(messageBoxText, caption, button, icon);
}
}
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="window">Owner Window</param>
private CustomMsgBox(Window window)
{
ownerWindow = window;
}
/// <summary>
/// メッセージボックスを表示する
/// </summary>
/// <param name="messageBoxText"></param>
/// <param name="caption"></param>
/// <param name="button"></param>
/// <param name="icon"></param>
/// <returns></returns>
private MessageBoxResult Show(
string messageBoxText,
string caption,
MessageBoxButton button,
MessageBoxImage icon)
{
// フックを設定する。
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(ownerWindow);
IntPtr hInstance = WinAPI.GetWindowLong(hwndSource.Handle, WinAPI.GWL_HINSTANCE);
IntPtr threadId = WinAPI.GetCurrentThreadId();
hHook = WinAPI.SetWindowsHookEx(WinAPI.WH_CBT, new WinAPI.HOOKPROC(HookProc), hInstance, threadId);
return MessageBox.Show(ownerWindow, messageBoxText, caption, button, icon);
}
/// <summary>
/// フックプロシージャ
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode == WinAPI.HCBT_ACTIVATE)
{
WinAPI.RECT rcForm = new WinAPI.RECT(0, 0, 0, 0);
WinAPI.RECT rcMsgBox = new WinAPI.RECT(0, 0, 0, 0);
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(ownerWindow);
WinAPI.GetWindowRect(hwndSource.Handle, out rcForm);
WinAPI.GetWindowRect(wParam, out rcMsgBox);
// センター位置を計算する。
int x = (rcForm.Left + (rcForm.Right - rcForm.Left) / 2) - ((rcMsgBox.Right - rcMsgBox.Left) / 2);
int y = (rcForm.Top + (rcForm.Bottom - rcForm.Top) / 2) - ((rcMsgBox.Bottom - rcMsgBox.Top) / 2);
WinAPI.SetWindowPos(wParam, 0, x, y, 0, 0, WinAPI.SWP_NOSIZE | WinAPI.SWP_NOZORDER | WinAPI.SWP_NOACTIVATE);
IntPtr result = WinAPI.CallNextHookEx(hHook, nCode, wParam, lParam);
// フックを解除する。
WinAPI.UnhookWindowsHookEx(hHook);
hHook = IntPtr.Zero;
return result;
}
else
{
return WinAPI.CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
}
internal class WinAPI
{
[DllImport("user32.dll")]
public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("kernel32.dll")]
public static extern IntPtr GetCurrentThreadId();
[DllImport("user32.dll")]
public static extern IntPtr SetWindowsHookEx(int idHook, HOOKPROC lpfn, IntPtr hInstance, IntPtr threadId);
[DllImport("user32.dll")]
public static extern bool UnhookWindowsHookEx(IntPtr hHook);
[DllImport("user32.dll")]
public static extern IntPtr CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
public delegate IntPtr HOOKPROC(int nCode, IntPtr wParam, IntPtr lParam);
public const int GWL_HINSTANCE = (-6);
public const int WH_CBT = 5;
public const int HCBT_ACTIVATE = 5;
public const int SWP_NOSIZE = 0x0001;
public const int SWP_NOZORDER = 0x0004;
public const int SWP_NOACTIVATE = 0x0010;
public struct RECT
{
public RECT(int inLeft, int inTop, int inRight, int inBottom)
{
Left = inLeft;
Top = inTop;
Right = inRight;
Bottom = inBottom;
}
public int Left;
public int Top;
public int Right;
public int Bottom;
}
}
}
...@@ -72,6 +72,8 @@ ...@@ -72,6 +72,8 @@
<DependentUpon>App.xaml</DependentUpon> <DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="PushedButton.cs" />
<Compile Include="CustomMsgBox.cs" />
<Compile Include="MainWindow.xaml.cs"> <Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon> <DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
......
...@@ -5,32 +5,35 @@ ...@@ -5,32 +5,35 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GetADoc" xmlns:local="clr-namespace:GetADoc"
mc:Ignorable="d" mc:Ignorable="d"
Title="GetADoc" Height="250" Width="400"> Title="GetADoc" Height="260" Width="400" MinWidth="375" MinHeight="240">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="323*"/> <ColumnDefinition Width="100*"/>
<ColumnDefinition Width="77*"/> <ColumnDefinition Width="99*"/>
</Grid.ColumnDefinitions> <ColumnDefinition Width="111*"/>
<Grid.RowDefinitions> <ColumnDefinition Width="83*"/>
<RowDefinition Height="67*"/> </Grid.ColumnDefinitions>
<RowDefinition Height="69*"/> <Grid.RowDefinitions>
<RowDefinition Height="48*"/> <RowDefinition Height="88"/>
</Grid.RowDefinitions> <RowDefinition Height="74"/>
<Label FontWeight="Bold" FontSize="18" Grid.RowSpan="3" Grid.ColumnSpan="1"> <RowDefinition Height="8*"/>
AsciiDocの雛形を作成します <RowDefinition Height="51*"/>
</Label> </Grid.RowDefinitions>
<Label x:Name="label1" Content="作成先のフォルダ:" HorizontalAlignment="Left" Margin="10,40,0,0" VerticalAlignment="Top" Height="26"/> <Label FontWeight="Bold" FontSize="18" Grid.RowSpan="4" Grid.ColumnSpan="4" Margin="0,0,76.583,-3.333">
<TextBox x:Name="box1" Margin="10,67,0,68" Grid.RowSpan="2" AllowDrop="True" Drop="textBox_Drop" DragOver="textBox_PreviewDragOver" Panel.ZIndex="6"> AsciiDocの雛形を作成します
<フォルダ指定> </Label>
</TextBox> <Label x:Name="label1" Content="作成先のフォルダ:" HorizontalAlignment="Left" Margin="10,40,0,0" VerticalAlignment="Top" Height="26" Width="94" Grid.ColumnSpan="2"/>
<Label x:Name="label2" Content="ドキュメント名:" Grid.Row="1" HorizontalAlignment="Left" Margin="10,24,0,0" VerticalAlignment="Top" Height="26" Width="92"/> <TextBox x:Name="box1" Margin="10,67,9.512,2" AllowDrop="True" Drop="textBox_Drop" DragOver="textBox_PreviewDragOver" Panel.ZIndex="6" Grid.ColumnSpan="3">
<TextBox x:Name="box2" Margin="10,50,100,10" Grid.Row="1" AllowDrop="True" Panel.ZIndex="2"/> <フォルダ指定>
<Label x:Name="label3" Content="(.adoc)" HorizontalAlignment="Left" Margin="228,45,0,4" Grid.Row="1"/> </TextBox>
<Button x:Name="button1" Content="参照" Grid.Column="1" HorizontalAlignment="Left" Margin="12,69,0,0" VerticalAlignment="Top" Grid.RowSpan="2" Width="46" Click="button1_Click" Panel.ZIndex="2"/> <Label x:Name="label2" Content="ドキュメント名:" Grid.Row="1" HorizontalAlignment="Left" Margin="10,11,0,0" VerticalAlignment="Top" Height="26" Width="92" Grid.ColumnSpan="2"/>
<Button x:Name="button2" Content="作成" Grid.Column="1" HorizontalAlignment="Left" Margin="5,0,0,0" Grid.Row="2" VerticalAlignment="Center" Height="38" Width="62" Panel.ZIndex="2" Click="button2_Click"/> <TextBox x:Name="box2" Margin="10,37,10.418,18" Grid.Row="1" AllowDrop="True" Panel.ZIndex="2" Grid.ColumnSpan="2"/>
<CheckBox x:Name="checkbox1" Content="SCREEN Logo" Grid.Row="2" Margin="10,9,0,0" Panel.ZIndex="2"/> <Label x:Name="label3" Content="(.adoc)" HorizontalAlignment="Left" Margin="0.582,32,0,13" Grid.Row="1" Width="45" Grid.Column="2"/>
<CheckBox x:Name="checkbox2" Content="カスタムアイコン" Grid.Row="2" Margin="110,9,0,0" Panel.ZIndex="2"/> <Button x:Name="button1" Content="参照" Grid.Column="3" HorizontalAlignment="Left" Margin="11.488,66,0,0" VerticalAlignment="Top" Width="46" Click="button1_Click" Panel.ZIndex="2" Height="20"/>
<CheckBox x:Name="checkbox3" Content="分割ドキュメント" Grid.Row="2" Margin="210,9,0,0" Panel.ZIndex="2"/> <Button x:Name="button2" Content="作成" Grid.Column="3" HorizontalAlignment="Left" Margin="11,5,0,0" Grid.Row="2" Width="62" Panel.ZIndex="2" Click="button2_Click" Grid.RowSpan="2" Height="38" VerticalAlignment="Top"/>
<TextBox x:Name="allBox" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Width="400" Grid.ColumnSpan="2" Height="234" Grid.RowSpan="3" Opacity="0" Cursor="Arrow"/> <CheckBox x:Name="checkbox1" Content="SCREEN Logo" Grid.Row="3" Margin="12,9.667,76.333,-16.333" Panel.ZIndex="2" Grid.ColumnSpan="4" Height="66" VerticalAlignment="Top"/>
</Grid> <CheckBox x:Name="checkbox2" Content="カスタムアイコン" Grid.Row="3" Margin="10,9.667,15,-16.333" Panel.ZIndex="2" Grid.ColumnSpan="2" Grid.Column="1" Height="66" VerticalAlignment="Top"/>
<CheckBox x:Name="checkbox3" Content="分割ドキュメント" Grid.Row="3" Margin="9.333,9.667,64.333,-16.333" Panel.ZIndex="2" Grid.Column="2" Grid.ColumnSpan="2" Height="66" VerticalAlignment="Top"/>
<TextBox x:Name="allBox" TextWrapping="Wrap" Grid.ColumnSpan="4" Grid.RowSpan="4" Opacity="0" Cursor="Arrow" Margin="0,0,0.333,-0.333"/>
</Grid>
</Window> </Window>
...@@ -93,7 +93,7 @@ namespace GetADoc ...@@ -93,7 +93,7 @@ namespace GetADoc
//ファイルパスが指定されていない or 指定したフォルダが存在しない場合 //ファイルパスが指定されていない or 指定したフォルダが存在しない場合
if (box1.Text == "" || !Directory.Exists(box1.Text)) if (box1.Text == "" || !Directory.Exists(box1.Text))
{ {
MessageBox.Show("保存先が存在しません", "Folder not selected", MessageBoxButton.OK, MessageBoxImage.Warning); CustomMsgBox.Show(mainWindow, "保存先が存在しません", "Save destination does not exist", MessageBoxButton.OK, MessageBoxImage.Warning);
Properties.Settings.Default.box1Setting = ""; //記憶していたパスを初期化 Properties.Settings.Default.box1Setting = ""; //記憶していたパスを初期化
Properties.Settings.Default.Save(); Properties.Settings.Default.Save();
return; return;
...@@ -113,12 +113,8 @@ namespace GetADoc ...@@ -113,12 +113,8 @@ namespace GetADoc
char[] cutComma = { '.' }; char[] cutComma = { '.' };
if (fileName.IndexOfAny(NgChars) >= 0 || fileName.IndexOfAny(cutComma) >= 0) if (fileName.IndexOfAny(NgChars) >= 0 || fileName.IndexOfAny(cutComma) >= 0)
{ {
string[] charsToRemove = new string[] { @"\", ".", "/", ":", "*", "?", "<", ">", "|" }; fileName = PushedButton.NameCalibration(fileName);
foreach (var allNg in charsToRemove) CustomMsgBox.Show(mainWindow, "ファイル名に使用できない文字が存在したため\n一部ファイル名を修正しました。" +
{
fileName = fileName.Replace(allNg, string.Empty);
}
MessageBox.Show("ファイル名に使用できない文字が存在したため\n一部ファイル名を修正しました。" +
"\nもう一度作成ボタンをクリックしてください。", "Renamed this file", MessageBoxButton.OK, MessageBoxImage.Warning); "\nもう一度作成ボタンをクリックしてください。", "Renamed this file", MessageBoxButton.OK, MessageBoxImage.Warning);
box2.Text = fileName; box2.Text = fileName;
return; return;
...@@ -127,81 +123,43 @@ namespace GetADoc ...@@ -127,81 +123,43 @@ namespace GetADoc
//指定したフォルダに同名の.adocや既存の付属ファイル(config.adocなど)がある場合の処理 //指定したフォルダに同名の.adocや既存の付属ファイル(config.adocなど)がある場合の処理
if (File.Exists(System.IO.Path.Combine(filePath, fileName + ".adoc")) || File.Exists(System.IO.Path.Combine(filePath, "config.adoc"))) if (File.Exists(System.IO.Path.Combine(filePath, fileName + ".adoc")) || File.Exists(System.IO.Path.Combine(filePath, "config.adoc")))
{ {
MessageBoxResult OverwriteADoc = MessageBox.Show("これから生成するファイルと同名のファイルが既に存在します" + MessageBoxResult OverwriteADoc = CustomMsgBox.Show(mainWindow, "これから生成するファイルと同名のファイルが既に存在します" +
"\n既存のファイルを上書きしますか?", "\n既存のファイルを上書きしますか?",
"指定したフォルダに既存のファイルが存在します", "指定したフォルダに既存のファイルが存在します",
MessageBoxButton.YesNo); MessageBoxButton.YesNo, MessageBoxImage.None);
if (OverwriteADoc == MessageBoxResult.Yes) if (OverwriteADoc == MessageBoxResult.Yes)
{ {
File.Delete(filePath + fileName + ".adoc"); PushedButton.deleteFolder(filePath, fileName);
File.Delete(System.IO.Path.Combine(filePath, "config.adoc"));
File.Delete(System.IO.Path.Combine(filePath, "IncDoc.adoc"));
if (Directory.Exists(System.IO.Path.Combine(filePath, "Images")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Images"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "icons")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "icons"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Sub_First")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Sub_First"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Sub_Second")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Sub_Second"), true);
}
} }
else if(OverwriteADoc == MessageBoxResult.No) else if (OverwriteADoc == MessageBoxResult.No)
{ {
MessageBox.Show("別のフォルダを指定してください"); CustomMsgBox.Show(mainWindow, "別のフォルダを指定してください", "Please select another directory",
MessageBoxButton.OK, MessageBoxImage.None);
return; return;
} }
} }
//バッチファイルの実行 //バッチファイルの実行
ProcessStartInfo processStartInfo = new ProcessStartInfo(); var tempPath = System.IO.Path.GetTempPath();
string stCurrentDir = System.IO.Directory.GetCurrentDirectory(); bool IconFlag = false;
processStartInfo.FileName = System.IO.Path.Combine(stCurrentDir, "getADoc.Data", "getADoc.bat"); bool SCREENFlag = false;
processStartInfo.CreateNoWindow = true; // コマンドプロンプトを非表示 bool SepaFlag = false;
processStartInfo.UseShellExecute = false; // シェル機能オフ
//チェックボックスの状況に応じて引数を指定
processStartInfo.Arguments = "";
if (checkbox2.IsChecked == true)//Iconsチェックボックスがオンのとき if (checkbox2.IsChecked == true)//Iconsチェックボックスがオンのとき
{ {
processStartInfo.Arguments += "/Icons "; IconFlag = true;
} }
if (checkbox1.IsChecked == true)//SCREEN Logoチェックボックスがオンのとき if (checkbox1.IsChecked == true)//SCREEN Logoチェックボックスがオンのとき
{ {
processStartInfo.Arguments += "/SCREEN "; SCREENFlag = true;
} }
if (checkbox3.IsChecked == true)//分割ドキュチェックボックスがオンのとき if (checkbox3.IsChecked == true)//分割ドキュチェックボックスがオンのとき
{ {
processStartInfo.Arguments += "/SepaDoc "; SepaFlag = true;
} }
processStartInfo.Arguments += fileName; PushedButton.runBatch(IconFlag, SCREENFlag, SepaFlag, fileName, tempPath);
//GetADoc.batを実行
Process process = Process.Start(processStartInfo);
process.WaitForExit();
process.Close();
//指定されたフォルダに生成物を移動 //指定されたフォルダに生成物を移動
File.Move(System.IO.Path.Combine(stCurrentDir, fileName + ".adoc"), filePath + fileName + ".adoc"); PushedButton.MoveProduct(IconFlag, SepaFlag, fileName, tempPath, filePath);
File.Move(System.IO.Path.Combine(stCurrentDir, "config.adoc"), System.IO.Path.Combine(filePath, "config.adoc"));
Directory.Move(System.IO.Path.Combine(stCurrentDir, "Images"), System.IO.Path.Combine(filePath, "Images"));
if (checkbox2.IsChecked == true)
{
Directory.Move(System.IO.Path.Combine(stCurrentDir, "icons"), System.IO.Path.Combine(filePath, "icons"));
}
if (checkbox3.IsChecked == true)
{
File.Move(System.IO.Path.Combine(stCurrentDir, "IncDoc.adoc"), System.IO.Path.Combine(filePath, "IncDoc.adoc"));
Directory.Move(System.IO.Path.Combine(stCurrentDir, "Sub_First"), System.IO.Path.Combine(filePath, "Sub_First"));
Directory.Move(System.IO.Path.Combine(stCurrentDir, "Sub_Second"), System.IO.Path.Combine(filePath, "Sub_Second"));
}
//指定されたファイルパスとチェックボックスを保存 //指定されたファイルパスとチェックボックスを保存
Properties.Settings.Default.box1Setting = box1.Text; Properties.Settings.Default.box1Setting = box1.Text;
......
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace GetADoc
{
class PushedButton
{
//ファイル名に使用不可の文字が含まれている場合の処理
public static string NameCalibration(string inFileName)
{
string[] charsToRemove = new string[] { @"\", ".", "/", ":", "*", "?", "<", ">", "|" };
foreach (var allNg in charsToRemove)
{
inFileName = inFileName.Replace(allNg, string.Empty);
}
return inFileName;
}
//先に同名フォルダが存在すれば削除(エラー回避のため)
public static void deleteFolder(string filePath, string fileName)
{
File.Delete(filePath + fileName + ".adoc");
File.Delete(System.IO.Path.Combine(filePath, "config.adoc"));
File.Delete(System.IO.Path.Combine(filePath, "IncDoc.adoc"));
if (Directory.Exists(System.IO.Path.Combine(filePath, "Images")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Images"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "icons")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "icons"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Sub_First")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Sub_First"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Sub_Second")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Sub_Second"), true);
}
}
//バッチファイルの実行
public static void runBatch(bool icon, bool screen, bool sepa, string fileName, string tempPath)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo();
string stCurrentDir = System.IO.Directory.GetCurrentDirectory();
processStartInfo.FileName = System.IO.Path.Combine(stCurrentDir, "getADoc.Data", "getADoc.bat");
processStartInfo.CreateNoWindow = true; // コマンドプロンプトを非表示
processStartInfo.UseShellExecute = false; // シェル機能オフ
//チェックボックスの状況に応じて引数を指定
processStartInfo.Arguments = "";
if (icon == true)//Iconsチェックボックスがオンのとき
{
processStartInfo.Arguments += "/Icons ";
}
if (screen == true)//SCREEN Logoチェックボックスがオンのとき
{
processStartInfo.Arguments += "/SCREEN ";
}
if (sepa == true)//分割ドキュチェックボックスがオンのとき
{
processStartInfo.Arguments += "/SepaDoc ";
}
var pathAndName = System.IO.Path.Combine(tempPath, fileName);
processStartInfo.Arguments += pathAndName;
//GetADoc.batを実行
Process process = Process.Start(processStartInfo);
process.WaitForExit();
process.Close();
}
//生成物を指定先フォルダへ移動
static public void MoveProduct(bool icon, bool sepa,
string fileName, string tempPath, string filePath)
{
File.Move(System.IO.Path.Combine(tempPath, fileName + ".adoc"), filePath + fileName + ".adoc");
File.Move(System.IO.Path.Combine(tempPath, "config.adoc"), System.IO.Path.Combine(filePath, "config.adoc"));
Directory.Move(System.IO.Path.Combine(tempPath, "Images"), System.IO.Path.Combine(filePath, "Images"));
if (icon == true)
{
Directory.Move(System.IO.Path.Combine(tempPath, "icons"), System.IO.Path.Combine(filePath, "icons"));
}
if (sepa == true)
{
File.Move(System.IO.Path.Combine(tempPath, "IncDoc.adoc"), System.IO.Path.Combine(filePath, "IncDoc.adoc"));
Directory.Move(System.IO.Path.Combine(tempPath, "Sub_First"), System.IO.Path.Combine(filePath, "Sub_First"));
Directory.Move(System.IO.Path.Combine(tempPath, "Sub_Second"), System.IO.Path.Combine(filePath, "Sub_Second"));
}
}
}
}
No preview for this file type
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment