<tagezi>
мне нужно условие сделать для выхода, у меня их 2, это наличие следующего уровня, и достижение необходимого уровня
<tagezi>
но у меня в функции нет математики
<tagezi>
как определить что достигло нужного уровня?
<tagezi>
а
<mikekaganski>
Мы же про SvxHlinkDlgMarkWnd::FillTree?
<tagezi>
я слепой по ходу
<tagezi>
да
<tagezi>
там есть чистенная математика, сейчас попробую
<mikekaganski>
разобрался?
<tagezi>
да я даже как-то не подумал что в nEntries += FillTree( xLTS->getLinks(), pEntry ); nEntries - это число
<mikekaganski>
хм
<mikekaganski>
я думал про другое
<mikekaganski>
не пойму что-то, но попробуй
<tagezi>
не, так оно не работает
<mikekaganski>
int FillTree( int nCurrentLevel, const css::uno::Reference< css::container::XNameAccess >& xLinks, SvTreeListEntry* pParentEntry =nullptr );
<mikekaganski>
насколько я понимаю, эта функция вызывается в двух местах: в RefreshFromDoc, и сама себя
<tagezi>
да, в начале nEntries = 0
<tagezi>
а дальше он соответствует номеру заголовка в уровне
<mikekaganski>
Вот и пусть она из RefreshFromDoc вызывается с уровнем MAXLEVEL, а сама себя вызывает с уровнем nCurrentLevel-1
<tagezi>
как я понимаю
<mikekaganski>
и когда nCurrentLevel = 0, дальше сама себя не вызывает
<tagezi>
сламал :)
<mikekaganski>
урра! наконец-то хоть кто-то ... :)))
<tagezi>
да вроде логику не поменял
<tagezi>
всё то же самое, только с вызовом
<mikekaganski>
но большая часть замечаний пока не учтена? только рекурсию поправил и вызов без строки с пробелом?
<tagezi>
в hxx не сделал
<tagezi>
mikekaganski: почему класс меню не нужен?
<mikekaganski>
а он разве где-то у тебя использован?
<mikekaganski>
я поискал и не нашёл
<tagezi>
а попап?
<mikekaganski>
tagezi: kexit lfq ccskre
<mikekaganski>
лучше дай ссылку
<tagezi>
проще попробовать убрать
<tagezi>
mikekaganski: зачем нужен метод ГетЛевел?
<mikekaganski>
Не нужен, я уже понял :)
<mikekaganski>
это были размышления по ходу, я тогда ещё не подумал, что всю логику по проверке того, не равен ли уровень уже принятому, можно убрать в окно
<tagezi>
почему константу нужно убирать из заголовка?
<tagezi>
вероятность что она изменьтся, ну очень мала
<mikekaganski>
зачем имя, которое не используется нигде, кроме этого файла, нужно вне этого файла? Инкапсуляция
<tagezi>
описания отдельно, выполнение отдельно
<mikekaganski>
нет
<tagezi>
эм
<tagezi>
всегда думал, что ашки нужны для описания
<mikekaganski>
заголовок нужен у нас не для разделения описания и реализации, а для совместного использования в разных единицах компиляции. В других проектах может быть иначе
<tagezi>
почему m_nOutlineLevel не нужна?
<mikekaganski>
а зачем она в дереве? достаточно в окне
<mikekaganski>
почему? mpParentWnd->SetOutlineLevel сам проверит, не поменялась ли *его* m_nOutlineLevel
<tagezi>
ну, да, наверное ты прав, так будет меньше кода
<tagezi>
объясни мне по поводу override
<tagezi>
насколько я понимаю, это нужно чтобы потомок мог менять эту функцию, нет?
<tagezi>
для обращения этого не нужно
<tagezi>
то есть, если я думаю, что ктото когда-то решит её перегрузить в потомке, то лучше поставить override, но для безопасности, лучше этого не делать
<tagezi>
я с тобой скоро научусь программировать, такими темпами :)
<tagezi>
да, меню не нужно.. эм
<tagezi>
блин, никак не могу привыкнуть с тем что заголовки включаются из предыдущего лвла
<mikekaganski>
override говорит о том, что ты здесь переопределяешь виртуальную функцию предка. Если у предка нет такой функции, либо она не виртуальна, здесь возникнет ошибка - то есть ты делаешь проверку на правильность переопределения
<tagezi>
mikekaganski: я люблю плюсики, но это они не решают главную проблему :)
<mikekaganski>
какую?
<tagezi>
почему пересталоо проверять уровень
<mikekaganski>
прошу прощения?
<tagezi>
ну, до этого, оно останавливалось на определённом, выбраном уровне, а теперь нет
<mikekaganski>
так, поподробнее, с картинками. Я пока не могу собрать и проверить
<tagezi>
ну, первое.. перестало выставлять выбранный уровень в списке попап
<tagezi>
авротое, перестало ограничивать уровень заголовков в дереве
<mikekaganski>
так, ясно. Для первого всё же нужно getOutlineLevel() у окна, и использовать его в pSubPop1->CheckItem( mpParentWnd->getOutlineLevel() );
<mikekaganski>
причём это getOutlineLevel() можно определить прямо в заголовке (это тривиальная функция)
<tagezi>
эм.. почему для этого была плоха переменная? :)
<mikekaganski>
потому что это (а) дублирование информации в двух местах (с предусловием всегдашнего соответствия), (б) использование лишней памяти без какого-либо выигрыша
<kompi>
дайте Майку 10 рук и полновластие в Либре и он перевернет Либру
<mikekaganski>
слушай, а про "перестало ограничивать..." - не пойму, вроде должно работать
<tagezi>
ну, вот да, логика-то не поменялась
<kompi>
mikekaganski: Экспорт полей MailMerge в форматы DOCX и DOC tdf#67207 (Mike Kaganski, Collabora) помоги по русски это написать
<mikekaganski>
не могу, лучше, чем ты это здесь написал, я не могу
<kompi>
майл мерге - это же рассылка?
<kompi>
или в данном случае это просто тип поля?
jrj has quit [Quit: Leaving]
<tagezi>
nCurrentLevel всегда больше нуля
<mikekaganski>
Это тип поля, относящийся к рассылке
<tagezi>
оно вообще меняется в приделах 1 только
<mikekaganski>
не понял
<tagezi>
если уровень установлен как 10, то принимаемые значения только 10, 9, 8
<tagezi>
если 5, то 5,4
<mikekaganski>
надо просто проанализировать
<mikekaganski>
расскажи мне, когда у тебя пользователь выбрал пункт 1, уровень равен 1, и нужно показать только единственный верхний уровень, так?
<tagezi>
да, нужно понять как вернуть текущий уровень, а не считать его
<mikekaganski>
а когда пользователь выбрал 10, mnCurrentLevel равен 10?
<mikekaganski>
вернуть куда? где это чисо необходимо?
<tagezi>
в регрессии
<tagezi>
ой
<mikekaganski>
можно ведь наоборот - от 0 до mnCurrentLevel - просто проанализируй, как там по логике
<kompi>
mikekaganski: то, что tooltip остается на экране, когда я переключил окно с Либры на любое иное - это бага?
<mikekaganski>
Не совсем... ЛО ещё и менюшки оставляет :)
<kompi>
менюшки ты правил же?
<mikekaganski>
но хотелось бы изменить
<mikekaganski>
нет
<mikekaganski>
правил Каолан, я просто участвовал в багрепорте
<mikekaganski>
и поправлено было не это
<tagezi>
эм... если выбрать уровень 1, то значения 1 и 0, но собирается всё
<tagezi>
и кроме того, в этом примере нет заголовков первого уровня
<mikekaganski>
освежи мне память, в каком патче работало как надо?
<tagezi>
в 5
<tagezi>
оно по крайне мере убиралось
<tagezi>
но, вот я сомневаюсь что правильно
<mikekaganski>
блин, надо мне попробовать у себя
<tagezi>
так, там нужны не просто вхождения в функцию, а смотреть какой уровень
<mikekaganski>
Ну не должно быть так!
<tagezi>
я так понимаю, чтоо при этой рекурсии вообще пофигу какой следующий уровень
<mikekaganski>
там же каждый раз функция не просто вызывается, в неё передаётся последним параметром "родительский" уровень
<tagezi>
но в моем примере всего 2 уровня, второй и 8
<mikekaganski>
хм.......
<tagezi>
вру
<mikekaganski>
вот те на
<tagezi>
6, 9 и 10
<mikekaganski>
ну, тогда смотри глубще, и используй аргумент nCurrentLevel как указатель на текущий уровень
<kompi>
а что вы курочаете?
<tagezi>
ну вот и я про тоже, нужно понять как получить текущий уровень, тогда будет всеравно сколько их
<kompi>
tagezi: думать абстрактно проще, чем думать о ГУИ
<tagezi>
думать абстрактно, не так уж и проще
<tagezi>
если его выражение записать на языке теории множеств, то получится строгая система, надкоторой будет понятно как делать любые операции
<tagezi>
но ты вообще нихрена не поймешь
<kompi>
=(
<tagezi>
потому что проще думать конкретно: есть банан, есть обезьяна держащая банан, есть хочется, значит нужно взять дубину и дать обезьяне по голове
<tagezi>
забрать банан и поесть
<JohnDoe_71Rus>
пока искал дубину, обезьяна с бананом убежала
<tagezi>
бегающая обезьяна с бананом - это миф :)
<kompi>
tagezi: я и думал в тот раз конкретно и для себя, как для юзера я проблему понял
<tagezi>
существует 2 способа решить как не получить в лоб граблями, на которые наступаешь: убрать грабли; найти обход этого места
<tagezi>
второе, в программировании СПО проще сделать :)
<tagezi>
если ещё и не своими руками, так вообще замечательно :)
<tagezi>
я вон, уже неделю парюсь с этим меню.. просто менб блин
<JohnDoe_71Rus>
и меню... и себю...
<tagezi>
mikekaganski: вот смотри, pEntry имеет метод GetPos
<tagezi>
это не то что нужно?
<mikekaganski>
да.... придётся тебе немного поправить вот это: SwXLinkNameAccessWrapper::getByName
<mikekaganski>
и там вызывать вот это: SwTextNode->GetActualListLevel()
<mikekaganski>
и дополнить вот это: SwXOutlineTarget
<tagezi>
нихрена себе
<tagezi>
и понять как включить патьм это всё в куи
<tagezi>
вообще не представляю что с этим сделать нужно
<tagezi>
mikekaganski: а как ты к этому пришёл?
<tagezi>
я вообще не уверен что это таже самая Link, что и в дереве
<tagezi>
и не понятно, причем тут вообще sw :) я к нему не обращаюсь ни разу :)
kompi has quit [Quit: Page closed]
<mikekaganski>
погоди, я за дочей, пока не могу объяснять
<mikekaganski>
SvxHlinkDlgMarkWnd::RefreshFromDoc получает документ, потом получает из него интерфейс XLinkTargetSupplier, и из него - объект XNameAccess с помощью getLinks(). Для документа Writer всё это выливается в вызов SwXLinkNameAccessWrapper::getLinks()
<mikekaganski>
То есть дальше, в FillTree, на первом круге, мы будем обращаться к этому объекту - SwXLinkNameAccessWrapper - за списком имён элементов
<mikekaganski>
блин, поторопился
<mikekaganski>
на самом деле на первом круге мы будем обращаться к результату SwXTextDocument::getLinks
<mikekaganski>
то есть к объекту SwXLinkTargetSupplier
<mikekaganski>
SwXLinkTargetSupplier::getElementNames возвращает список из 7 элементов
<mikekaganski>
затем в SwXLinkTargetSupplier::getByName, когда имя соответсвует заголовкам (sOutlines, STR_CONTENT_TYPE_OUTLINE), уже возвращается объект SwXLinkNameAccessWrapper
<mikekaganski>
с суффиксом "|outline"
<mikekaganski>
Затем в SwXLinkNameAccessWrapper::getElementNames перебираются все параграфы таблицы соотвествующих объектов документа, создаются их имена с помощью нумератора, и выводятся в списке
<mikekaganski>
В SwXLinkNameAccessWrapper::getByName с помощью такого же перебора проверяется, что такое имя существует, и если да, то возвращается объект SwXOutlineTarget, который имеет всего один параметр - ту самую строку.
<mikekaganski>
То есть он ничего не знает ни о своём уровне, ни о параграфе, к которому относится, ни о документе - ни о чём
<mikekaganski>
В SwXOutlineTarget::getPropertyValue можно увидеть, что этот объект знает всего лишь об одном - о своём имени, которое и может возвратить
<tagezi>
зачемискать имя объекта по имени объекта? :)
<mikekaganski>
Ну, это для общности
<mikekaganski>
Моя первая мысль была сохранять в этот объект ещё что-то, например, ссылку на параграф, к которому это относится. Или хотя бы уровень
<mikekaganski>
Но пока я тут гулял, я подумал, что в конце концов, щёлкнув по элементу списка, в диалоге как-то находится же тот элемент, на который мы создаём ссылку
<tagezi>
почему не создается один полноценныйобъект (ну или ссылка на него) и не получается доступ к любому его параметру
<tagezi>
а вдруг я хочу его изменить, вот прямо тут
* tagezi
не знает зачем пока :)
<mikekaganski>
значит, нужно посмотреть, как это происходит, и повторить, чтобы не городить изменений, пока ты не унифицировал всё
<tagezi>
ну, найти элемент можно по имени
<tagezi>
тут больше не нужно ничего
<tagezi>
и скорее всего имя и название - это разные вещи... имя уникально, а отображаемое название могут быть одинаковы
<tagezi>
саму идею я вроде понимаю, попытаюсь сделать
<mikekaganski>
Навигатор Writer наполняется в SwContentType::FillMemberList