/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt VS Tools. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ using EnvDTE; using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using QtVsTools.VisualStudio; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using System.Windows.Navigation; namespace QtVsTools.Wizards.ClassWizard { using Util; public partial class AddClassPage : WizardPage { public AddClassPage() { InitializeComponent(); DataContext = this; Classes = new List { new Class { ClassName = @"Qt Class", DefaultName = @"QtClass", Type = @"Visual C++", Description = @"Creates a C++ header and source file for a new class that you " + @"can add to a Qt Project.", ImageSource = @"/QtVsTools.Wizards;component/Resources/Qt-logo-small.png", Kind = ClassKind.Core }, new Class { ClassName = @"Qt Widgets Class", DefaultName = @"QtWidgetsClass", Type = @"Visual C++", Description = @"Creates a new empty Qt Designer form along with a matching " + @"C++ header and source file for implementation purposes. You can add " + @"the form and class to an existing Qt Project.", ImageSource = @"/QtVsTools.Wizards;component/Resources/Qt-logo-small.png", Kind = ClassKind.Gui } }; ClassView.SelectedIndex = 0; ClassView.ItemTemplate = ClassView.FindResource("MediumTemplate") as DataTemplate; VisualCppView.Focus(); } public Class Class { get; private set; } public string Location { get; set; } public List Classes { get; private set; } private void OnExpanded(object sender, RoutedEventArgs e) { if (ClassView == null) return; ClassView.ItemsSource = Classes; ClassView.ItemTemplate = ClassView.FindResource(MediumIcons.IsChecked .GetValueOrDefault() ? "MediumTemplate" : "SmallTemplate") as DataTemplate; ClassView.ItemContainerStyle = FindResource("ListViewItemEnabledStyle") as Style; ClassView.SelectedIndex = 0; AddButton.IsEnabled = true; BrowseButton.IsEnabled = true; LocationComboBox.IsEnabled = true; DefaultNameTextBox.IsEnabled = true; } private void OnCollapsed(object sender, RoutedEventArgs e) { if (ClassView == null) return; ClassView.ItemsSource = new List { new Class() }; ClassView.SelectedIndex = 0; ClassView.ItemTemplate = ClassView.FindResource("EmptyTemplate") as DataTemplate; ClassView.ItemContainerStyle = FindResource("ListViewItemDisabledStyle") as Style; ClassView.SelectedIndex = -1; AddButton.IsEnabled = false; BrowseButton.IsEnabled = false; LocationComboBox.IsEnabled = false; DefaultNameTextBox.IsEnabled = false; } private void OnComboBoxLoaded(object sender, RoutedEventArgs e) { var comboBox = sender as ComboBox; if (comboBox == null) return; comboBox.ItemsSource = new List { new SortComboBoxItem { Content = "Default", SortDirection = null }, new SortComboBoxItem { Content = "Name Ascending", SortDirection = ListSortDirection.Ascending }, new SortComboBoxItem { Content = "Name Descending", SortDirection = ListSortDirection.Descending } }; comboBox.SelectedIndex = 0; } private void OnBrowseButtonClick(object sender, RoutedEventArgs e) { var block = System.IntPtr.Zero; try { var dte = VsServiceProvider.GetService(); var serviceProvider = new ServiceProvider(dte as IServiceProvider); var iVsUIShell = VsServiceProvider.GetService(); System.IntPtr owner; iVsUIShell.GetDialogOwnerHwnd(out owner); var browseInfo = new VSBROWSEINFOW[1]; browseInfo[0].lStructSize = (uint)Marshal.SizeOf(typeof(VSBROWSEINFOW)); browseInfo[0].pwzInitialDir = Location; browseInfo[0].pwzDlgTitle = @"Location"; browseInfo[0].hwndOwner = owner; browseInfo[0].nMaxDirName = 260; block = Marshal.AllocCoTaskMem(520); browseInfo[0].pwzDirName = block; var result = iVsUIShell.GetDirectoryViaBrowseDlg(browseInfo); if (result == Microsoft.VisualStudio.VSConstants.S_OK) { Location = Marshal.PtrToStringAuto(browseInfo[0].pwzDirName); LocationComboBox.Text = Marshal.PtrToStringAuto(browseInfo[0].pwzDirName); } } finally { if (block != System.IntPtr.Zero) Marshal.FreeCoTaskMem(block); } } private void OnComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { var comboBox = sender as ComboBox; if (comboBox == null) return; var item = comboBox.SelectedItem as SortComboBoxItem; if (item == null || ClassView == null) return; var view = CollectionViewSource.GetDefaultView(ClassView.ItemsSource) as CollectionView; view.SortDescriptions.Clear(); if (item.SortDirection == null) return; view.SortDescriptions.Add(new SortDescription(@"ClassName", item.SortDirection .GetValueOrDefault())); } private void OnSmallIconsChecked(object sender, RoutedEventArgs e) { MediumIcons.IsChecked = false; if (ClassView != null) ClassView.ItemTemplate = ClassView.FindResource("SmallTemplate") as DataTemplate; } private void OnMediumIconsChecked(object sender, RoutedEventArgs e) { SmallIcons.IsChecked = false; if (ClassView != null) ClassView.ItemTemplate = ClassView.FindResource("MediumTemplate") as DataTemplate; } private void OnListViewSelectionChanged(object sender, SelectionChangedEventArgs e) { var listView = sender as ListView; if (listView == null) return; var item = listView.SelectedItem as Class; if (item == null) return; Class = item; Type.Text = item.Type; Description.Text = item.Description; DefaultNameTextBox.Text = item.DefaultName; } private void OnDefaultNameTextChanged(object sender, TextChangedEventArgs e) { var item = ClassView.SelectedItem as Class; if (item == null) return; item.DefaultName = DefaultNameTextBox.Text; } private void OnListViewItemMouseDoubleClick(object sender, MouseButtonEventArgs e) { if (e.LeftButton != MouseButtonState.Pressed) return; var item = (sender as ListViewItem).DataContext as Class; if (item == null) return; item.DefaultName = DefaultNameTextBox.Text; OnReturnEx(new ReturnEventArgs(WizardResult.Finished)); } } }