⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hide.cpp

📁 XOSL 多操作系统管理工具 源代码 多系统引导工具
💻 CPP
字号:
/*
 * Extended Operating System Loader (XOSL)
 * Copyright (c) 1999 by Geurt Vos
 *
 * This code is distributed under GNU General Public License (GPL)
 *
 * The full text of the license can be found in the GPL.TXT file,
 * or at http://www.gnu.org
 */

#include <hide.h>
#include <graph.h>

#include <fat16.h>
#include <fat32.h>
#include <mem.h>
#include <disk.h>
#include <string.h>

extern void printf(const char *,...);

CHidingDialog::CHidingDialog(CScreen &ScreenToUse, CPartList &PartListToUse, CBootItems &BootItemsToUse):
	Screen(ScreenToUse), PartList(PartListToUse), BootItems(BootItemsToUse)
{
	Initialized = false;
}
	
CHidingDialog::~CHidingDialog()
{
}


void CHidingDialog::ShowModal(CForm *Owner, int ItemIndex)
{
	if (!Initialized) {
		CreateControls();
		InitializeControls();
		InstallControls();

		PartList.ReadVolumeLabels();
		InitPartListBox();
		Initialized = true;
	}
	this->Owner = Owner;
	if (Owner) {
		Owner->Disable();
	}

	BootItemIndex = ItemIndex;
	
	UpdateLocalHideList();

	SetCaption();
	UpdateBootItemList();
	UpdateHidingList();
	if (PartListBox->GetItemIndex() != 1)
		PartListBox->SetItemIndex(1);
	else
		SelectPartition(*this,1);

	PositionDialog();
	Form->Show();
	Form->FocusControl(ApplyBtn);
}

void CHidingDialog::CreateControls()
{
	Form = new CForm("",FORM_NORMAL,true,0,0,633,298,false);

	ApplyBtn = new CButton("Apply",448,240,75,25,true,this);
	CancelBtn = new CButton("Cancel",536,240,75,25,true,this);
	PartListBox = new CListBox(4,true,8,8,422,185,true,this);
	PartScrollBar = new CScrollBar(0,0,0,false,411,9,183,true,PartListBox);
	HideCheckBox = new CCheckBox("Hide",false,12,200,true,this);
	HideAllBtn = new CButton("Hide all",12,232,81,25,true,this);
	HideNoneBtn = new CButton("Hide none",100,232,81,25,true,this);
	ItemsListBox = new CListBox(1,false,440,8,177,225,true,this);
	ItemsScrollBar = new CScrollBar(0,0,0,false,598,9,223,true,ItemsListBox);
	CopyFromBtn = new CButton("Copy from",350,200,81,25,true,this);
}

void CHidingDialog::InitializeControls()
{
	ApplyBtn->OnClick((TWndOnClick)ApplyBtnClick);
	CancelBtn->OnClick((TWndOnClick)CancelBtnClick);
	PartListBox->OnSelect((TListBoxSelect)SelectPartition);
	HideCheckBox->OnChange((TCheckBoxChange)HideCheckBoxChange);
	HideAllBtn->OnClick((TWndOnClick)HideAllBtnClick);
	HideNoneBtn->OnClick((TWndOnClick)HideNoneBtnClick);
	CopyFromBtn->OnClick((TWndOnClick)CopyFromBtnClick);

	ItemsListBox->OnDoubleClick((TListBoxSelect)SelectBootItem);

	PartListBox->SetColumn(0,147,"Volume label");
	PartListBox->SetColumn(1,50,"Disk");
	PartListBox->SetColumn(2,135,"System");
	PartListBox->SetColumn(3,70,"Size (MB)");
	PartListBox->SetScrollBar(PartScrollBar);

	ItemsListBox->SetColumn(0,157,"");
	ItemsListBox->SetScrollBar(ItemsScrollBar);

}

void CHidingDialog::InstallControls()
{
	Form->AddControl(ApplyBtn);
	Form->AddControl(CancelBtn);
	Form->AddControl(PartListBox);
	Form->AddControl(PartScrollBar);
	Form->AddControl(HideCheckBox);
	Form->AddControl(HideAllBtn);
	Form->AddControl(HideNoneBtn);
	Form->AddControl(ItemsListBox);
	Form->AddControl(ItemsScrollBar);
	Form->AddControl(CopyFromBtn);
	Screen.AddWindow(Form);
}


void CHidingDialog::InitPartListBox()
{
	int Count;
	const TPartition *Partition;
	int Row;

	Count = PartList.GetCount();
	for (Row = 0; Row < Count; ++Row) {
		PartListBox->AddRow();

		Partition = PartList.GetPartition(Row);

		AddVolume(Row,Partition->VolumeLabel);
		AddDisk(Row,Partition->Drive);
		AddSystem(Row,Partition->FSName);
		AddSize(Row,Partition->SectorCount);

	}
}

void CHidingDialog::AddVolume(int Row, const char *VolumeLabel)
{
	PartListBox->AddItem(Row,0,VolumeLabel);
}

void CHidingDialog::AddDisk(int Row, int Drive)
{
	CString Msg;

	if (Drive & 0x80)
		Msg = "HD";
	else
		Msg = "FD";
	Msg += (long)(Drive & 0x007f);
	PartListBox->AddItem(Row,1,Msg);
}

void CHidingDialog::AddSystem(int Row, const char *FSName)
{
	PartListBox->AddItem(Row,2,FSName);
}

void CHidingDialog::AddSize(int Row, long Sectors)
{
	CString Msg;

	Msg = Sectors >> 11;
	PartListBox->AddItem(Row,3,Msg);
}

void CHidingDialog::PositionDialog()
{
	int Left, Top;
	int ScreenWidth, ScreenHeight;
	int OwnerWidth, OwnerHeight;
	int FormWidth, FormHeight;

	Form->GetMetrics(FormWidth,FormHeight);
	if (!Owner) {
		Graph->GetModeMetrics(ScreenWidth,ScreenHeight);
		Left = (ScreenWidth - FormWidth) / 2;
		Top = (ScreenHeight - FormHeight) / 2 - 32;
	}
	else {
		Owner->GetMetrics(OwnerWidth,OwnerHeight);
		Owner->GetPosition(Left,Top);
		Left += (OwnerWidth - FormWidth) / 2;
		Top += 10;
	}
	Form->SetPosition(Left,Top);
}

void CHidingDialog::CloseDialog()
{
	if (Owner) {
		Owner->Enable();
		Screen.SetFocusWnd(Owner);
	}
	Form->Hide();
}


void CHidingDialog::ApplyBtnClick(CHidingDialog &HidingDialog)
{
	HidingDialog.UpdateBootItemHideList();
	HidingDialog.CloseDialog();
}

void CHidingDialog::CancelBtnClick(CHidingDialog &HidingDialog)
{
	HidingDialog.CloseDialog();
}

void CHidingDialog::SetCaption()
{
	char Caption[84];

	strcpy(Caption,"Hiding partitions - ");
	strcat(Caption,BootItems.Get(BootItemIndex)->ItemName);
	Form->SetCaption(Caption);
}

void CHidingDialog::UpdateBootItemList()
{
	int Index, Count;

	Count = BootItems.GetCount();
	for (Index = ItemsListBox->GetCount(); Index < Count; ++Index) {
		ItemsListBox->AddRow();
	}

	for (Index = 0; Index < Count; ++Index) {
		ItemsListBox->AddItem(Index,0,BootItems.Get(Index)->ItemName);
	}
	ItemsListBox->SetDefault(BootItemIndex);
	ItemsListBox->SetItemIndex(BootItemIndex);
}

void CHidingDialog::UpdateHidingList()
{
	int Index, Count;

	Count = PartList.GetCount();
	for (Index = 0; Index < Count; ++Index) {
		PartListBox->SetRowStyle(Index,LocalHideList[BootItemIndex][Index] ? 19 : 17,STYLE_REGULAR);
	}

}

void CHidingDialog::SelectPartition(CHidingDialog &HidingDialog, int ItemIndex)
{
	if (!HidingDialog.PartList.CanHide(ItemIndex)) {
		HidingDialog.HideCheckBox->SetChecked(false);
		HidingDialog.HideCheckBox->Disable();
	}
	else {
		HidingDialog.HideCheckBox->Enable();
		HidingDialog.HideCheckBox->SetChecked(HidingDialog.LocalHideList[HidingDialog.BootItemIndex][ItemIndex]);
	}
}

void CHidingDialog::SelectBootItem(CHidingDialog &HidingDialog, int ItemIndex)
{
	HidingDialog.ItemsListBox->SetDefault(ItemIndex);
	HidingDialog.BootItemIndex = ItemIndex;
	HidingDialog.SetCaption();
	HidingDialog.UpdateHidingList();
	SelectPartition(HidingDialog,HidingDialog.PartListBox->GetItemIndex());
}

void CHidingDialog::HideCheckBoxChange(CHidingDialog &HidingDialog, bool Checked)
{
	int Index;

	Index = HidingDialog.PartListBox->GetItemIndex();
	HidingDialog.LocalHideList[HidingDialog.BootItemIndex][Index] = Checked;
	HidingDialog.PartListBox->SetRowStyle(Index,Checked ? 19 : 17,STYLE_REGULAR);
}

void CHidingDialog::HideAllBtnClick(CHidingDialog &HidingDialog)
{
	int Index, Count;
	int PartIndex;

	PartIndex = HidingDialog.BootItems.Get(HidingDialog.BootItemIndex)->PartIndex;
	Count = HidingDialog.PartList.GetCount();
	for (Index = 0; Index < Count; ++Index)
		if (HidingDialog.PartList.CanHide(Index) && Index != PartIndex)
			HidingDialog.LocalHideList[HidingDialog.BootItemIndex][Index] = true;
	HidingDialog.UpdateHidingList();
	SelectPartition(HidingDialog,HidingDialog.PartListBox->GetItemIndex());
}

void CHidingDialog::HideNoneBtnClick(CHidingDialog &HidingDialog)
{
	int Index, Count;

	Count = HidingDialog.PartList.GetCount();
	for (Index = 0; Index < Count; ++Index)
		HidingDialog.LocalHideList[HidingDialog.BootItemIndex][Index] = false;
	HidingDialog.UpdateHidingList();
	SelectPartition(HidingDialog,HidingDialog.PartListBox->GetItemIndex());
}

void CHidingDialog::CopyFromBtnClick(CHidingDialog &HidingDialog)
{
	memcpy(HidingDialog.LocalHideList[HidingDialog.BootItemIndex],HidingDialog.LocalHideList[HidingDialog.ItemsListBox->GetItemIndex()],sizeof (char[56]));
	HidingDialog.UpdateHidingList();
	SelectPartition(HidingDialog,HidingDialog.PartListBox->GetItemIndex());
}

void CHidingDialog::UpdateLocalHideList()
{
	int Index, Count;

	Count = BootItems.GetCount();
	for (Index = 0; Index < Count; ++Index) {
		memcpy(LocalHideList[Index],BootItems.Get(Index)->HideList,sizeof (char[56]));
	}
}

void CHidingDialog::UpdateBootItemHideList()
{
	int Index, Count;

	Count = BootItems.GetCount();
	for (Index = 0; Index < Count; ++Index) {
		memcpy(BootItems.Get(Index)->HideList,LocalHideList[Index],sizeof (char[56]));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -