
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5917 212acab6-be3b-0410-9dea-997c60f758d6
164 lines
3.2 KiB
C
164 lines
3.2 KiB
C
/*
|
|
* components.c
|
|
*
|
|
* This file is a part of NSIS.
|
|
*
|
|
* Copyright (C) 1999-2009 Nullsoft and Contributors
|
|
*
|
|
* Licensed under the zlib/libpng license (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
*
|
|
* Licence details can be found in the file COPYING.
|
|
*
|
|
* This software is provided 'as-is', without any express or implied
|
|
* warranty.
|
|
*/
|
|
|
|
#include "../Platform.h"
|
|
#include "config.h"
|
|
#include "ui.h"
|
|
#include "fileform.h"
|
|
|
|
void NSISCALL SectionFlagsChanged(unsigned int index) {
|
|
section *sections = g_sections;
|
|
|
|
int flags = sections[index].flags;
|
|
|
|
if (flags & SF_SECGRP) {
|
|
unsigned int i = index + 1;
|
|
unsigned int level = 0;
|
|
|
|
for (; i < (unsigned int) num_sections; i++) {
|
|
if (sections[i].flags & SF_SECGRP) {
|
|
level++;
|
|
continue;
|
|
}
|
|
|
|
if (sections[i].flags & SF_SECGRPEND) {
|
|
if (level-- == 0) {
|
|
break;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if ((sections[i].flags & SF_RO) == 0) {
|
|
sections[i].flags &= ~SF_SELECTED;
|
|
sections[i].flags |= (flags & SF_SELECTED);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
unsigned int NSISCALL _RefreshSectionGroups(unsigned int i, int not_first_call) {
|
|
unsigned int selected = 0;
|
|
unsigned int not_selected = 0;
|
|
|
|
section *sections = g_sections;
|
|
|
|
section *sec = §ions[i];
|
|
|
|
if (sec->flags & SF_SECGRP) {
|
|
if (not_first_call) {
|
|
sec->flags &= ~(SF_SELECTED | SF_PSELECTED);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
while (i < (unsigned int) num_sections) {
|
|
int flags = sections[i].flags;
|
|
int ni = i + 1;
|
|
|
|
if (flags & SF_SECGRP) {
|
|
ni = _RefreshSectionGroups(i, 1);
|
|
flags = sections[i].flags;
|
|
}
|
|
|
|
if (flags & SF_SECGRPEND) {
|
|
if (selected) {
|
|
if (not_selected) {
|
|
sec->flags |= SF_PSELECTED;
|
|
} else {
|
|
sec->flags |= SF_SELECTED;
|
|
sec->flags &= ~SF_TOGGLED;
|
|
}
|
|
}
|
|
|
|
return ni;
|
|
}
|
|
|
|
if (flags & SF_PSELECTED) {
|
|
selected++;
|
|
}
|
|
|
|
if (flags & SF_SELECTED) {
|
|
selected++;
|
|
} else {
|
|
not_selected++;
|
|
}
|
|
|
|
i = ni;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef NSIS_CONFIG_COMPONENTPAGE
|
|
|
|
void NSISCALL SetInstType(int inst_type) {
|
|
unsigned int i = 0;
|
|
|
|
section *sections = g_sections;
|
|
|
|
if ((unsigned int) inst_type >= NSIS_MAX_INST_TYPES) {
|
|
return;
|
|
}
|
|
|
|
for (; i < (unsigned int) num_sections; i++) {
|
|
if (sections[i].flags & (SF_SECGRP | SF_SECGRPEND)) {
|
|
continue;
|
|
}
|
|
|
|
if (sections[i].install_types & (1 << inst_type)) {
|
|
sections[i].flags |= SF_SELECTED;
|
|
} else {
|
|
sections[i].flags &= ~SF_SELECTED;
|
|
}
|
|
}
|
|
}
|
|
|
|
unsigned int NSISCALL GetInstType(HTREEITEM *items) {
|
|
unsigned int i, j;
|
|
|
|
section *sections = g_sections;
|
|
|
|
for (i = 0; i < NSIS_MAX_INST_TYPES; i++) {
|
|
if (!g_header->install_types[i]) {
|
|
continue;
|
|
}
|
|
|
|
for (j = 0; j < (unsigned int) num_sections; j++) {
|
|
if (sections[j].flags & (SF_SECGRP | SF_SECGRPEND)) {
|
|
continue;
|
|
}
|
|
|
|
if (items && !items[j]) {
|
|
continue;
|
|
}
|
|
|
|
if ((sections[j].install_types & (1 << i)) == ((sections[j].flags & SF_SELECTED) << i)) {
|
|
continue;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (j == (unsigned int) num_sections) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
#endif//NSIS_CONFIG_COMPONENTPAGE
|