138 lines
4.3 KiB
C#
Raw Normal View History

/* ****************************************************************************
*
* Copyright (c) Microsoft Corporation.
*
* This source code is subject to terms and conditions of the Apache License, Version 2.0. A
* copy of the license can be found in the License.html file at the root of this distribution. If
* you cannot locate the Apache License, Version 2.0, please send an email to
* vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
* by the terms of the Apache License, Version 2.0.
*
* You must not remove this notice, or any other, from this software.
*
* ***************************************************************************/
using System;
using System.Collections;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.OLE.Interop;
namespace Microsoft.VisualStudio.Project {
/// <summary>
/// Base class for property pages based on a WinForm control.
/// </summary>
[ComVisible(true)]
public abstract class PropertyPage : IPropertyPage {
private IPropertyPageSite _site;
private bool _dirty, _loading;
public abstract Control Control {
get;
}
public abstract void Apply();
public abstract string Name
{
get;
}
public bool Loading {
get {
return _loading;
}
set {
_loading = value;
}
}
public bool IsDirty {
get {
return _dirty;
}
set {
if (_dirty != value && !Loading) {
_dirty = value;
if (_site != null) {
_site.OnStatusChange((uint)(_dirty ? PropPageStatus.Dirty : PropPageStatus.Clean));
}
}
}
}
void IPropertyPage.Activate(IntPtr hWndParent, RECT[] pRect, int bModal) {
NativeMethods.SetParent(Control.Handle, hWndParent);
}
int IPropertyPage.Apply() {
try {
Apply();
return VSConstants.S_OK;
} catch (Exception e) {
return Marshal.GetHRForException(e);
}
}
void IPropertyPage.Deactivate() {
Control.Dispose();
}
void IPropertyPage.GetPageInfo(PROPPAGEINFO[] pPageInfo) {
VsUtilities.ArgumentNotNull("pPageInfo", pPageInfo);
PROPPAGEINFO info = new PROPPAGEINFO();
info.cb = (uint)Marshal.SizeOf(typeof(PROPPAGEINFO));
info.dwHelpContext = 0;
info.pszDocString = null;
info.pszHelpFile = null;
info.pszTitle = Name;
info.SIZE.cx = Control.Width;
info.SIZE.cy = Control.Height;
pPageInfo[0] = info;
}
void IPropertyPage.Help(string pszHelpDir) {
}
int IPropertyPage.IsPageDirty() {
return (IsDirty ? (int)VSConstants.S_OK : (int)VSConstants.S_FALSE);
}
void IPropertyPage.Move(RECT[] pRect) {
VsUtilities.ArgumentNotNull("pRect", pRect);
RECT r = pRect[0];
Control.Location = new Point(r.left, r.top);
Control.Size = new Size(r.right - r.left, r.bottom - r.top);
}
public abstract void SetObjects(uint count, object[] punk);
void IPropertyPage.SetPageSite(IPropertyPageSite pPageSite) {
_site = pPageSite;
}
void IPropertyPage.Show(uint nCmdShow) {
Control.Visible = true; // TODO: pass SW_SHOW* flags through
Control.Show();
}
int IPropertyPage.TranslateAccelerator(MSG[] pMsg) {
VsUtilities.ArgumentNotNull("pMsg", pMsg);
MSG msg = pMsg[0];
if ((msg.message < NativeMethods.WM_KEYFIRST || msg.message > NativeMethods.WM_KEYLAST) && (msg.message < NativeMethods.WM_MOUSEFIRST || msg.message > NativeMethods.WM_MOUSELAST)) {
return VSConstants.S_FALSE;
}
return (NativeMethods.IsDialogMessageA(Control.Handle, ref msg)) ? VSConstants.S_OK : VSConstants.S_FALSE;
}
}
}