From cbbc86387bec5ff4d868620734556add2b8f488a Mon Sep 17 00:00:00 2001 From: coolo Date: Mon, 26 Nov 2007 10:05:30 +0000 Subject: [PATCH] restart qt4 porting git-svn-id: http://svn.opensuse.org/svn/yast/branches/tmp/coolo/qt4-port@42379 e0cc52ee-31ee-0310-8b87-e83c4596d67c --- .cvsignore | 23 + MAINTAINER | 1 + Makefile.cvs | 23 + RPMNAME | 1 + SUBDIRS | 1 + VERSION | 1 + acinclude.m4 | 37 + configure.in.in | 27 + doc/.cvsignore | 2 + doc/Makefile.am | 11 + doc/autodocs/.cvsignore | 9 + doc/autodocs/Makefile.am | 23 + doc/richtext.txt | 72 + fonts/.cvsignore | 2 + fonts/Makefile.am | 11 + fonts/fonts.dir | 3 + fonts/newunifont.pcf.gz | Bin 0 -> 1071125 bytes fonts/unifont.pcf.gz | Bin 0 -> 814081 bytes package/.cvsignore | 3 + package/yast2-qt.changes | 2612 ++++++++++++++++++++ src/.cvsignore | 11 + src/Makefile.am | 279 +++ src/QY2CharValidator.cc | 65 + src/QY2CharValidator.h | 73 + src/QY2ComboTabWidget.cc | 146 ++ src/QY2ComboTabWidget.h | 102 + src/QY2DiskUsageList.cc | 418 ++++ src/QY2DiskUsageList.h | 284 +++ src/QY2LayoutUtils.cc | 86 + src/QY2LayoutUtils.h | 54 + src/QY2ListView.cc | 569 +++++ src/QY2ListView.h | 475 ++++ src/QY2Settings.cc | 315 +++ src/QY2Settings.h | 255 ++ src/Y2CCQt.cc | 29 + src/Y2CCQt.h | 71 + src/YFrameBuffer.cc | 164 ++ src/YFrameBuffer.h | 92 + src/YQAlignment.cc | 96 + src/YQAlignment.h | 86 + src/YQApplication.cc | 374 +++ src/YQApplication.h | 178 ++ src/YQBarGraph.cc | 249 ++ src/YQBarGraph.h | 103 + src/YQCheckBox.cc | 163 ++ src/YQCheckBox.h | 130 + src/YQCheckBoxFrame.cc | 204 ++ src/YQCheckBoxFrame.h | 136 + src/YQComboBox.cc | 253 ++ src/YQComboBox.h | 171 ++ src/YQDateField.cc | 111 + src/YQDateField.h | 113 + src/YQDialog.cc | 690 ++++++ src/YQDialog.h | 242 ++ src/YQDownloadProgress.cc | 129 + src/YQDownloadProgress.h | 114 + src/YQDumbTab.cc | 248 ++ src/YQDumbTab.h | 123 + src/YQEBunny.cc | 71 + src/YQEBunny.h | 37 + src/YQEmpty.cc | 43 + src/YQEmpty.h | 50 + src/YQFrame.cc | 101 + src/YQFrame.h | 81 + src/YQGenericButton.cc | 239 ++ src/YQGenericButton.h | 167 ++ src/YQIconPool.cc | 155 ++ src/YQIconPool.h | 116 + src/YQImage.cc | 167 ++ src/YQImage.h | 91 + src/YQInputField.cc | 318 +++ src/YQInputField.h | 205 ++ src/YQIntField.cc | 141 ++ src/YQIntField.h | 141 ++ src/YQLabel.cc | 106 + src/YQLabel.h | 90 + src/YQLayoutBox.cc | 56 + src/YQLayoutBox.h | 68 + src/YQLogView.cc | 130 + src/YQLogView.h | 111 + src/YQMenuButton.cc | 221 ++ src/YQMenuButton.h | 124 + src/YQMultiLineEdit.cc | 199 ++ src/YQMultiLineEdit.h | 139 ++ src/YQMultiProgressMeter.cc | 419 ++++ src/YQMultiProgressMeter.h | 220 ++ src/YQMultiSelectionBox.cc | 358 +++ src/YQMultiSelectionBox.h | 225 ++ src/YQOptionalWidgetFactory.cc | 259 ++ src/YQOptionalWidgetFactory.h | 132 + src/YQPackageSelectorPlugin.cc | 136 + src/YQPackageSelectorPlugin.h | 77 + src/YQPartitionSplitter.cc | 205 ++ src/YQPartitionSplitter.h | 141 ++ src/YQProgressBar.cc | 112 + src/YQProgressBar.h | 101 + src/YQPushButton.cc | 83 + src/YQPushButton.h | 75 + src/YQRadioButton.cc | 175 ++ src/YQRadioButton.h | 130 + src/YQRadioButtonGroup.cc | 120 + src/YQRadioButtonGroup.h | 83 + src/YQReplacePoint.cc | 60 + src/YQReplacePoint.h | 63 + src/YQRichText.cc | 207 ++ src/YQRichText.h | 168 ++ src/YQSelectionBox.cc | 313 +++ src/YQSelectionBox.h | 170 ++ src/YQSignalBlocker.cc | 39 + src/YQSignalBlocker.h | 57 + src/YQSlider.cc | 184 ++ src/YQSlider.h | 149 ++ src/YQSpacing.cc | 47 + src/YQSpacing.h | 50 + src/YQSquash.cc | 53 + src/YQSquash.h | 61 + src/YQTable.cc | 326 +++ src/YQTable.h | 198 ++ src/YQTimeField.cc | 109 + src/YQTimeField.h | 112 + src/YQTree.cc | 337 +++ src/YQTree.h | 233 ++ src/YQUI.h | 674 +++++ src/YQUIComponent.h | 52 + src/YQUI_builtins.cc | 476 ++++ src/YQUI_core.cc | 650 +++++ src/YQUI_widgets.cc | 49 + src/YQUI_x11.cc | 335 +++ src/YQWidgetCaption.cc | 90 + src/YQWidgetCaption.h | 73 + src/YQWidgetFactory.cc | 399 +++ src/YQWidgetFactory.h | 155 ++ src/YQWizard.cc | 2053 +++++++++++++++ src/YQWizard.h | 720 ++++++ src/YQWizardButton.cc | 118 + src/YQWizardButton.h | 116 + src/YQi18n.h | 38 + src/lang_fonts | 36 + src/pkg/Makefile.am | 190 ++ src/pkg/YQPackageSelector.cc | 1459 +++++++++++ src/pkg/YQPackageSelector.h | 335 +++ src/pkg/YQPackageSelectorBase.cc | 434 ++++ src/pkg/YQPackageSelectorBase.h | 204 ++ src/pkg/YQPackageSelectorHelp.cc | 374 +++ src/pkg/YQPatternSelector.cc | 361 +++ src/pkg/YQPatternSelector.h | 94 + src/pkg/YQPkgChangeLogView.cc | 98 + src/pkg/YQPkgChangeLogView.h | 66 + src/pkg/YQPkgChangesDialog.cc | 246 ++ src/pkg/YQPkgChangesDialog.h | 137 + src/pkg/YQPkgConflictDialog.cc | 413 ++++ src/pkg/YQPkgConflictDialog.h | 161 ++ src/pkg/YQPkgConflictList.cc | 404 +++ src/pkg/YQPkgConflictList.h | 221 ++ src/pkg/YQPkgDependenciesView.cc | 187 ++ src/pkg/YQPkgDependenciesView.h | 113 + src/pkg/YQPkgDescriptionDialog.cc | 175 ++ src/pkg/YQPkgDescriptionDialog.h | 80 + src/pkg/YQPkgDescriptionView.cc | 143 ++ src/pkg/YQPkgDescriptionView.h | 76 + src/pkg/YQPkgDiskUsageList.cc | 384 +++ src/pkg/YQPkgDiskUsageList.h | 268 ++ src/pkg/YQPkgDiskUsageWarningDialog.cc | 157 ++ src/pkg/YQPkgDiskUsageWarningDialog.h | 68 + src/pkg/YQPkgFileListView.cc | 110 + src/pkg/YQPkgFileListView.h | 65 + src/pkg/YQPkgGenericDetailsView.cc | 204 ++ src/pkg/YQPkgGenericDetailsView.h | 139 ++ src/pkg/YQPkgLangList.cc | 214 ++ src/pkg/YQPkgLangList.h | 159 ++ src/pkg/YQPkgList.cc | 802 ++++++ src/pkg/YQPkgList.h | 335 +++ src/pkg/YQPkgObjList.cc | 1565 ++++++++++++ src/pkg/YQPkgObjList.h | 803 ++++++ src/pkg/YQPkgPatchFilterView.cc | 240 ++ src/pkg/YQPkgPatchFilterView.h | 98 + src/pkg/YQPkgPatchList.cc | 659 +++++ src/pkg/YQPkgPatchList.h | 308 +++ src/pkg/YQPkgPatternList.cc | 451 ++++ src/pkg/YQPkgPatternList.h | 308 +++ src/pkg/YQPkgProductDialog.cc | 155 ++ src/pkg/YQPkgProductDialog.h | 76 + src/pkg/YQPkgProductList.cc | 144 ++ src/pkg/YQPkgProductList.h | 139 ++ src/pkg/YQPkgRepoFilterView.cc | 219 ++ src/pkg/YQPkgRepoFilterView.h | 139 ++ src/pkg/YQPkgRepoList.cc | 305 +++ src/pkg/YQPkgRepoList.h | 189 ++ src/pkg/YQPkgRpmGroupTagsFilterView.cc | 273 ++ src/pkg/YQPkgRpmGroupTagsFilterView.h | 209 ++ src/pkg/YQPkgSearchFilterView.cc | 362 +++ src/pkg/YQPkgSearchFilterView.h | 175 ++ src/pkg/YQPkgSelDescriptionView.cc | 178 ++ src/pkg/YQPkgSelDescriptionView.h | 68 + src/pkg/YQPkgSelList.cc | 231 ++ src/pkg/YQPkgSelList.h | 175 ++ src/pkg/YQPkgSelMapper.cc | 102 + src/pkg/YQPkgSelMapper.h | 84 + src/pkg/YQPkgStatusFilterView.cc | 273 ++ src/pkg/YQPkgStatusFilterView.h | 168 ++ src/pkg/YQPkgTechnicalDetailsView.cc | 201 ++ src/pkg/YQPkgTechnicalDetailsView.h | 87 + src/pkg/YQPkgTextDialog.cc | 327 +++ src/pkg/YQPkgTextDialog.h | 181 ++ src/pkg/YQPkgUpdateProblemFilterView.cc | 116 + src/pkg/YQPkgUpdateProblemFilterView.h | 99 + src/pkg/YQPkgVersionsView.cc | 330 +++ src/pkg/YQPkgVersionsView.h | 203 ++ src/pkg/YQSimplePatchSelector.cc | 243 ++ src/pkg/YQSimplePatchSelector.h | 88 + src/pkg/YQZypp.h | 136 + src/pkg/grep-fixme | 2 + src/pkg/icons/.cvsignore | 4 + src/pkg/icons/Makefile.am | 75 + src/pkg/icons/autodel.xpm | 52 + src/pkg/icons/autodel_disabled.xpm | 39 + src/pkg/icons/autoinstall.xpm | 40 + src/pkg/icons/autoinstall_disabled.xpm | 35 + src/pkg/icons/autoupdate.xpm | 58 + src/pkg/icons/autoupdate_disabled.xpm | 39 + src/pkg/icons/checklist_off.xpm | 26 + src/pkg/icons/checklist_on.xpm | 26 + src/pkg/icons/del.xpm | 52 + src/pkg/icons/del_disabled.xpm | 39 + src/pkg/icons/delete_conflict.xpm | 187 ++ src/pkg/icons/install.xpm | 40 + src/pkg/icons/install_disabled.xpm | 34 + src/pkg/icons/keepinstalled.xpm | 42 + src/pkg/icons/keepinstalled_disabled.xpm | 32 + src/pkg/icons/noinst.xpm | 32 + src/pkg/icons/noinst_disabled.xpm | 22 + src/pkg/icons/normal_conflict.xpm | 230 ++ src/pkg/icons/protected.xpm | 116 + src/pkg/icons/protected_disabled.xpm | 75 + src/pkg/icons/satisfied.xpm | 29 + src/pkg/icons/sel_autodel.xpm | 50 + src/pkg/icons/sel_autodel_disabled.xpm | 39 + src/pkg/icons/sel_autoinstall.xpm | 39 + src/pkg/icons/sel_autoinstall_disabled.xpm | 34 + src/pkg/icons/sel_autoupdate.xpm | 57 + src/pkg/icons/sel_autoupdate_disabled.xpm | 37 + src/pkg/icons/select_conflict.xpm | 148 ++ src/pkg/icons/step_current.xpm | 19 + src/pkg/icons/step_done.xpm | 31 + src/pkg/icons/step_todo.xpm | 20 + src/pkg/icons/stop.xpm | 24 + src/pkg/icons/taboo.xpm | 161 ++ src/pkg/icons/taboo_disabled.xpm | 92 + src/pkg/icons/tree_minus.xpm | 22 + src/pkg/icons/tree_plus.xpm | 17 + src/pkg/icons/unresolvable_conflict.xpm | 170 ++ src/pkg/icons/update.xpm | 58 + src/pkg/icons/update_disabled.xpm | 39 + src/pkg/icons/warning_sign.xpm | 77 + src/utf8.h | 38 + testsuite/.cvsignore | 12 + testsuite/Makefile.am | 9 + testsuite/README | 16 + testsuite/config/default.exp | 2 + testsuite/config/unix.exp | 5 + testsuite/config/unknown.exp | 2 + testsuite/lib/y2qt.exp | 1 + testsuite/lib/y2qt_init.exp | 54 + testsuite/runqt.cc | 104 + testsuite/tests/Label1.ui | 11 + testsuite/tests/aaa.err | 0 testsuite/tests/aaa.out | 2 + testsuite/tests/aaa.ui | 34 + testsuite/tests/mkdata.sh | 4 + testsuite/tests/ru1.err | 0 testsuite/tests/ru1.out | 2 + testsuite/tests/ru1.ui | 102 + testsuite/tests/stretch2.err | 0 testsuite/tests/stretch2.out | 2 + testsuite/tests/stretch2.ui | 44 + testsuite/tests/textentry3.err | 0 testsuite/tests/textentry3.out | 2 + testsuite/tests/textentry3.ui | 66 + testsuite/tests/thread002.err | 0 testsuite/tests/thread002.out | 2 + testsuite/tests/thread002.ui | 63 + testsuite/tests/vbox1.err | 0 testsuite/tests/vbox1.out | 2 + testsuite/tests/vbox1.ui | 133 + testsuite/tests/vbox2.err | 0 testsuite/tests/vbox2.out | 2 + testsuite/tests/vbox2.ui | 81 + testsuite/y2qt.cc | 1 + testsuite/y2qt.test/y2qt.exp | 12 + yast2-qt.spec.in | 52 + 290 files changed, 47954 insertions(+) create mode 100644 .cvsignore create mode 100644 MAINTAINER create mode 100644 Makefile.cvs create mode 100644 RPMNAME create mode 100644 SUBDIRS create mode 100644 VERSION create mode 100644 acinclude.m4 create mode 100644 configure.in.in create mode 100644 doc/.cvsignore create mode 100644 doc/Makefile.am create mode 100644 doc/autodocs/.cvsignore create mode 100644 doc/autodocs/Makefile.am create mode 100644 doc/richtext.txt create mode 100644 fonts/.cvsignore create mode 100644 fonts/Makefile.am create mode 100644 fonts/fonts.dir create mode 100644 fonts/newunifont.pcf.gz create mode 100644 fonts/unifont.pcf.gz create mode 100644 package/.cvsignore create mode 100644 package/yast2-qt.changes create mode 100644 src/.cvsignore create mode 100644 src/Makefile.am create mode 100644 src/QY2CharValidator.cc create mode 100644 src/QY2CharValidator.h create mode 100644 src/QY2ComboTabWidget.cc create mode 100644 src/QY2ComboTabWidget.h create mode 100644 src/QY2DiskUsageList.cc create mode 100644 src/QY2DiskUsageList.h create mode 100644 src/QY2LayoutUtils.cc create mode 100644 src/QY2LayoutUtils.h create mode 100644 src/QY2ListView.cc create mode 100644 src/QY2ListView.h create mode 100644 src/QY2Settings.cc create mode 100644 src/QY2Settings.h create mode 100644 src/Y2CCQt.cc create mode 100644 src/Y2CCQt.h create mode 100644 src/YFrameBuffer.cc create mode 100644 src/YFrameBuffer.h create mode 100644 src/YQAlignment.cc create mode 100644 src/YQAlignment.h create mode 100644 src/YQApplication.cc create mode 100644 src/YQApplication.h create mode 100644 src/YQBarGraph.cc create mode 100644 src/YQBarGraph.h create mode 100644 src/YQCheckBox.cc create mode 100644 src/YQCheckBox.h create mode 100644 src/YQCheckBoxFrame.cc create mode 100644 src/YQCheckBoxFrame.h create mode 100644 src/YQComboBox.cc create mode 100644 src/YQComboBox.h create mode 100644 src/YQDateField.cc create mode 100644 src/YQDateField.h create mode 100644 src/YQDialog.cc create mode 100644 src/YQDialog.h create mode 100644 src/YQDownloadProgress.cc create mode 100644 src/YQDownloadProgress.h create mode 100644 src/YQDumbTab.cc create mode 100644 src/YQDumbTab.h create mode 100644 src/YQEBunny.cc create mode 100644 src/YQEBunny.h create mode 100644 src/YQEmpty.cc create mode 100644 src/YQEmpty.h create mode 100644 src/YQFrame.cc create mode 100644 src/YQFrame.h create mode 100644 src/YQGenericButton.cc create mode 100644 src/YQGenericButton.h create mode 100644 src/YQIconPool.cc create mode 100644 src/YQIconPool.h create mode 100644 src/YQImage.cc create mode 100644 src/YQImage.h create mode 100644 src/YQInputField.cc create mode 100644 src/YQInputField.h create mode 100644 src/YQIntField.cc create mode 100644 src/YQIntField.h create mode 100644 src/YQLabel.cc create mode 100644 src/YQLabel.h create mode 100644 src/YQLayoutBox.cc create mode 100644 src/YQLayoutBox.h create mode 100644 src/YQLogView.cc create mode 100644 src/YQLogView.h create mode 100644 src/YQMenuButton.cc create mode 100644 src/YQMenuButton.h create mode 100644 src/YQMultiLineEdit.cc create mode 100644 src/YQMultiLineEdit.h create mode 100644 src/YQMultiProgressMeter.cc create mode 100644 src/YQMultiProgressMeter.h create mode 100644 src/YQMultiSelectionBox.cc create mode 100644 src/YQMultiSelectionBox.h create mode 100644 src/YQOptionalWidgetFactory.cc create mode 100644 src/YQOptionalWidgetFactory.h create mode 100644 src/YQPackageSelectorPlugin.cc create mode 100644 src/YQPackageSelectorPlugin.h create mode 100644 src/YQPartitionSplitter.cc create mode 100644 src/YQPartitionSplitter.h create mode 100644 src/YQProgressBar.cc create mode 100644 src/YQProgressBar.h create mode 100644 src/YQPushButton.cc create mode 100644 src/YQPushButton.h create mode 100644 src/YQRadioButton.cc create mode 100644 src/YQRadioButton.h create mode 100644 src/YQRadioButtonGroup.cc create mode 100644 src/YQRadioButtonGroup.h create mode 100644 src/YQReplacePoint.cc create mode 100644 src/YQReplacePoint.h create mode 100644 src/YQRichText.cc create mode 100644 src/YQRichText.h create mode 100644 src/YQSelectionBox.cc create mode 100644 src/YQSelectionBox.h create mode 100644 src/YQSignalBlocker.cc create mode 100644 src/YQSignalBlocker.h create mode 100644 src/YQSlider.cc create mode 100644 src/YQSlider.h create mode 100644 src/YQSpacing.cc create mode 100644 src/YQSpacing.h create mode 100644 src/YQSquash.cc create mode 100644 src/YQSquash.h create mode 100644 src/YQTable.cc create mode 100644 src/YQTable.h create mode 100644 src/YQTimeField.cc create mode 100644 src/YQTimeField.h create mode 100644 src/YQTree.cc create mode 100644 src/YQTree.h create mode 100644 src/YQUI.h create mode 100644 src/YQUIComponent.h create mode 100644 src/YQUI_builtins.cc create mode 100644 src/YQUI_core.cc create mode 100644 src/YQUI_widgets.cc create mode 100644 src/YQUI_x11.cc create mode 100644 src/YQWidgetCaption.cc create mode 100644 src/YQWidgetCaption.h create mode 100644 src/YQWidgetFactory.cc create mode 100644 src/YQWidgetFactory.h create mode 100644 src/YQWizard.cc create mode 100644 src/YQWizard.h create mode 100644 src/YQWizardButton.cc create mode 100644 src/YQWizardButton.h create mode 100644 src/YQi18n.h create mode 100644 src/lang_fonts create mode 100644 src/pkg/Makefile.am create mode 100644 src/pkg/YQPackageSelector.cc create mode 100644 src/pkg/YQPackageSelector.h create mode 100644 src/pkg/YQPackageSelectorBase.cc create mode 100644 src/pkg/YQPackageSelectorBase.h create mode 100644 src/pkg/YQPackageSelectorHelp.cc create mode 100644 src/pkg/YQPatternSelector.cc create mode 100644 src/pkg/YQPatternSelector.h create mode 100644 src/pkg/YQPkgChangeLogView.cc create mode 100644 src/pkg/YQPkgChangeLogView.h create mode 100644 src/pkg/YQPkgChangesDialog.cc create mode 100644 src/pkg/YQPkgChangesDialog.h create mode 100644 src/pkg/YQPkgConflictDialog.cc create mode 100644 src/pkg/YQPkgConflictDialog.h create mode 100644 src/pkg/YQPkgConflictList.cc create mode 100644 src/pkg/YQPkgConflictList.h create mode 100644 src/pkg/YQPkgDependenciesView.cc create mode 100644 src/pkg/YQPkgDependenciesView.h create mode 100644 src/pkg/YQPkgDescriptionDialog.cc create mode 100644 src/pkg/YQPkgDescriptionDialog.h create mode 100644 src/pkg/YQPkgDescriptionView.cc create mode 100644 src/pkg/YQPkgDescriptionView.h create mode 100644 src/pkg/YQPkgDiskUsageList.cc create mode 100644 src/pkg/YQPkgDiskUsageList.h create mode 100644 src/pkg/YQPkgDiskUsageWarningDialog.cc create mode 100644 src/pkg/YQPkgDiskUsageWarningDialog.h create mode 100644 src/pkg/YQPkgFileListView.cc create mode 100644 src/pkg/YQPkgFileListView.h create mode 100644 src/pkg/YQPkgGenericDetailsView.cc create mode 100644 src/pkg/YQPkgGenericDetailsView.h create mode 100644 src/pkg/YQPkgLangList.cc create mode 100644 src/pkg/YQPkgLangList.h create mode 100644 src/pkg/YQPkgList.cc create mode 100644 src/pkg/YQPkgList.h create mode 100644 src/pkg/YQPkgObjList.cc create mode 100644 src/pkg/YQPkgObjList.h create mode 100644 src/pkg/YQPkgPatchFilterView.cc create mode 100644 src/pkg/YQPkgPatchFilterView.h create mode 100644 src/pkg/YQPkgPatchList.cc create mode 100644 src/pkg/YQPkgPatchList.h create mode 100644 src/pkg/YQPkgPatternList.cc create mode 100644 src/pkg/YQPkgPatternList.h create mode 100644 src/pkg/YQPkgProductDialog.cc create mode 100644 src/pkg/YQPkgProductDialog.h create mode 100644 src/pkg/YQPkgProductList.cc create mode 100644 src/pkg/YQPkgProductList.h create mode 100644 src/pkg/YQPkgRepoFilterView.cc create mode 100644 src/pkg/YQPkgRepoFilterView.h create mode 100644 src/pkg/YQPkgRepoList.cc create mode 100644 src/pkg/YQPkgRepoList.h create mode 100644 src/pkg/YQPkgRpmGroupTagsFilterView.cc create mode 100644 src/pkg/YQPkgRpmGroupTagsFilterView.h create mode 100644 src/pkg/YQPkgSearchFilterView.cc create mode 100644 src/pkg/YQPkgSearchFilterView.h create mode 100644 src/pkg/YQPkgSelDescriptionView.cc create mode 100644 src/pkg/YQPkgSelDescriptionView.h create mode 100644 src/pkg/YQPkgSelList.cc create mode 100644 src/pkg/YQPkgSelList.h create mode 100644 src/pkg/YQPkgSelMapper.cc create mode 100644 src/pkg/YQPkgSelMapper.h create mode 100644 src/pkg/YQPkgStatusFilterView.cc create mode 100644 src/pkg/YQPkgStatusFilterView.h create mode 100644 src/pkg/YQPkgTechnicalDetailsView.cc create mode 100644 src/pkg/YQPkgTechnicalDetailsView.h create mode 100644 src/pkg/YQPkgTextDialog.cc create mode 100644 src/pkg/YQPkgTextDialog.h create mode 100644 src/pkg/YQPkgUpdateProblemFilterView.cc create mode 100644 src/pkg/YQPkgUpdateProblemFilterView.h create mode 100644 src/pkg/YQPkgVersionsView.cc create mode 100644 src/pkg/YQPkgVersionsView.h create mode 100644 src/pkg/YQSimplePatchSelector.cc create mode 100644 src/pkg/YQSimplePatchSelector.h create mode 100644 src/pkg/YQZypp.h create mode 100755 src/pkg/grep-fixme create mode 100644 src/pkg/icons/.cvsignore create mode 100644 src/pkg/icons/Makefile.am create mode 100644 src/pkg/icons/autodel.xpm create mode 100644 src/pkg/icons/autodel_disabled.xpm create mode 100644 src/pkg/icons/autoinstall.xpm create mode 100644 src/pkg/icons/autoinstall_disabled.xpm create mode 100644 src/pkg/icons/autoupdate.xpm create mode 100644 src/pkg/icons/autoupdate_disabled.xpm create mode 100644 src/pkg/icons/checklist_off.xpm create mode 100644 src/pkg/icons/checklist_on.xpm create mode 100644 src/pkg/icons/del.xpm create mode 100644 src/pkg/icons/del_disabled.xpm create mode 100644 src/pkg/icons/delete_conflict.xpm create mode 100644 src/pkg/icons/install.xpm create mode 100644 src/pkg/icons/install_disabled.xpm create mode 100644 src/pkg/icons/keepinstalled.xpm create mode 100644 src/pkg/icons/keepinstalled_disabled.xpm create mode 100644 src/pkg/icons/noinst.xpm create mode 100644 src/pkg/icons/noinst_disabled.xpm create mode 100644 src/pkg/icons/normal_conflict.xpm create mode 100644 src/pkg/icons/protected.xpm create mode 100644 src/pkg/icons/protected_disabled.xpm create mode 100644 src/pkg/icons/satisfied.xpm create mode 100644 src/pkg/icons/sel_autodel.xpm create mode 100644 src/pkg/icons/sel_autodel_disabled.xpm create mode 100644 src/pkg/icons/sel_autoinstall.xpm create mode 100644 src/pkg/icons/sel_autoinstall_disabled.xpm create mode 100644 src/pkg/icons/sel_autoupdate.xpm create mode 100644 src/pkg/icons/sel_autoupdate_disabled.xpm create mode 100644 src/pkg/icons/select_conflict.xpm create mode 100644 src/pkg/icons/step_current.xpm create mode 100644 src/pkg/icons/step_done.xpm create mode 100644 src/pkg/icons/step_todo.xpm create mode 100644 src/pkg/icons/stop.xpm create mode 100644 src/pkg/icons/taboo.xpm create mode 100644 src/pkg/icons/taboo_disabled.xpm create mode 100644 src/pkg/icons/tree_minus.xpm create mode 100644 src/pkg/icons/tree_plus.xpm create mode 100644 src/pkg/icons/unresolvable_conflict.xpm create mode 100644 src/pkg/icons/update.xpm create mode 100644 src/pkg/icons/update_disabled.xpm create mode 100644 src/pkg/icons/warning_sign.xpm create mode 100644 src/utf8.h create mode 100644 testsuite/.cvsignore create mode 100644 testsuite/Makefile.am create mode 100644 testsuite/README create mode 100644 testsuite/config/default.exp create mode 100644 testsuite/config/unix.exp create mode 100644 testsuite/config/unknown.exp create mode 100644 testsuite/lib/y2qt.exp create mode 100644 testsuite/lib/y2qt_init.exp create mode 100644 testsuite/runqt.cc create mode 100644 testsuite/tests/Label1.ui create mode 100644 testsuite/tests/aaa.err create mode 100644 testsuite/tests/aaa.out create mode 100644 testsuite/tests/aaa.ui create mode 100755 testsuite/tests/mkdata.sh create mode 100644 testsuite/tests/ru1.err create mode 100644 testsuite/tests/ru1.out create mode 100644 testsuite/tests/ru1.ui create mode 100644 testsuite/tests/stretch2.err create mode 100644 testsuite/tests/stretch2.out create mode 100644 testsuite/tests/stretch2.ui create mode 100644 testsuite/tests/textentry3.err create mode 100644 testsuite/tests/textentry3.out create mode 100644 testsuite/tests/textentry3.ui create mode 100644 testsuite/tests/thread002.err create mode 100644 testsuite/tests/thread002.out create mode 100644 testsuite/tests/thread002.ui create mode 100644 testsuite/tests/vbox1.err create mode 100644 testsuite/tests/vbox1.out create mode 100644 testsuite/tests/vbox1.ui create mode 100644 testsuite/tests/vbox2.err create mode 100644 testsuite/tests/vbox2.out create mode 100644 testsuite/tests/vbox2.ui create mode 100644 testsuite/y2qt.cc create mode 100644 testsuite/y2qt.test/y2qt.exp create mode 100644 yast2-qt.spec.in diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..4219e46 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,23 @@ +Makefile +Makefile.am +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +configure.in +depcomp +install-sh +libtool +ltmain.sh +missing +mkinstalldirs +packages-qt.pot +stamp-h* +Makefile.am.common diff --git a/MAINTAINER b/MAINTAINER new file mode 100644 index 0000000..3bbdb0b --- /dev/null +++ b/MAINTAINER @@ -0,0 +1 @@ +Stefan Hundhammer diff --git a/Makefile.cvs b/Makefile.cvs new file mode 100644 index 0000000..14f32c9 --- /dev/null +++ b/Makefile.cvs @@ -0,0 +1,23 @@ +# +# Makefile.cvs +# + +LIB = $(shell y2tool get-lib) + +PREFIX = /usr + +configure: all + ./configure --prefix=$(PREFIX) --libdir=$(PREFIX)/$(LIB) --with-qt-dir=/usr/lib/qt3 --with-qt-libdir=/usr/lib/qt3/$(LIB) + +all: + y2tool y2autoconf + y2tool y2automake + autoreconf --force --install + +install: configure + make + make install + +reconf: all + ./config.status --recheck + ./config.status diff --git a/RPMNAME b/RPMNAME new file mode 100644 index 0000000..b0bfc63 --- /dev/null +++ b/RPMNAME @@ -0,0 +1 @@ +yast2-qt diff --git a/SUBDIRS b/SUBDIRS new file mode 100644 index 0000000..63f500b --- /dev/null +++ b/SUBDIRS @@ -0,0 +1 @@ +src doc fonts testsuite diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..37b36c1 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +2.16.3 diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..330053a --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,37 @@ +## -*- autoconf -*- + +dnl Include file for "configure.in" for the YaST2 Qt UI +dnl See file COPYING for license +dnl +dnl Author: Stefan Hundhammer +dnl Updated: 2001-12-14 +dnl + + +dnl AC_MIN_QT_VERSION(numeric-qt-version, text_qt_version) +dnl Checks for Qt version as specified or higher +dnl +AC_DEFUN([AC_MIN_QT_VERSION], +[ +AC_MSG_CHECKING([for Qt $2 or higher]) +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -I$QTDIR/include" + +AC_TRY_COMPILE([ +#include +], +[ +#if QT_VERSION < $1 +#error Qt $2 or higher required! +#endif +], +[AC_MSG_RESULT([yes])], +[AC_MSG_ERROR([Qt $2 or higher required! + +Check whether the Qt base packages and the Qt development packages +are installed and QTDIR is set correctly. +])] +) +CFLAGS="$save_CFLAGS" +]) + diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..688b989 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,27 @@ +## general configure.in.in + +## initialize +@YAST2-INIT-COMMON@ +@YAST2-INIT-PROGRAM@ + +## some common checks +@YAST2-CHECKS-COMMON@ +@YAST2-CHECKS-PROGRAM@ +@YAST2-CHECKS-QT@ + +## special stuff +AC_MIN_QT_VERSION(301,3.01) + +AC_MSG_CHECKING([X font directory]) +#ugh, /etc/YaST2/XVersion is in yast2.rpm which is only built after us +#so let's hardcode, like in the spec file anyway +case "$x_includes" in + *X11R6*) Xfontsdir=$prefix/X11R6/lib/X11/fonts ;; + *) Xfontsdir=$prefix/share/fonts ;; +esac +AC_MSG_RESULT([$Xfontsdir]) +AC_SUBST(Xfontsdir) +PKG_CHECK_MODULES([ZYPP], [libzypp]) + +## and generate the output +@YAST2-OUTPUT@ diff --git a/doc/.cvsignore b/doc/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/doc/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..a99e80c --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,11 @@ +# +# Makefile.am for qt/doc +# + +SUBDIRS = autodocs + +htmldir = $(docdir) + +html_DATA = richtext.txt + +EXTRA_DIST = $(html_DATA) diff --git a/doc/autodocs/.cvsignore b/doc/autodocs/.cvsignore new file mode 100644 index 0000000..e1e4a35 --- /dev/null +++ b/doc/autodocs/.cvsignore @@ -0,0 +1,9 @@ +Makefile +Makefile.in +*.html +*.png +*.tag +doxygen.css +doxygen.log +doxygen.conf +installdox diff --git a/doc/autodocs/Makefile.am b/doc/autodocs/Makefile.am new file mode 100644 index 0000000..0d2535f --- /dev/null +++ b/doc/autodocs/Makefile.am @@ -0,0 +1,23 @@ +# +# Makefile.am for qt/doc/autodocs +# +# Parameters: +# +# AUTODOCS_CC: Directories that the C++ autodocs is built from +# Optional - the default is $(srcdir)/../../src +# AUTODOCS_DEPS: dependencies of the docs, default is $(AUTODOCS_CC)/*.h +# AUTODOCS_PARAMS: more params for ydoxygen +# +# see also mvidner's post on yast2-announce on 2006-02-21 + +# AUTODOCS_CC = $(srcdir)/../../src/ + +AUTODOCS_DEPS = $(srcdir)/../../src/include/*.h + +# Use this to enable generating autodocs: +# +# include $(top_srcdir)/autodocs-cc.ami +# +# and this to disable it: +# +include $(top_srcdir)/autodocs-cc-off.ami diff --git a/doc/richtext.txt b/doc/richtext.txt new file mode 100644 index 0000000..b7d2d99 --- /dev/null +++ b/doc/richtext.txt @@ -0,0 +1,72 @@ +The RichText widget in the Qt UI currently supports the tags listed +below. Note that not all of them will make sense for use within YaST. +(Most notably all those which refer to files) + + * ... - A Qt rich text document. It understands the + following attributes + + title - the caption of the document. This attribute is easily + accessible with [25]QTextView::documentTitle() + + type - The type of the document. The default type is page . + It indicates that the document is displayed in a page of its + own. Another style is detail. It can be used to explain + certain expressions more detailed in a few sentences. The + QTextBrowser will then keep the current page and display the + new document in a small popup similar to QWhatsThis. Note + that links will not work in documents with ... + + bgcolor - The background color, for example bgcolor="yellow" + or bgcolor="#0000FF" + + background - The background pixmap, for example + background="granit.xpm". The pixmap name will be resolved by + a [26]QMimeSourceFactory(). + + text - The default text color, for example text="red" + + link - The link color, for example link="green" + * ... - An anchor or link. The reference target is defined in + the href attribute of the tag as in \c.... You can also specify an additional + anchor within the specified target document, for example .... If a is meant to be an anchor, the + reference source is given in the name attribute. + * ... - Customizes the font size and text color. The + tag understands two attributes: + + color - the text color, for example color="red" or + color="#FF0000". + + size - the logical size of the font. Logical sizes 1 to 7 are + supported. The value may either be absolute, for example + size=3, or relative. In the latter case, the sizes are simply + added. + * ... - Emphasized. As default, this is the same as + ... (Italic) + * ... - Strong. As default, this is the same as + ... (bold) + * ... - A larger font size. + * ... - A smaller font size. + * ... - Indicates Code. As default, this is the same as + ... (typewriter) + *
...
- For larger junks of code. Whitespaces in the + contents are preserved. + * ... - Large font size. + * ... - Bold font style. + *

...

- A top-level heading. + *

...

- A sub-level heading. + *

...

- A sub-sub-level heading. + *

...

- A paragraph. + *
...
- A centered paragraph. + *
...
- An indented paragraph, useful for + quotes. + * ... - Multicol display with n columns + * ... - Two-column display. + *
    ...
- An un-ordered list. You can also pass a type + argument to define the bullet style. The default is type=disc, + other types are circle and square. + *
    ...
- An ordered list. You can also pass a type argument + to define the enumeration label style. The default is type="1", + other types are "a" and "A". + *
  • ...
  • - A list item. + * - An image. The image name for the mime source factory is + given in the source attribute, for example + The image tag also understands the attributes width and height + that determine the size of the image. If the pixmap does not fit + to the specified size, it will be scaled automatically. + *
    - A line break + *
    - A horizonal line diff --git a/fonts/.cvsignore b/fonts/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/fonts/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/fonts/Makefile.am b/fonts/Makefile.am new file mode 100644 index 0000000..6f50f1e --- /dev/null +++ b/fonts/Makefile.am @@ -0,0 +1,11 @@ +# +# Makefile.am for qt/fonts +# + +fontsdir = $(Xfontsdir)/uni + +fonts_DATA = fonts.dir \ + newunifont.pcf.gz \ + unifont.pcf.gz + +EXTRA_DIST = $(fonts_DATA) diff --git a/fonts/fonts.dir b/fonts/fonts.dir new file mode 100644 index 0000000..ca0b8df --- /dev/null +++ b/fonts/fonts.dir @@ -0,0 +1,3 @@ +2 +unifont.pcf.gz -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1 +newunifont.pcf.gz -gnu-unifont-medium-r-normal--16-160-75-75-p-80-iso10646-1 diff --git a/fonts/newunifont.pcf.gz b/fonts/newunifont.pcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..eb515e56f0d1373d9337224c09a98313118ee3e6 GIT binary patch literal 1071125 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%0A214_rD*a2 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 z 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

    )MxkE`9*%S|$L|MnQHD-|t9YKi7&vmCpW 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 !7%sY3D6me#}==GMdTI`12n6Lq

    +j~US>=Fe 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˗V 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

    v#lc{JsTxW**|6lJ1la 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�)j|WoAuZBBb2%_53Ta03y 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�Xg}PDNJIo!YuVntJM2J9 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±yZQ^)Ms15PpA9R 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 _GomlBT5F=7SXdQMq<2W@X}jWB=pLB+N4`gq2@ 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%0D9=oRSIne~aohOYdK@ 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±mPgyZ0@zyvnz6 z?a8#!&UcjK8PZEHw{dJ2wqrfEn;qKAyxgW+-I; z{b&mo$rsfijB~wfXJCWq3F@u!oNIW-KIzmGq*JrD&uN3m)wt*WGj07{2)Z#L@OQZR z$ylCcXgB9NpziS)F;QuA!g_ieH1;CMW=Am~%kj<|(XXu?IIlh?fMds)X3pzHHNshC z{P`gA0@uof8k1k=CJpbDJp4oAHcpb=ow)qO2vnY>rxC5HUw(1D)j2=#3Dy;qodZyy zPe%U^`UWUe4e0kDF#Fh>L-W_w1g;${giAg&O!fMUVzHlI0D6Rd{OXCAdpze}^dlf| zzJ$N0em&4${Lyfe5xG}?1v>Gq<4rDS-L7`oX^Ug|a=5n_uf*71GtBnH8F3rG{i=od zX4-IN{rw0F#8~=?TzkU|XYEI2rjuS@X|m!r{rv}3`SEXzrJqP#rnF(N(BAQ_O2e>w zyv$;2>h!&E-_S2GCmH#+KEj$ENqpf&RvU(W^&<1H{D5|j*}?Ocnf`oUiJd=AI)}0P z`-GjpO1e{QtvFF2zskqv?|Vq+yx!el$FzlAmb97x2d4+$2QT;#>*;%}0lii@p!nSP zm^(u|9_Zk&&{yO72t0f0kyvc~^nvo=KOJZCAdg#Q%R5bYj(&dXB#&l-d0I5o^o9$G zD@dIT=O5uWK4t9IShM>wK64$8-;YPn%^E77o&;XC$}opnw}XBz`WR>He9kKK6+Ddd zALG3C=IFl63;H(t?O$Y{42GH6pq%dGjKy?TM6|{|2%R^o@F~ z`EUFfJnV_cjv2}*#C7e6MSGa`pR@3pA!H-wpY`^Jcc+#qe8jVh^R2`Wu!fIr0 zg!7XptQP81%tvQ!y%9#+lcKfF@}v2h0}sWbykUNi7-(F>HCVVwtdafr{`h71ePLl9 z^fhdXqI^B#j2`QLE}o;x?w9enqd2c%eh236XUF)S%ZnQk<;C%P>$P{?y=v?`6_i^m zt)?<->@CK;yov8Wh|g?{+xNQgZdcSs_@@ppP5P>Dh3DZlpL3gu1@&Lmj&+_?Y+17~ zf|`T2Iz0FJk?dDR`NttvOV~3O^i3=8;Pmyl&*?7;krVsfkB`S1347-6bMDqFH>gV(A4Afr*(EHe&G_v6q_uxYTJ5%~ zGV@KcrHL1iH0K+;7jjXpq4_~0p4F0=)rIJ9c;MG}*z@Pr|JAcxf@c{Y8;H48h`$xC zfv}Io3hH<$KRKZ|1;#kf6VA(SJp7BqF)X$=3BNsA7!$jM^BEJq46y+?4)gKc^UJI) zDT|Khw^=>W`Abgvn4eqQ_-)^R;m1gr4?2$lC}lU(=XYa!*(UQXM*ysVnAoD&|;PuY59-Iw`_KiTmGe0RQ{S2eh* zgoEpz4}Y6~s-E{NIKJHQcM{5HVeH?FiZ2}{dR8W#lw;(^EvT8C6ZRYZtK9ox9(S0} zJ=irrALQ$k@!kKBUxF$Z?JJyvyEP}SUJP0VbDc0RT^Pfs@wo>i=g_XY744$L;A=CX zdacx*$!FfHw0rSBmC7-il(c@H*22MnmJ?@|Yd7rqkMGRi&QiV~m*4xf-lLq-Dz2Sz z>Q(cLv}XQ;XdA69dC=-OH0{%G6DR5G7FRX1(d;XAs<{!<`bhd7bG&i`#td!8KGoF1 zy{5_!IXPqTXUuP}MEf{rwsY1U{EsD(J%BPl>t{K9@SNRmOP^tJ*5wQzfPG!i^K&jI z`WgG)ogm(wXq$ywN7}rh&#)d|C(X{;@dnwshy&4~x+_W5RrEDaI940*>@R;}{bmr~ zmk(=C==alj=MKela=$XZ^G*D%68-L+#Z$4pjca%7nAfR~^IBzq%aK&=NczJUH=0kR zy3}F?xF=~lV9&N!HOm(3n0w#nA^Linq@^2z-q8@!yl+K)I;hLtshp5EF`tu<;Q7wQ z+C0ztwa}ODJ|A=U9n2kmYd6NC4K(hrAbV$igFOP>E3v}-liX)_>zyZc8WwIFboI$I z&F0LQzTNnZt487dgBnyF!aU(R2>WDeaGX((qvGWS^4TjO2iBbui#@Ro_iRVQ^H0K9 zZpHa~e~iYx477eNX#I-;osTJQi0h5D;NHXWq&CZCyNY!q&OpyNj+<-`Pj0jN3j^Le z_#Qv^-q|?kc(TVcz5N&XF6iMtoKLwfKQ_t5>LiT+A61@=&%L8vig`iHN-TEI%Zj}- zO@3LRxTPC&W^Z6)EYqn;)1mp>hD4?W%?5aLS3% zU1jp|dSOnT&xUJ1#`vDEn!vSj(`{cbH;nUFGrFsAZ9*PpZd_6eW0 z7x(GIeJ5eP^o_Lo9=*8dnz?x1ldUdBFYbHm>8#AJwAcM@GP=5cTUo1@nFx|mk#g<(xy-Js)mwl!vAFK zf7m>hLC0s{qlSMk{O&%FaV3nVW~_&C)wY*zFB<&4jt2ENs8`*WwD<|eag8d?|Bl1V zm|_C_(V~bRQ)m7$=*R;Y?>qJ#d(4x4MD+m8>Djqe`lvK6hKp#XK8;`Ip z2U~9$;rqF3Gc7)q`N@u!3Ip|6-wkax91q%T4iADK6pqm|S;G%VC|)=2F)md%*W-i@ zcCRL3WM+hscRs$eK5q22WxC}y5BA+;Ji>`8oY!N`Ws|V1dsIK8LGkqT_tw=O<2!-P zf_#{C)ZO3n<#O3b26;v&o2DXr$Y8i}4xefen%1X!UmYH6m>8F1v4-%@58;^~oM9MZ zg=6bJo3MKyRh$g%S**ob2ifrZ#CJY^;Cr?RlYx2U%^I7UA(ku9Tzl-ju|xK{^NS+v z7Rms8M)tp$KJfW6o({0?EO^ON$KmrQ7_a8}jN^pM9o)-fqK7?gjl{JX?AZD-sdjnqOa(d8iM5dVB#Lm0U&)^6jk0YGO*P zy3+diAbW?TXC|&q1pnMtYdBgCZVTcKS5gv;(!Mb`o(%ST{8X znXHC-G5Vb9sQNw8m-}p6@v;6^nX))S>g8THFN=Tn`C9og-pdaDS?c!3`fh*B18We9 zkJYKoWM6ObiZg@j{eSb|1@V0OEE$V%BnPv1iCuFT@Dwql#30I&SUj1#&0danEhn3;o6QBzAYR7{$SGNWa0}l zd6#~$qw)hBl}~_lswNTjel5ITYB-FWz5OK<*W zHiKV}&C6O0E89HA$5vRIgyS@>t!=WJlbnyS2^*`ueWuS+9%WBoZ8Zd}vCY<3pN)1Y z&KY}&wj;pY;PX2F1fFpo*2|<(_PoS;U0W==Q)GA<(_{JHBVL1BqeX_3!RBqg%mto| zXC76pS{9X2jh3Ur-T!lQPla*pbm{AQ*9UXaG23f>`R8M~s9sQg;}X-QyuT_F*4txV zk>=dryGnSv2mc53X#w7KZiUrVcK(r+=@rf&MH_!g{+n{cB41Lj<0}14pW}D#P9K9_ ziSEx+ob*-TualNVe1QAO*9Z*#F+AR|$}oNV>%j!ataIuC*zU&X+FH$~)`tbSw$;vQ zm-`s446U+7bgnj9cYA3^ZLzkvW#IV&U8~mTV_^gTP1i@hBahckpWYH&pO3%KZ?&4z zFE6w8?qr~5YaZ{9GW(rVtnNn#wt76yajhD^QGFMl`B{8+sTTWiqm^9mVFtUozcbtpHUX0`fW3vI#isE+%5 z@n`aIUx%o0%~nY^NvQVZ486l=$qU?z9?w3sH+_~I6Jn?jNt(~BO}zQVpgsrdJNjeC z7xA9Y)EbsFf^8y|N*-X_Bv zot%vPT~DCjil5tx{t3L#)*?G6Chqt7oO)O0UR__R96z+mvB&nc`QF!CxLf|Yt=N}O zRO%S*34a~;eFE=)RgL))9X)Ecy69|ajLC-S@|y)~VTpQQM>&b_rb{gMb8ReIr*6$A zB3`ssypj;UOR)dfrt{bM$BN6JjP`_eX}E7b9xB;N>v&Yb8m%mf=q>jEc@udQ<8w)4 z#|E+uY4F%`!`dV-<7XbkXLl?$4EGN2a~Iy(ix`95JV*Z`&i@(fXl=F0{*)(Zzh-U+ zc}agf#2|F2kS2LP{-WXv+6s?V=aD?c-3$FQ9)llie=KW!aBcHlXDEh?SPbAD8>ivC zBB%kv^LoprV0j?1(^2D4Z6)2C2QY_j%X)`dN|=GJnkFQPpNL1)J<>EWLD#3SAJJ;kn)se#_$Sp_dt$PVPqg*~{r!#6-zO{H z-_I}CyIZSqi=QB$s-CF&k3%Bf^&n#{t~2~8pR1EpeGAfxNz;wr?pFMe*O~k22j9I~ z`+)kN=)~SrEca-vWct1Pq#q9Qch~aOBs7@x{ zYjTs>geZT!c$39OP;Z)tw)V_uZky0DEA#h2KmEpf-ALMgP<(!-=^*YMMw^}zV=TuT zpS?cZGvIg6kj{1$-n(*{>Gxb9`xIyWp6poEC&||sGdHPT*M*5SnKl|c(@RSYf4z`5 zIz7LDXHpLOShhoF%amThdF>^!pZTT+3s1ys=Q1 zERDw3>n7Ac9#kFkz2CB&k=4Jz--bsz%4-F&D*f{lGk)sk2jjo@YP%NxexWW)y2{^k z_sbbyCVzIH=kH(wUc>e4Uc!0G_{W378gc>&#^AjnHf}Cv?eJAcgUUPf@WM~27_ zH%_`Jc@gIHCs{jwkUUez?!4YU=Xs#7d&nB!In|cfgZ|SKKHKi==!IxOc>K0#?8mu? zZgPLI<_>*!OOsK|vR?~t%QnWIdduC?v0OZ#c#5YLq0ZXp^)bf1ea>jUAD<%ONYcRf zU^=KNhPik!CI0v@=4pqmG3xNHOV^@I723CGm!Vy*R{61& zmG=H_4+MO%jAJ(1jwze*d!8N+X4eSgv8XGi5(EF{o3ByRKTc(e`_%Z7_c(hbuKgAI z@00#Q_e-gMAJ^#u(Qn3@SBE-CK*veL=|id3+>pLZ)*2uko$U3GjPa7K4c2)4P=jHa zq^8)urB9T!jGtxfqO*66GrIfU1nb`x4W5MS>rb`X5aXa%XKDY&n$Fgk4RsOv@s~yQ zlju`rOZXaCnwntT8%b#mI^KBK0^l58sJ`FE|R~-c|WK+ zF_k_}uF7H-|LS$=v5MW|d;4Q=TV@=gr`eO5WrvPShN+YMQfF&5wj=gxW=#$ZmuyL*;TXTm*8F%uXl2Q zj<@DaUuVCSy1RVCq=V~K!*64Q(E~Rx4U*^UtSzpyc_}<^67J9Xp{nml-5&h3_jC3; zdofpg%k}#;QF{>b%SPctFm9DL=(a}N=ee9>{>NA>>b$ndX2-Zv`U%T&Cg1hbmpZdw z-|geYZ^oF;wz$%^`S$xR2k%nji@C8Dk3Dk%j;}Qm@YR^*J<;|;`d5eNoS9T#XM1Pf zaaiw|tF39-$C4%|J)z#&<|<8&>aRstWcK&>WCx({@9vn%#ExzY51TeOXLnQYeV3EZ1=}m^Yt=kwN5!+&iBi>%WKUy=5*4u=}rG3`NPX^9|yc7K34oaVfONzwR~SxAD(k>(w5?7Lnn8RGaBT4O|i%a z&@V^iB43o34SUbRHO$8c`%T7Td?=rd*o3`*`PsGK56hlOTCrqYlzWi&zTRx)Tc5wk z{3MQ`O)-ojSL>@vvG;@M`u#aOvMsyZu7F=n!lZ6}+RokBNSA#vIOg@cGlA`id!f#F zLfInIPv&WFw%veZuhW&;@owC^X_f5Ys>j7=V%`v+k;n80xg3I#!Sg2U{ag(;<{m&c z*wCo&HAZyQ*_olE&xd@m{@D+ z*(0d~jvZ|MWleUXeD7=A5L505ywKgt>wBkNiJ zsNQ;>|55(UR;;O(CAOAaeYJA4uWpsEex7imSy$uj0$&a1`tE9@^{!T$a=hlx*ZPhP zVw207-F1hrJxHB#sB9#%uabU#rNU&pt+@8j#hO21QKS<2z7gs%^TcPqQj<@Qo&80z zBaD||?Bm^xal*c6JBaobeCAwym%at;tGBW4CPO!Pd%X0)Z{nQ!ENuS=&w7^RdG+o* zV>*M=4;rFluP;zn$jJ785bZ>?Pq9|+#U}e3y!(gchPm_K<*MIFKN^m2E3@b2xH6u` z%ifMw1vy0Q@BWM&BCh3_){yhVLq>S9-uxXre}eXw@8CUfeeyZB1~W?|J4l=A4-BU7 z`aSOTRWFNjU(vtF79P(VDH%Ez*raAFhO64>jN_5zW`~=)%<>XmJImy0wx3Y8TCIBF zfj?(o@Lc`Rn~c`2mjQTvcZJC<`);s&o%e1~e$EZDi_Nq1$?AFT?PYFk@cn%wL<37i z19AKxY1OD>}nH@h|9$T zPhHX;`FcFx-JrUgq2H%pPFRC>8`dc3*QCvnY(?38x7KXl-YPXc(esls>Cev2d}4t= zQ+o9JR%_(h2bKHl=5wgcy^CR>Eo-RJuQN)`*L6m9R2TV0JVRTD^la>(7hgqRVdrmS zP2HU{pXFNhJg41Y#}2#iJl0hOecOuu<2pO1OwWBu+wa?GUja>=*J$!7toh_zzKebFpF`}pS6B(mOG&GKU5Dc29Z%6*4(8`! z4CQ9YQ7-S8dj@oO^W=P<^Rjr8m(8kFYqzO3@&$zRN4wu7&0jXK8^5RC*LJO(A-SCM z(kZ(Ga~%6D&v9N(`HnerS5Pngal6&r|G5sZu?>&t3Cvc8u z{_tNRBX7X^5iFuA@3+V`DdhKb6W)&E^-^?pCZc)WPLJ4&>tG5Kn@1>{i)4cf_LnK<3mC6NUB)(%Fj?Ho&~S8jnFQETme=w@XWm zHc&?1f%%_;u^C=u@dBi`q`!6NSsd4!=NSF1gWUJ#*UX;Lg!SHlxl6T~Ud-RQ2!lQy zt%ewqvLjY=&&;xzAYQA5{@qJoHgTefKgYZ))+a{02yJ?w;ZN2mev_>V$Ejw+$)?T8 zlb58gAFf=Q(7wenb2(LU%V8f<8_5~&I^MsxEb;~T-|+YkAx=z8aoi4yFXjv_ z4=|M--U8;oq}Z_d&sOaS#+UX8TZ4Y{J!Mhsbzhm~i`E9UQ<>At7zOG^aeRNZ>e7}e zU)SY5B%}OYwwfBVhs>I#+JB1A>lJ=)-g_$lkJ!H5Xj|}Emh9qlCMwKEGgS4_ld7Ma z!||>@yEX>bYH;mzv@MgYZVBUfiPg^>iyGyxme-k#nk=^3+q*!!9&51YaATZQjSczX zJYEIsXsoIZFnO`Yv*##}u-ax zD2R)_WvJE7OPpyng@}EyuEXqvN$lU;S8ZP1e$u|J7cN2^eUW?s#Fy&)Z+!oBJS%Pa zeYSpRlcXOlslKMq^7{DwqN$b_5ChFvLkw5wL)&vkhr6yv1Fgz|Cv<(s#)#*eaD5B< zXFzM3uD5s0#G=-}Cq&Ca`sQ=}DY|s^<*(Bj!gijBHX#{dJ=g1RuAo?j=?1y1)iUz+ zj95==723oq!+)y}S~s5mDYTZQ_IxfU0SCE^@h`6J)vQC2i(lChWdX3v(kG zU@Xn3&#y-kwi)`2TYSPR@^~7q&K%m!zV@ivD$GI40s{)7orK>bK5VWux-aS3&AF(? zDjRdGT3S@#RM?w2U!StbqF>3GPv5r()pvNCb28u&t%j>cEP@%V z_^hi<@6n(HKLs)jD5CWVC|Hb86RmzppS%&HnesJ0+Eu*VSR~7S`$v^T=n6Gab#@uFGX3;C-8nB(Szuy3YLBVH+FN z8s8`V$mNqK%|>z$?fK2Zzpk+yCSusqj>}we$`(1*q7G}mJ;i!WHHOdGpMP9sbqC$M z>Yh#7#~zP_bm=wXC}VA25I3I*+hX?MX*-FXG{z^tfj{bg#LlJKcTd)Q_%0??vRJij z`owG?t#SNCty4MDkD`Ah$W2`(T9-*g`LnDQK{$R3i6HLJ(Wz>y zZJAUpKh{8G{Nx0*?rcD(u!d%o*xuvV`0rBIAYFBJ?U*-RquMZ@{?|vfsX{&w(x_x2 zs$cvR+N1TV16i+UsMq&Fs1hrU2XU`3e$>A&arArfJdadceF8ShBV5BXR9BtY7#ZdA zGvBo}WvvHe)iMgSbYv`cA^i!}R!^H4m8?zAnt<4b6Cq@)oj`9A!%|nAOHKWZiswbjN5LUIXZ#=^*F!FEYBrCAaCii?j z-hEY(?d%u|1VE%xdbsd{@VVV#X^wS>K?hP3d8g26zxdW^4o+lbk(v?^v`9zo;PN(J5LES zX+of*xu!kA{qN+}8Tj6i2l6Tj&>>&#iLRm&a%cazSA?o@}WkIv~i-pD9oAix!0anczKuOTtCuiFzeR- zJ~z0$TOTOX)VIkCy2SI+@;z=;{J3jX;s>Iylmm#n*Qs30{X-2ylAn1+Jc!~ko6GG* zTaylWUa;3W)-$o*#?O|0Bxo~NS?}`rRj-D%Bpv2I&R@g*Us0?&+tj$_74OBh=>>9B zzb?Z%;bTlzbaE8dZg-dHSu&z8vE)Er&?P=V+D{ta&j-W{o~kbxTfFbnxj?%mT^H`%U(X<&pw6Ud^8j2P~}k_I@TNRTw$>p9s|VJJzXq$ z;DX^6&&)PcIEdW;ttG;lsj+vX{pKOixb@>>v3K!%x2g`8lm7~2zdw1o&-0#gYkcNz zd}mdY?W0GsgRDpGb8aHW5-}kbhZ`hnO=(r}TF#* z%$ig2T#Z(|wvR`uTRuaMO8QKP%#!v0N0V(NEv&EuVwD zE~M?RDHf*R=$AF0Y&L1%bMuRKLC*LV8*v&LgG$*r)2z6_BJCx~WSvz;Lmb^fKjB(? zKgyx5wzqgjr?A1if9q-KBOC+fq1}^-WP8UyYwVn|{f;KXcIrD3YXN<0qv@e+m!N$F z{c=&GYR#!#qMGfQM#F}3m_*f4OQ@~>HsQ<+;Pg^tAT5!J>^p~Jr z$a_yRoPXCQThG6>c>NQ{FX8)H?PIP-$_@i)7wa61i`IwV6Q1rRwZ`0ciH}q$KdU*O zG+Ms0CbKtZtF3lgQo2ni+5>o&<%Yaa+z<`erz+k&@WeR4AyrtpKo-iekpk>Yjm}gnf}3A42xCs?gI79 z0b4Ar$fk-xXi1sTlL2~ru(xIeF~7n zFR43sb=v&6`?EgeagzT>h?ecbcaO@Uk}w@Q?d6Fjf$Zk@w{j>Rlw9NYca9j3OH6*F z?m~O@4B=e8HPh-W)@vN{`1J5&@cDLphBgwkiGPnZ_rS639S+y6*)Ts2;JsR~4w{Jp zQe}Bh%#B-6WxRv2-IS42h2tIATiiOyN&g7e2%kNaFQ~ITEgiL1`CXjv3gOrFsrD27 zcNI7&Pnn;Z{5Ln+YQfUJPu~P-;*2t@F)@L4&Q8J_AEouZ2!Fc(?=@faTfP`)b01=S zwpX>CFDQ=Wsl~+>_fdzIsuezYQGPu{$`IuL2xBJoN zn+@y$V{K1#iD!^zFiw^7L@0lG-praj%(v$oI@4km;zW{six{|>D!}lRy924b$QrB=cnWWi( zo}6rUppkL2FKn7>wW3(JXH3TQB&Ry#S>~xO2FGX~_5z3L9sJJ4W#+p%kGQgoL4Ra#OI zknWC2PPzw-n8c_7V=wo_<29qR}KQ=y`LFtV7)Q?$`+q?D&`Kwd`=)u(&&jjf2dU zB>?xkk$@}SBD-N_TYuNi%jPC52Q~eVP32dBS=CXgJM5D8+FP|K-w^?pak6-q=^noW zk&Lv&;zM3ONIMv$+-2wum_T&;R48P$CQ7~)9Mn0ikv%#PM`Z`IlBicu%jKa5gS}h^ z6t&}$kY&5NEOjR21ljfhi;_iaYNTD?L8ENRR$%MMA|Jz^7Uh|AV#WDy z+K8Leb;$PibGB+;^2>OCMUpy6bOjK{C9QI|9@DIH#e|=tmm~W8px#fvR%96_#Z0Y`Vv!E z1ybbR)BOqSsJKIcJg>~OOz^8~l+R5VTO}=XrpR*eO^LS3dnjVhUPzg^D8{xmvyLYi+q-@=~vrd3ErG%BH~I z;3x*5gJ8({r&2L~Q0K3!CJs9f61y{(G@-?GyV}!sa}jbXtTQ1|QfSmKd343O^Su!J z^ncL_P#gGbjY0EnyOFq4E&KudSZm^NKpJ~~o@#8-!<;6X#qAT#n4`t7>j5PH<-I$3 z)7EE5KBeEFM{?gM^V;0{j3ji-V0st`88b-^L#>0#wb$omMYYDMP78d7ZVX#S!1k}Z zzbx8UwK?a){q&Le!6D?1gM233;56hT^kR^zjg-0-?2Tngj9|x=LP~oOfQY zj!1d1D8w6#hO4q$;80!qgGlbUP0RPP(Z@lQ0^#oIM#lT>Cz;~|ok0_m=th}+l9rT5 zYU-TSR-pww;ZMR7J~iXjZD?=uS2f!b2bGb}F$b+0Qf|>Ukn1)23KXqz;HM6Yjm5lO zsd93fw@efPNz*0A1)2)1bp01y-0*hbBpyk3R}i<&>ZrB(R*VC+&NTs!-Rj{c{9~KN zUc!E2fc_$TwcR24>I78Xur#vy7DnaM0r6T&H&S`ENT;gJLrCEcoUTCyHAKzN^D1Hv zhHkb>N?Wh?8T(&Hn>VdHuU?y3)&w?~b^ppO)3z{uc1ER77J}*Z*TA_6NCwgPcJ+&ywC1;B0Oi$nF zZwrDqUl7;P#}r3Fe!z!So9aE^uiH7P7EB95iN*%)2k5Ad!z<9ZwspDwg37DxU0eCz z@=<|QhU%FLIa(b*ZwRux^$zGxO&Nl5*q*pOQMDq2Qg~x=qZ=PX}+M zn&GRyKGE7E-(S)_G2t#g4_#MNw3bGAeyd5+FxK$W$W#E;ek_Au^zFN{TjR4GNPs5Z z$x@>q?Ff_qv^xB+X-+=7a#cr#avm1a;htY#iiq5Z$P65S{bk4WwqxQpulTeyd7N-h zr3dK+#Yk=JM9PF%oiK?SKPq}@x-h~f+v&}V?;c7qXI66M}x@8|@QL=Mg`Um}BVT`o?x~;1cWafV)8d)7HZW*dGv!TZ9qKq;#DT z#b*idc|417_4f~lM@rcpFk}p>ujVd81zi>+SA3_ z;ND}a1UbUVi^OJTVWE%Ghv_G$+}{f9H@HU_gYJ6W7qs`_E-e!@7Fh4NDI36zno!tR ziL>bhG%Y}XT54;rb#HJH>rtEk;_jz~$kT&EDbVQ7HvUC}Hvx6BxLdCYc^UIECm>p$ z#fg34hk4~v-pY_s=9sj3+9`3eXG5j z?78i4KRkT%f<54NhHko4q#9OGKru5TX}tc*xA|hBTi}Gc-TI6=RA`4;3oU%($1?i< zVa%B1b3|1?`k|=Xs46V9H@(?E(Qf3>EonNcpq@Quwf{AYe>`ya9{v@Ugyp~hgTA7m zAn_9Vzs|s2-gvVdus+IpLglBKsfCFo%gX&vv^^|osrtAb&W$sKG-~4QXv*Y|9Q18? zvDIs4bu`eN{+odNg=yUR+fVx*c{G$|{SBCjt5)3?$gztpLfWyPPmGYIP*Fv5Nq#>o zj214!xZ@F(tcxZH4&1xW&|KYIF9vxu;S#ST^L8$?6LmLPhZ0R`|5ngfy6p8dxgqX$j1~iwsbPKL2-*&dotHP({ZKWd(QY(B(L7tMX=}B#bWrQz^TbAKc~!h_nzV!e061#3b`y% z_dmt(!QTnjM|(8l{Hejm8yD;9G;A8-&PVPL%JurX`U>P*SBv*9>+Ka($l}3*O!_;P zoY7&LYGTlOP&RdxbWWo1Ww|K+>3MAtdvsPp*_c%yQFAT1a_}QrCad#J2jk|HSniE`vg9h32+Du}d9ip~{os9D&L&w5Zj?mSC^~u|EIS)3#)8 zEwQM13%8tVr^&`2GUtoJvqA<;7DK%gJ@;W%n+Df+7w&8hUYv`%Zs2C^ECl7;bt_Bd z+mAOPG%}0_0~}RJWlq#sK!8V2JHK?hpYLz0k#GFxrLa#&-qFH8o@9V5uk)-T4y+t z4~%3&;x z_+6KNnPVI@hM1*@Ecj4zH?Kg-4#a0{+bTLYTwfsv$v1x2DoaI5E-QfheDIyKy13dP z!O@lMHfVO$-WHyGd97D}wFM#`kf3yU=+l0f@U3(Zx^z!+KMk=!waWI$1(uGibs!B{ zQsf-1RG$v4T=OsltVA8RjS4iYfLw_{sSe1oDZ~hAqp3nH`jzsl`^V7LMrNN{?*iUP zFBS=sQT5a6N^Q`~=ur`VkCsyk$w`z-Qj&y@?(+uVU?@{qpLgT+|+M>hD32CvAR z;4YNSvH_bUQ1<7-$d$fx6wl1U?Vs?ZEs6(Iqxs%{M`C;2+aU=*F!`|V>>56omhMpf z`6aJl+bh=d_pRrN+^STdIpPWq+KV3&ErpY0juro^KIehs)ZMDcNqoqn#4vryXvs71e4!$ z8YtS!KjMBW7U9?h1v3L!GAawQlFAi%GXo6M#iZupf}9xaM3llL;sxTWyQq)Ku>a(l z^d`{xog{kL`Q_Dy{-R`yD1T3PELA$7otMV5*a$co5$zhe<`eL_|7FIh3EOwwV%n_* z_O@2`y8ZRXNS9=6(8G<4j^$k~zRMpWzARMJF~b;vVru;L{3xO9=UZ8?${Shw+O=9y)Qnxu!!>R8lJ>7|Ax4$J56~OFyKVl9iTGjF zWs$+;xw7Duc~(u_@dHMafY;?Jwj6gJx;{(u&o|AV9|!U^ny>V%@EVC$6g;0Y-S`G* zY!0?rfysXAILcdGsN`si8LMcN0w~%bzE-P!O=KkBv1{g+X=oP)nJz2j#Nc)QiRC=- ze^3AFhf9_#Dpp|YP8WHd)q=Y9b&dZVX$NOsoMYq6c!G$7c%W|m3#2jS%q!TYon%Ia zB?L|K%|F;lVJ8%TA4z(Y5?3@&+wZszZ@{k7Ob(gn8O%+b6#@*cO}r#?R?WO=5#`Um zS6#F3e|@agj{l>OHJLDmW2n0_s-u<<`X+}8-=LUUx(4dcPZBTx+I^66l(wAD^Bj`t z-OID1v0vkEhV=>4hoe-X*g>RAvx3VAIqvhCA|bSNQw6k`!_rv-o|Hk znABi8!5({3J51~u=Vj}){e5*aGrWVF9nK26jqQ8po|gRYgdV{7Zl(2Q~Hf2M0 z5V$I?=R%h8&*YmrCVfBpRwbyI>quB7#S?>J0=%|4Q5w|{(NJ`D-JE+DcpGYsqMK|L7jnoBP^!wQeOq4O-3Bt7YPb`eS`+RL_}tLvr!Y{Y$H8IMIyWwf1Pvy4 z%ihJrT9k4WRoD^=1y^~M#?r;sMk_y@LrD);B^h%zd%+8;>f{aEK@AQA`fpAfIrnu+ zSn-cdEmzXQYa9_v3ilT7(ZRmtgqTp{q|W$rL&P)lp324h+>&*<{d}XZtY7VN%`meF zeKp%IkeE`lv$_|pyAdD%S$@qsg{rIo^4?~V8qu!$ZSv%?qE7_jHPS!{fR_qsdAd3v z*Cq{;>k2y4g@#CN+;*SqZJ?un(n^0@k@}&$hnrz!(RPy|FI&jPI~Mh_-%#p zP4H?~G@iZU`oT|{^$*4>7WPeKHSCo@Dt4WC_DQe_oXR)kB|uIayS^ zC}IQCw=oFg>oj^Vs>=@Ii%B(6G>*g`ta1tR0$6-E-tT-IMWvnZwFS?0l*ICX(IWZ` zkSl+_B5&di*wpu(IC)8)S0ZYbg{vQHMWYMf5CNocQ6kbYoU- zMp-C!S2YTQBs#&nrXnq}>ec$r^ygs#ZKXPV&w-})!*Q%0`}Hp)#+xi=T_gk>r8sJ1 z$JuQfGo?pw9ZKfeR2W3PHy5HDM|$fotc*yb`XO8YZIy_Z3?|&Ha+ds>%EW= z6>)a?C{!njVQ1wrSc>1F(t!sQcHx|RM9Zr!$@Tc%!m;Y7;|J)*F;tBF&P<1Kg_PsZ z*cCobNFcrQUuqT7yy$zI9!A86w7DuqjNx2i|DNhQav zCLo^{pgCl3cWZgD1Ub9tQmwwY!g;9H&_At|XX@McS4tn^S}3bEIOmaDH0&-1>m2v0 zv+iS;h_dp?q}S`+M$Y_+P7`^ zzA{D0DZSNH*StgD$q|-O7@ac10V~Q{y<1WKDnoyejA8rG@wQTcH&oT@+7cFavQ$G_ zX&bO(&`L3bdVbyLNA@df48$J>c_0ab)4|JJy57K@PTCk9DT5a|Tn#;JF5A*u$|AJt z+s3_1DEp`*{Yk2Qx6*BtCrgq`)MnIn__F=2_fm!UZjeQ&sbFIfWjFx+5bb3ZI<1ej zhTo)l_kAc}R1sRUNJ<3GN&p-8iHa3Ub3?~}I#Bt6EMV99M-cR%4_K!%vcecQv3&7w zIHDV3H!RDXwwMyqhm955ZaCeSOIT4#_=K`LWdCzpJc1TjNGxACbN%f0xGY9}{`hS2 z6DVbIi8K{tGyGqR+ryAN9+O5eD9tjYFtuAvavV_nisLv2X^g1RSMK!AuT8Y?yR1H! zrbZjQJispyry5bs-?PM{I7+OR=tEn5T6N5v^pD}yePojoysgfZ;!|7Mxz6D*P0&UQ zRHRs~#5WyQq`4^$5WE_U4}FfZry$Of=olI~$6BICG4>gT`{&{Y=%%JHHgv(Ty9MG< z(|;`?|6Gy0BcGt75ujyRY!kp-WCuq*L;Tgb5;Wr?JIuQ@lyuYVfaO%x6f2$PnUR!!bk_2UusJr zzHT6z=k6SD-5azDx$2wiDU2HHWs`yOqs|=a%DWp7@he~fb>hE+xOsQHtdDw5J%}O( zcR%_t{W;rT_ql$IdwK8B9S6{Tww6+Q-bVY7z7xWzJrS5d=$}CcSC;UeFCx~s2B5gw zH@eABvD8|;$7|jP(?a*pF2GX3nYPMSs=T(+HpOVWgqxQyAY^QgdMVE=p2YRa8)zNK zl|_E~?zqJ7^MGykDq0)&ozTK+G)@{sv?{U5MV5au&Qc=#!N0#(^qEWADs-7UEWwGL zh0Ei%YAlMvyFm1gVpGb+GUDd$0xk+2lztJ^FRz# z@U*X_X)etSEafM*eyK+_EIcPCawVd_m#jpQ%7`iZH!@#ZQgLXDp?ddKy3B6gtc1Kh!DaJp-1gDM z^ks&T_qYv3ADf|0Bo2%WB!#JN62CKTp@%%^uyKXV_i5cpDq6x2J}C>@>2qKBXk%N} z_R~7#_;K!Hc*FR)u4*O(|GbJ#e@a729##V~GS8{Q@>E8@cl(kp4UmbcpJoP_W^kU9 zOg%?P9trcaEj;UNs{%cKvU_d^BSD z*Jk@k#-!WXF5NVS@5)W3DF4-)^ErpLRuVScyWZh1Bi{6p$<7OFW~k3xJrva_1ZLLu z$aa0SQ5m+B+NiGMHQs>r|lD+d>E+mB;Z@~6&#qAn1}Anl+ypRtpQV)M9oxd-i^Kzc|#NG0hKVqKit3r9F|H&rZbrGaPL^fY= zKAI{Ai!QRb>_&#B|IyM`Y8CLHMp4*Y50ouxHbpR`NX}M|s;AUnsI%k5*iGHPF(TF` znl_0-vUAh$00p;qeC9H+f$kP+_sD};Tt&TY0#|EVcMd)v{H?TnAB?tCwRi=MQF@{jXKPwT-P0jc>b`8V?{JyU8`|Y zInu}pVh`i6sr^pes@%x%iX`GFzu8~R;e2pmDwVj*tO^alew%Fpu~x8cv*7|x@m}Vm zy`1`<*)3_V47NSnmg${45`|I9pFLg7YMpDn_2zuUi=dfiIn!{5(2IAX&1-V>lsEW%6!ri?dMswbSnLmePNKL#v=*Z z_7fb-M8u^@-+|r0T=OhtAl8b%oL@p*BU!4l;1_b!QiEf%?h9VV&NefYMW}5FZt3W` zCbm4K&n_xjpqJ!Iylw57b^HbSzz!yio@n{~0^djW#-bq>k_TtTex@EOt8JzhAjX*8 zSC*Ixu77n|-fZJ;zQTluOmhJTQmMylZ0jc8#xtIV?l$Pn%e3@Ucff(&bk}iUY-|?S z6d>f*0j2rq=ICOh36jNbXq?Xk>iqS*LK2I}P&+@8vJxiL81|TC4<`}sP~IBpi`OZT z?S&dQdf~2R*0!7KdG0}H&6?mWu>}0a=~1k}0dbSJiLd;O`-F#b`jqe%$wGjp(t9y` zbQrJ|A=8>o4BiY`zVX;U%}7gHS-vus+}T}l`ehWBx-H9Rd3kRC!!pkopnG5I0`L9? z%-Z?~uhwyU+(%WJSHP70^!}MP%>BxZvkTa`?MD)>uVoWk9_AER+{?qqF6#aPK^2bo z8~Db3m*W(1_t>=za4D+fvQ_a}x}-NwEo4>51#uMQFz2M14`vOA=J zGVJe^u@?8O$^}3{-(tKSL&%)pGRF6kbe>{ZTzOkg=rePk?Nrk(V~U1zGJnOaW#Dh$ zKi81hC#eLvRkUyTgiF(&&w}daY0|&H5Q9*$EY0Tf72jXO<3-oM9tdOZ&WK4hTDnQ{P(J*l+d2CcFsKkN9W$OgRF>THN0baxei6sBV5Eh;KVmn8_P3V%p-|J204xFr zdvn7=kwY|}ML%y*oNOt(vb!0YlWIdpwpFd28e4_wxYKd@vDzm7mu7lOftn@fX2wHH)H7 zyJz-h!#`r(_(95#@*2g_|H7h*w#C>}akVo@kAt)h-%VMy0UL*Q`3jP3yi_oTOL8%)Zc&InPMo&Nu<~5 z1W=SvT9pn*0k(V=!x5>c+zTXJC&XZc^3$%UN>KB>j3k(4?(9{;#9+iew2Jp$h|0GH zK_eSj2Q-ozi&YFzg&|KD*XDGDG0T3)B2#PjBhBrawM6ab;1{kQugt^`pN`)7cK7$#p2z#%QIjg)V?#n@U7CtwE;Yx%zUn{XC+hZohBy#YRsQcq(?y-4|%lOoN6Usx48dc+om(i2I!nJ@Ww^7|*e?peWa)DbNH ztrP$b(zcp4tKYj*xL>rKF%1R9ZNqpj*qHe|Au*lgQmr=gsC156PtX5WIarQ$w(if5 z`g6$B;zmXE*zrWwZ0y7Zt;4F#&2Rl27-2!lDZ>m}Vn;!~5n4gqiQY>}-NFk4j6&Gy zCwW!(>8@+l+2|(8CySn8N71t)q z`d7V$i!=23^?}Vc{_<&Rl~S(ciJ@jt#YX;@e~``m=DKLt^ja%aRA3%9uvV;)9NA-9 zHE6+z8L=JRgdA4iFo^VLN8t*2x@L1=+gTouY|y1wx+Cp&@#8ES)!MP6Cl`)aBF}ZD z?zY}DpfTh9TjqXsSXHHk#Z=QH-rU<0C~aD6b#&!5vJ9;i&4=$A4&KXO4DX27GA}rP zP{v%FAo-x&(@SdeeAU19T&elZk*gWz-Mg%18MV(x$>tTxw$WKcT#wzV6P zk7XQ9RRZea-Ks5Lt%PHVCQKqTD#VbUs4KLdI!T4OmHF zwtEd_B!(u5Mu?jvw7~?hWw1dT%b@t)`S15bcx;#cCuktqt~B};-t3XSUA#*~9yjuw) zm@w+u+rZNv@;+{BK3c;r69pnzHhPKOj_Kj}HR||aW8d23bGB3jyXrA4D@99J1%Gk# zB0YzJykxYE?WuvK-*1wrU8@IqKeqC}j4-C}i+Gp~@&lCM;nt{|A_4WK6Uq%V%E zIwWD^6&`12XvfB_^b5UdUjp7fO^yCho>kG5dw1Q3&c}gU*WW>}_ZoJ-%5i$(i0O?O zIpQy6U7|ImZ8z$@j}#(_tcbfKQ2WZ0vA%j@!)fu5I{x0EX66xd_sn`c)tufh8IyV{ z{WaSA5@oHucjr@#*dli}e)6f7?7rG$2bD_PbM+PJ_#4>1bJ5Hd3sGB;v1D1SX>LGS(8yYb zl~5=5!;ugcoeoW@AI;7*){GK(L~kZ}7Lhny8WUL(zav_v(z>NObaM$yQn0hy$vFu| zFrU^V>$TJo2cIqHI(X|~+Gha)kHJHdqt+bQjtRXn6M4k2j~nzey}X$63%DrkgPZGQ zgk;id-2ga-lje^PbLe23d&WX1Mb#ZBT5HGb!Dx{9YuW{;wfoJqmiM|A|4M*;NIdqd z?^N34_ZO+VSID9~05MEDvj6V7`0VJJGWu!7duei9{ikL+vI0df4Y_nF8?#`im<%RW zFvmP_IZ7L88FuC&+(506WRRkhO_2oxfLJ`>6DaT&4JatCABFoVZxF;{nI(;Rw6*%= zii*B8;7rX0kvZ*PzwG_TjJ>(fck^IPVINv?D`7yy>9MGFuhRC_?Y9xGo7oqqWfSH> z5_AnCC^5%s^SS$~Oe`~dG@tviI>4Fb>?7CUc0Eak8t%O!91x7*)MDs-khU z{f%`frc;lTUV`0XD=>MuVtuKl z@6<@;@k0Mnqu2XVsw<17-x(q0Va5*`6_Npp>rS-+M?!C%y3 zW=^D7gk;SFlct~IxTW;eT)GqgG=67%o-=vBUmZ(LQ8uJU?FYG|Qi|P;GJJx?j`6RL z0Wfl4vxA|j(K45~O(io>&8h_?BXr+dS_WGC6Qfw+H=3O@ zTrRydo$*Udi}%b>7`3FGYO5+C+e&}H)R9pJ<#oC5qA-)4a1O8P?n`l<8gHv1ts$(g zlp_0hg!c%M*PSegM@nV~KUm$JI(!#VMMIhcroW_)t{nB`FNl<(e3W0|TMxq4=;mbo zLpc{vj?G`eBUL9}XK~(rW$Is=1LENx+u@lu=iIjZ>-wsnA@Ds@;qy$&#r)2m>$;)q z2~4Ix@KPT=?|d(>piaeTlZK~~2*&74%nJ^-1>GXf~+RHr}rCsEgg1Q~zk2OnY z?CL#mazkq<>(zqzNT}Estcy*{!11OOK}7F*EAtL{DOQfM8($uiop{7>{zaPWb;og2 zQ5JOKeHv6CeS!?N8F1ErCi`bl8u;;)m?%GJOYNUB-Ra&U9R3t`Oq0vv9L(XVP*6%~ zRzDc`Up=+IbIchT(d>BH)JC0Q7zBI(eQx)k_24V@@Nj<%;`)vveF=>TUKyUl5_2Lvnt=5Eh@%CrMBLE%aZI}Vn+3w+CElRBfOY-Ev8A8S5+!aOAPiw*Vq(Lv7x%-Gpq z2Xicg6YF?$H}aM-hkfa{5*vAQ8r&b_-By*h{iap~A*=LdqrW3?IVK$@0?sexd}@m_&XSTskm!QC zQZGz3;HDSPFIR;;wRBk1*OFdI#qmH$X zSJgJ5RPJ%q*L(%qco1fFT^`<=`rdYn)bzGTWxLVbB#WbNM0AX;c)95gEIV}0T~@Y- zb!aeqI*(wxM3g4uT_8U&cw9-*#!OC($_sOIo>Xb%pUP0p-iX^X&-`3QKxd)G3@x=Y z19dlYPE`ATGn-myr}LEWHCzoV(6rTaM9q8>ik}?o88xrSuYtcvA&5cI-IlTZEkMVseLbq-bU}w0zhZ(|rnf z1M-R+eJBR1i*IV`I*%_t6Qv24jVH%w&GuSC$|jM@jHj{Hsy)3}hLi;DKQi>I1wq9j zZe4!ckC_c3Y6sBtP~gD90$zUwdMz8~^rAM*sMGT3=&3lzG0S5Qoe&^}VJo1VdAl&& z^if&5h8vj;{mscVBc(R*=TGlP-^WZwtAbhWOD?MKbm$Ge1ee>MG8YYQ<{}U6B_8=6 zgr=^TeVzeY_yyCI(VE^VX~v4%4Y9bJOh2`>A)SW_ahN2aB;)t_4{? zf{ozn_ntAP#G+vBcFpMu`;XBE&NlC>GJX3R$!)>t&zzCJ(?+xg_pdw0C`)=MF(Smf zTYUosmQQ}cKUBL|X+m;NmHXHa$+#=ix$R>srO|;8#asBicTz0sQiyD!FM!0;GSmd) zbj5e>a@&#CB7Y`{wseuxw`2op!rg0shQokv9a^9_JMmI zD5nZ{iZ^P}@28=6LS`CLiMJY9yAD>YJ@lTdR{oq$vEyMXHoo9Wu}Xf_3%O2!(b5?2 zFq-^b@INq0KJhm#z3WP$iP+^0*Q1kld85g{Px$y7NV5+yS&g;jEN&IH2Y|e25*XEL z^Pw5Q4bkxWED`_rQn#=R222<^gXwR=lr&{-ya6l$r(K^Gy9Wf(i4Phu07v0A;Q#DeBt1@@l=F>Lo%Pn6y)Y-e!DFb?#qT z|AtRB4^xvW=@D##L#A4YhaJZX>F=E(dL$74UIB} zrt~ZYq9?7+@Pd%`2H#BW94WWWaWb*W)Ws@xik5Cf#A_~r;SLh)*a3|q*cH}0bmyb;ot%}b~~@&%*zRWPh#iM z%LAl?rr4jD;Ei^ph6U}t*G80}4u3=;3 zfH)ly3MCn31>Q=hvF_NTA3(WBG?26!oWmNt<<{YGAh@bBco>5}ZJ7+$?F=Xq&o7yp zvFMOQd=X0q#dO$#waOdQ{MU=8bstNPjB<^YtN^Z&bi#4JMi>Y9H2v`9??tCKku4Kw zVG=xv`cx2Yz#zJV^`f@ygq*tDwccbeC>VtPT(SvXHal*tw!{YbJj`oK$QaVQ!_e1D zdRTYa$4kPGK#sWVXX%ehB%5{1wZ3$1c#)%S@jQ7hv|Gv@CDYuLTt^XU_etJ5O5){y z{M64CIoX`vrC-Qf$tFoHN+00N00sT0hh#XhD)0+;s(sRjp3ay>^wG6F22-7&ha>R-iwe%=$kF`%wF(O+~>%DKTAXDX*G9*+tcC z%Q>R`%O82gri4Ye9ibe)OuO84?X z_>pj1NMlDyQiEC&)8WF;WuMoA41P)@(}!1*N#d>&;;#XNm*x`K{`8IbYrA8~SGTT7 zxedThk}F=uuzl$`?MGTiz;<7rFk`$P4Uiz#UJKpM7>)Tu;h5gi!}wu2c{p?A_ak;! zCZt{6FmdSH7GYGmkRz_~?fMKneR2h{|ZCn538d=vqVV>b^nGSiw9^*;aQcq7}_6(mCY&146z2}ix z%5SE|Ct7izKf%l`2=IH0#o~iLoz4`$M zbCB8^0X2RRM_Mt*fYP$DtX zgRGF&yKhGBurGeG-bx37Gr2YhBB>d#9PII_Z1MwRPsVKQ$lBmMM}T~_>XUOLc3i82 zn8Kqs#eLdyejV9d)r0BURPZ%2%RZ@`FSN012@A*{?ZL%it4%B9UL;f;c8tv(JKl$N z+ujh0WmfxAn|5+wzb=seLSJG4#j#o$t(7{vI8b?c@ystvjo~2C_-gG}9MqtXSeYYH z3on~F;YkhQMqeL1TJu&mkW|%Q5!FqEmt5R6naGF5HFnmoPcFldfi}DM_*;jU=GFBb z`X-OPgO;fBltWrs$EY8~@?>Z#hr)HA7w;Yf%ez#WK#!m2RWsm7*nyx@3uB+Ru3Mg3 zPbz1SUKb?xMf%3$Hp^e4BE5b; zR4sPPEP04CK+w{iRY`v?j7UC%2!aA9v8uiHM!Ssr^kmNJaGdJWqJ}XL$L=b6;E@W9 z@yij4zxZF`mDqL{g&Y8~rM=w^DEo@vWVea6h@(PsH+ls0y!}p&E|~v3J66bkLHZyQ zIVPW9;5YRB`<5sni!*tbN9#_^@22I&t|zB&6MJ71z_oUrCl8G5RX~t%rCb4=_{QnK z%&7%YLGni>-SeH$(a@!`(*10|bse=qAgid0+&O&`B zQgVeFiwbDkt1OSR6CH58k9YMw1zqAcZRY7*_~<&;aQsf}pPEvY8zyvfXFRdr_D4>w z*QKB^xtnRgb=eCvq_dwKX$XGX=(g8dN|TAv1q_}GTs`Gar#&wc4ZH_*vi z-jQ;$AIKSf_>r1J7_UR>{LG2BV9iASoMzzSsc*^!i}VHVho%HfhI=XT(?B8rqv))| zntb0j{!_k+h=7RFp`sv?1L;&$R7yoUCY@t+4^$LHVj`UbDW$sxOmg(-7%_T`8e_oN z#^B{Wj_3dTulu^L=f2L*dCHwNsah)Wj}&+TH+iq7e_bQvXp>g&zjJ0g5=N5GqVqOcTzRd-8T zKG{B%UjD`5u1Rs?a3F=d=gDzD6gak;9(ZSyK4qZlOZR;l7Vo}KTWrkF1AOUSnBYsB zFzpI_a+@h~=DTQ&KK$$@t_qD^>
    kmQKK!S?Y{&12 z{;Qkok{ude7R<99Ii$2~G0Xb4KSD!tP}B5Xuo@F~cP1a~}jaX+93i3>2T zt#+PfUU{}rdqj6yiuYWf_p06#r0t+k)%Dk7MB2L`8u02VFYc%~FV#P9T*>tvR)w`j zq;H%sW%p8+e#UATtF5Z`Mqx-rpor52LQO*A(?_Cd{x=jOH<(003E%#}I+eG_)xQb_ z+YdA{POOfS&08DIGL896V$rQSKEEt_n1}51na1YnwS$-X4a&Pr)T5Z9?LCPrLKRQp zEkUiH^-3fdU2~@#ac0sv%Q$s$lMu(#-{?`>?eMemm!zpooG2h(n|Z-z!-^*SR=ah& z`0dL0!&Mot&&Sq^7l8z^m@3+R6TgP)xXOe5^;6cFY%@1eZMVlzlkM%VlE9y;DJLY; zATf{TX+cfIJt@XY3ZRJKn|}Orc~aCH!szw!s!0oi_U&!X+Ji{fn*e+g-|!Sjc1K2`s7OUH*&(O*>EoeLw3n!0#C) zfU{`b2_5kcKk~K5{Md2davYhOtTx=^P;=3nKYY|g|6nP$Oma0ABe8kPt<*@J1N_MT zsUi8rS3F%<0L@2Msx)qQklwx#bpKl{mtEXO_U}0pN$RDe?a$8t1naOJ{@-_6l2FzU zZ!ck5en`|t)I+0AZkzGBXHPO5`R|JEOKMc9ocpPYEybOJqCMVsXCYzXYyn73%;6g-9GJ-zp+_Wh;PdU@Y)c&_T$ z(xd9c^6uJeq{ZL#f)Qie%s-6N6n|bEWRvt3C{$wMOnl1eyfL|BQq#^9fB=}Mju1ub z<+(M&Akb+Mi{Hc-Em~B~)34Y(%V@U4k3oN~Iy?ggR2vYC&FYAF=Pbt%=qg*z$aFqjSTY!Ky_7J+!~up3L~11Ky`(vLMWpyzkXfy8DbD zRhHmNAx~Z1>8Gua8iq=_E0{cZBA>L9$`vKdngJr@p|$z+7W(O;+tDs zKSx)y>c!BA{;!6^YHF<0@qee=d$Ds#5m=y~LKFomExPq^31b&8V}3djm*m7YiO~Y= z4L`%+3n}dGkE$}${)>%9{AK4IPi)0z`uTky>xV16J}@FPx_qt0yaz`O4YI=@V^P-) zbyo zP0dr4Ow!rQP7U>@&tJh9vxSNf0%HNI z9nDGl6V*h^Mu_hn&oCh8PLK?)*%7oHnAju94NyDUXQ;!DnxgyPdwR#`WNi@8b$FXp zR_`g3tORVyCnk*tHkOY!`YSFPhOJIo?=mM5DVRuYc~IyH_S?b&NVf{6h1`EWXl8cI z6@{|#hHXZFtItUvr0?=yWBnIpA#2h(&{GPR$a>%#st&rnl}l%SyV0x$iR@ zl_CtP8nF*WvJF}K-Ct5oVW}@4_{B8vB)Y5-!3y(D<@r0J^iow8Sa)W+)gEl6)um~V z$2W^Y%d+E3Xm7SasK$Z5p!)C2S+OA9Xx&lZ5#L$>H541a_6l<;u3BR2IN`*#8-s1# z)hp3^RN)gyhi{~?@lB{Q@8wFY zso_JRU^V0q<-1!Y$U_*@dBMSj0uKE1?DSPQXwFRqAKZ;dTM9=x%tVTvxsJD2{NiX; z>Dk8rx6-&zhm#y@lm_x_EU{r_Ie_23uVvQF_^MJCqenCPpJdvce|Je7wE>^>IZA3J ztqBKu(I3^69zhS0T?0pPYxBO53DgWVteiD^N`qQxaVm!SUv^*cpSDoU>!c@$I%~TidK{_ESJt& zqMLeVXG)G^JFVyWOA68lR6U*oHV)T8hO`b`5BPp|tR6TdFS6Y?*qpO)(2IXm2MKPU z6>$)|y~s>@lhfw%HIRI6ox(@WaT4?^YT?0)?+Ch%nBC50rp(6T}f>WijW^VY4vVUo^MN(=U3}_tlO@%yiaYskixQ1|D=I;H&DJXZPt| zrDgr-`1n*&m>;955?iuWbo|Q*w^1^AmWl6@35oiFD5|HkNlU#0drV+;sjQqcr^??X zix+jk7$03QIrjquRLa=t4=pgW{3uQJFK+!^(@=Mt%kp0-BJerR;0p)eD z^pN-?EGIDQyCN#6_14c|4_v^r&g1wiXtDTRzvsY^%t>e+ZB|G{@6Ji!gnsg+Or0dHAQ3{5)J1RWE@?q$*C7VhrO6V2KKU z1MxtGQ+aaBNVMjeU7gNud~_be0-utivQ{YAjzQtoc@)7-y6+E*#6m<2_1Ze5y|ya8 z2n6N*397hKK1b|5%wPA&dq9F zS5t1ceg}n%g-1c1xSdP89vWsXa|`qfNc{T>@+I=<2-o{1FmcSg-u3-I^xU}LAC zEaR=ex@eO=-jWmZ_|bjbrBjeccA#N_SF9QA(r&h2&TMicIZJkr2_26*l6r2~;yE`` zZedFL+u}Vj{-(G2F(CewqVu>s^18%&n>%>mIpQTsx#vYn+nXS$>Ab>+%YnRW&wEY) zGEanu>f%0;?1(>v+r9#0c}HDj>n1AGuVi7ONw_h>*zU~lA8zqDsnKAw#ZvEu!^@q4 z=!L)LMqizLM;Xt6mt)Etdpu%8KCI8)n*$oHk8|klkgFyq>G>Jw{T}^ssO+@<`0*Cy zVTAErEoR5(F88#vfBrCyYfll@7k1$092;hgHABqP6K%_v0@EnJl8q%JPW7~u;Fop< z53mn;j{@qz7zE6)G=@~7FHMs7NNr0o=uQqEEG>`=;6*}bWR`j1I!l+b385F(V3WLZ zue`oa!VIIS`AkuR?z$Mc6(45|4O1fZayG|TS1dZbwK46*y1&Lhx^<=_GFq%N80>Dn zxCb`XuTm8fL5%*>AId4_8mA&y{oISpD+mASxA~1EAclGlj5$2 zv%G+dyTN9haaZ3AF=FxJ@b7qMq+S`<0tk2?hCE331jFAE;?lO2v99%ro znKgE#v-zaLM&K4ZPA7c4JpG426tz-tIC$vd4!=24TJh#aBB__Uj!^%JSDKOABe*n2{4@LQV*k$1) zg6U7vrG|p5xGtw@kA!3`Rm1safM1!`s=1PlubzAyMm&bw+0=fX3a@%oc7v^?3mLsTq%EJla|quBFD! zTYy-|>&OEMf+>A_eo602FQQ5mDt@*n#2c%LRh&Mk;|$t*oePmT5+P-a7gDdZ5RYWH z^fyg@iSaZcRrd^LCK>zo&QOWZTufEE2U4YWMKnon2Uc4f36GYftKM-zWW?&c^YZ90 z0$^AC$!a-oO#MQ7O8cs_&&|PH3$CG9=X;c0v!*y0YTte>XK5l*>z=6dC^a8*x$#CD5aeYs85q^3n<20^j-v?ZCe z(1AOFkZ1~rv_1nfSmbO&4S9Al4S@aUS-;RIC~DX99;8+g9NB*SCU?)92n;pJgK}qLupL6nJ_rNu!^-<2eTY5YoRM^1{c-giXT0IwOUh8~+&g zXm>ziOzLzWyvOI|%C27ZU32*(U^CuuufU<@oFL@N+e-$#Ft?T~4=vlXIA1KiuvbzL;k!rE!;vKK9_7IIgdrwqk9G=tKp ziDs#C%sZ|V$61*o{tEP)HL?T8hETkOpu&>0Ysh_7XF%5gAj zaamoe*D4P24qvaY&bi_g(RX%E$uD;%%gP(JO>u3SWkhS4If}gnC+@LkB>I?yFODTa z*;_utITsWHn|J!5i^H?>LqWIP09yfUk0hi5n~)gPO?3npS;O|#X5%hP?aeW z9Fj02c8T0!9pu>2<@3Q>fH+}1K3%o?xF&tL%qoC?xXP^cx7mTKx4@bmV2t*r_^j0I z1rTo>G|i&)BR7I8vBT}3NCYh3n{rUh#@A5ILTAojhIYLhLQ})0Z2CU{^PXSsrxy<+KhPqJ5~JXW4J=d-%y9WRmIHp3jHN%O*1mb zpY(fOFg(Fk6g=~bZ8H=^X)nKf{E=bz-(@7Vvp3Z#Nc;}xEqm@Q?_6;EB6G*9jZ0bt z2_x`5&)j2C>uPm0o#{sQm1nJhQH@v;xa;fmcOsPlwUY|#Wb{px<>KiQYH#+X!eY_~ z$sC--?!Ovq>ob0;d}N4PFizHnG8wt}%yzN1>1nXYqr>b+1CYZrF5I}-B+n7rNz4`^ zDV=IJWqGk_{Y}ItC(!cet7a^AbG=xJLoTGd+grGN49l|r-5fopXjj)RgM}qL)tI;F z#+Y1MIq*iep*vbBagzg$orWc17AdrpBV#z$!qf~9@lDCwE3jPxW5_IA`9cmeF**7e z^Eznbg8Mt(U+-cUud2_3+Ms8yzYIg{T89eMZ7v?5t+r4R4383}Wfqosc{}PI1QQ+Ra*lCH3>_nOg!pO~ zwKq2UT)+V40D79Aj$K_$h^o~rd_1li=zU>3HW|}U%BS);~RZ z^^k_FCNv-}x4HhnaIFN#5IY~jKf3-G5@M1(PsatYaky80!SWnq#Bgd^As;A-43Wo@t>h}$lL-9uyt3$yz`Azx{d|U(7ndb;!RHuNj2}7x>f3`DlY%AMF z_E`GPRBN})7S$Kcl~u0*Jms*}*xmgJUp+Trv3|~BenZ}%bFgLNe2^oauLSOys>opL zLN-WWMfSub;iQ21NZHZj60~0h2}mrTs-A0*kEC@|zwzwaglIy%@{ZK++h4-0cGiFT z={30(?L@A)8{FoU5f@wpw>x0nuovcdphF>B)P)!pQG zfpOMX({I36E`4s?QUor&oh)fX`@>xQw^e5Nv|65U{>^9`w2eAhE%f=xvbYf{oB#N} z&#e;XG@Jn~%O`VLISL!jUX^l|$Y9Qvgr7W0qnX9ecFPvFryW;0hy_722|aC=(exqa z$U;2GUaYDY8lWutS#xEvF->ZWl^tctbDQYYhqI=yIX>A4T+Sm^5z9O4Y6iA}500jt z9MJaL`qIokm3vx6h9<_@ewua=>2pPeQo9veZU0K=JbGmh>1J%Dlqb)PuU#(eoDYnP zDRFU2Z5y06`JF=yXRkal)kKyOgriZFCGkm#`4^ z^B=%VK=)N*1qsB$RW5xG`#1>RG{CSTnkOVH6b_Cxc^4wuQ0 z24%JU68g~c1prTK*b)tZJ%Q{Es95`Hdioc^3^P(6n2c$f!l>m z(gPJZ0`IRTaJe5uCI2dc4_eANtcU4S9peLF3EN4^0_0o?U2Tc(Ue}CArS*npIO+CP z-1ddZCcR4p5N0^7$e;w&Xc`ojDU~PSNV0vh{mkiQGJn@aF`mUM&>HQ&S*tNZ0HxwH zLSzO-Ur>0UIk#karzR`CXc@uCOwzpZ zyzaHFeL7!rvb3_}e(;JzR?6r6eZDb^lZC&2QA;y10j0^N70%f5N z)gJ0@)PwG9CK(~=*lZH1k_{4!SP!3);0PZMV>Xo3>N}qixC>bruU^K&C43U;a?v4_ z6?hm|x1hoW_qekCi#5pIvH~d4cU}r7dI~0HCZ?QgX-DEwS@mb8|RFh<1MwK&@9C$idSuq z;&=)L9eKDVe^@isdc`m9?aCaRCg8C)eX3m?L_3Fdd!vzvAaG=Ug?Ie--!eZY_h57t znZ|iE-&j2CjT)lOXl;jTe%_!W{An4`T zi~xaiI_VMH_Iutw7i_jnT5A}BGa?$^*IwCq!u&Q{f<7kq>}GNEO;l+!Dye&Ww7Y(8 z-F&>={A^b7-ul9Pn2F_Q9Afx1P0BzcSvB|fvmnT2$DERhTM3p~0=E}1FeK-{c7^Ey z&UD_Z8D+hc#iHisrH$WZFe8zMzgvQ~hNf|+r35(!64 zw$-W#*v6BLU%3Bfj$C4#zdC;mT|+AmB-4(q)()Z-BiuU)xQYm;i1=p&+!yiR~P_t?qS4Q?`3_r{r0#aC+vah~h3c zz;)9>(~;txRpgqg7B3@3;D#cdCsAiex%^Q$ipoQ1i4U>p1cb&OGhC#mrL;K?dAH9; zgD#={Z){xX2z9AVzP4_BTUj39(X2;qkbB7sSGM$`?f$qpcGA|Li(6LFQisYg zXVL6*q+!}TDb0xTqUtImVqc9_p?7WW75KRcH)zf|S7RS8lPWK{HmSOXQNs{VSZ>^0 zUxi#=g(m#)UHm3Kdi$&*TL5Xd9qAh3ThFBDEZ(x%Sds{cpjk!8wU!zl-R+zD_F3t1 zd~~^)xsWfAE5cp!e!U=yQ7|4yKymz#b9wZD?ZC z(C($+r{cw<^vInzG3}3-hgaV-)i*j~I+3@Zh#i0mHEkiv7aSr^$h}`Qw)|IzKeoBO zu&p^=;*z;j)B}gd5&KyNyWcdLKY?6Z8(!21MICC7$3Hq;;!%X%a1URs6YpLPN}zPq z>BbdFqhT9Vv~#VUE(Lj>kGoK*qt&KNhKrfr1G)n-frNnJt@i%6qj|sdVr_bWwB|Ou zJStE#ji9MMyF8`*E5?H;+}U!~%p`6@31kk!U+>(ixT7IsgL)9ej|?z8AI`2lDd|zG zR^PY_2>BtuR&dmo|J1<|5^-ek?_Cz(UM8&Mu7#V%i`88q|{_xbE)c$TR3?>%}%cd|bNHDFrv0!1lYi=-zfh%1oU&%5> z)q^7_zwq@(3x}`74Bss@;!O#U9Osv5>Y-0sCa|=9q zw(fU0)DLNn&_6O+8pN$d*~|vEt9CqCM__n|6mtI&>?|=nX|#5xzuJ#GYCo}J@%omu zynI@SFO4hsFQ6|}<72;hJF!8vAHZgJQ$Yd*LJZUFCvLSTytHQDa%L)Rt4d|+F zJ9o>VZl`Z&Sm^mmZ4ZE;zSmTtJZv~ab4ZM^ce_XBJiAD3rd*%mZAq&wzcHCz48-Uq zx&>Jsm->X4R$(=lw*F2t&W2myI7WWh<{fYUxA2q`sCWRuPhGIG;zkZ2GX*fzZfP#) z`R)yBb$Q~RDpfZIv92t*l_mwWUz?$2q*#s`1k=(jUMSp;rTHp?sJH!!pR>eAaxosZ zFUYmPr4(Sf6)p|)yXiD9_{V<$l~biz667=d;POX$)kvI%YQpJ$i}mk%S;fYlA~#g+ z9oT`6GN!~k3e`!rRwpZM{(88X>=|R%q%LI^jZRDCN_@#Dsat+$$zH57=r$oEB8Yl* z1*LZ)lDr)37S#Ppz2%7}cEsme%?R$FSMF z#A%~Mn6;5yn}z^7AH}N4)CGW6<-Ga|4dy#p*E@t3S}Gid04mAyuG&~Vc~Dq6|2_k| z%7az=KX3Y6M-s(TpgugkM+;2)h%vAwt~cHV(fBs|-&(u>NAiP74e)wmc}}WDsz6R< z5=QxxDHV9~aof&I)%d>eZNK~*0e3fMlK5PDkn=`+(~kXKz8B5Wk!0`ip2p|k_tvrV zt{+!SXDbB}&iFIxJakD?9%)$p#=``v#JUvo`jC!!XF8S_ zI!u$gv8Tf~>feEW*6pKBZ{%#5*H{JUi}cn#Sk4`GozwoM$w>{Ne@|qFH>cU%2cS}!&ne9J)JJQ4Inn_b~f!^zYu zS2|+%S7sjcpIutn%ne&VSOTe?JE!XQC-! zr=ZXYjes{UsstBEYF=K?YF~>h>Z$Nm-CiZ)vFn7YS2?)10Z`%-aYuS?KlbC!MOUmM zh#3)ZsCAN9@-alUyj_+f2x#aiWarE-1Ni0hE(Yxs7)tn>A2;>;3F3K(d~yioM_Zzk zRyn}HGzeXcZ&xa%?8TSz>T&8o(4D3wbZQI5ttxYH&g0graE?UH%$+NGj3C*1XVr?_ z0##4_+~WaLY4i1U<%jgPl@J~yOR>cH{H}s|8xN=KnR2YICGvwRqLYnZrm?h*9Ut`I zbs@R<#gQUSbCuvh3`4qFSGJS9t3GyP<hdJt=MQDwjf zyl1#|GuruVHUvETXP-YT$L?eSs{-l;2(ywKxD11uyRchMu^(pFt&8R2hd*L^{!AN6 zw@YDqu<-Y?hcf8wLAdX=Lt2sv^2N4FZ9oe5rVT zkWg=t=@b=LzUB7@8`ebrv7LuC>oCb$N-T;aAA&8BN)&xlzmMgeA4ZTDwsCHzsZo0h zpQbV-d(fq~1MO~fUqQFp&3>u>knvs?(6jH6SgDpgUD?LJg&TgpnAbhPU=E6JQn>@$ z>{HG4sb+6gqcOsRSUkr}CE^Ti?q<&Ia&~)Nbd{e{J4okBY0|!nUwpX`33}>NV3ug!q&{Dv9 zXFtv$a(%c9EQvP(`!~jQcrd&&?ixy%I+W z%s}wrv+H_{&H|IxWHvq-{9uOK!BTH7`=zJ2zsq`(LmbQdrT?72BDsmRpJ;P;Lnp@M zEjRlevJ%<*$ZK|JbyffeD7JfsvPGhzEMl>$ojr9n!!aB8?oPWhaG;R|T%U6+)I%I5 z>jW8gDIc9LyCC-RI7-US?reJ=s_kkId8w?1VG$-;uRyg(SGOqX71|HBT5_&JxWPzhjAf`ho=!Gduvk9cN2g$26dfD~ z!xdq-Jg4V~0nt>Oe%Wl6A0=1ax&k+9UEgMn&JAcT2!5u>5uNr6!bDx3bU1&Dv0>sT zv~eaFv4ix#p1%CDom}JVm_F}2Rja;An1)-mCjgp9f!X(@54g_>MfZ`M0Zqnmcp@@0 z&-*)y>VgK00^k&`JAlH(7uud5nL|is z;DhwX1n{b>6rrEvM*prMY;p!xk zUq)S7lk!>+yXD5*jBmbFp;bn@8Kl_uMgZ_8mTGvvpSk3~?KCslZ$<t$_nze*`j|{cafRrZ9OX1(IDok550&)wjR7(|di;csn zEqfJZgBnueA5#=tt0Yo9q{cw>FNmCd&QEUi8;!1O)B*BhE#J-ko~4c8ne%NTfmEtN z0xjl7UON+}YOdoF^ssYS{vU^Lb{1hQOQiay7xJapKO8^3SRby^8tiEnj{Cbfz%T%w z=}bS)@!Wun^1kliNYBIG^?GnKQ))p7sCqD`pu`~w5iL*(nBW}Tl9jrz57I3`+J(R^ zZN!z(y(bGlm99brGMKSlgOw7~D3=GHV&QPWTpmD4dN&>-eE!ErB%X~#pp41th64EO zm2TfPF<0sAC*jViq*Jcr)+-q{4u}OH-Q3oD_ylVc$mX;Ehd>-_iB)#pRc{Kh?jPn> z8}x*+<@x=o3{v5|#Cg!dujaMTtqK3NZ(RA`E=*(t&-FMF8})?{wgZIhQ{->Wr{qAX zZzZIw)z$yqb?ms{@;*;T5>lUsMVIQ%L8-L96UYl)|?M)|(rv2yjTDi|oIa!ar@#S)f%S zrNm+^@|c0|%Lu@sq0;JerIq<=fMAu@!$X|bV$O$*>EL&(cgcdfkq-}wC4LfCdl8zu zZvNe$mEaPOn6uYTiLPEhWH=qRXZiT>2fvo4l6~0)e?28!KQ&H>c`ir|Ftzi%F_LWh zyCZy_%yN7>{Gv!2ca^iF?6n7PzZ+?#6-d=V>mUz zE%QvT{aZizrK~Y9@XXp-eyRnZN}20`$$AR3ShUPlLI#a!Lq2Xx-6 zTw(n$BZ1BX0#|V2p&whp%MZ4ucb@5#>m||1H}Fg$jW>=0Mc!ivO3yG*FIwcZ{o5+R z?Y#v0s!u?9f5wEAY`>B0WM-N}w`pp;Jpn`I!EV?;ykC^`4t!RxKj*zv^ePg@Y z_#FAEtMygWVpXiYEw>c#s#43HqnC(FQGC1%v>H@Z@OS@#fCs#H{8jH$70C)@Didj+ zKUXOjlgyGtec*HXjj&+H;moR|E21*nVTD ze+8N68cf8|+S(G&F2QRJcE9Gbtueb@ot4Cp&76AYuVXNu1uj}_cik|M;BwG##9>tXXRvmzLjfj0fM0{;E9zroO zU68OSX&P)d7|mcfzFo{T*=yqkIT8!uQ=FGI-zxI(>|o9@X>{IaJkY;&=S+rbJKUJb z!#j2wHr7z4cS|4Rz>f?y z!60arbb=pPigfnPPX>0zZMjs^rd&E_wvaalp>o~JJD z8h9KTYVs=kzVv1Cjm9;qL&^S!{W>ixoahSK7p?K@pAy-|^{|IvmEt?niG7egrS*kY zuJ`f1TQWci(x7YDVm9l03)d!H5p)~Aq^h7FMz!88`593oQ4k{9xAxiESIU@8 zI-t;eJBX=o*8bpfW*p@tA$V)i)5Dm#!&8?b zHT810ABf13gHdc)=OSQrjZkXG{Pz-QDg0!`j%Q!>YAx&tI#!p9??1qqzIASvImAH#XB!cUNh z@ud8<4~hpE$dTSg(Kx01bX84R+62;HP&785tJ+bzkoup%s(bnh6h?6}>yBuSt5tQQ zbFZT)!^y4D)A-lIK-X>aqR*KC6K$H&-reP;zM_h{Xo{(phCn$*p(}o(PRe~2s@DFk z{&Vw9hLa+-daAA4=bRv271ysG6^;K0(B692kPvUVL$d0&iLtioU&W!cIsa7) zAzJ1)iP1~kNky5N(9VsjO=~f(-dUd>1@WD1xL-vF8fVD9vZE)7R8mA{u|}4->u5-? zEf=Y%c>Avlx7rKb{-l>0w6YK&y8hfJbAFyZ@#AVD04g+ec5IhhS#C7gLVFClbnk&*lGZS zDe8-T#i!`_7}zJM;#MolXr_K{VU@2>XioIUY(n+6LKtt#JKZ_C@6hgwkk=@Z6vT79 zq!~Kl!E;FQz`HSMOR$ozEG(u2!t+R~&-rO-9bbw`-{N~8ge1Be=yO(KWeajboa+c%NXID*u8xj0>SWnT_D?^YVe z58p$Ku16Bei<4atS}HDDE%I8&%uGH5B#>TM#pRyAIcjV6I5k?M*b;p!M*5;y(J5t z4No(<7Z4P-c6;u)K3@i;%bf15gC{8iAH~fjiyr&~AgUGfQJ>sH<)Sqh5bsAL9TSiL z=B@IPrQcQ_LwHRNKvi8Jd{^ZiRm)qc!6(Jrz@L1p`JPg)hDCwRigkMAZ;8CvbU(IX zpmhYCFJ4n(fN7CMy46ND^_%a%9S@pnp1>|{PbmbplQs$4=eEc)LS%P!*KMM4UhDrJ z_x4{$Ym?0vt5{ab>nGTko+AXwN|Fl15BSkb{HH@DU)Z`RJQa!HA=9{WF>RMkM7~_& zwUGj(s*zaoqAIKK!wor<6wZ87w}QmHCs<|wygk1AgR8>^w8&1?KDRZ zw<>z3K3kj;g%KO6dROd|Kff$#Oi-d#eT6U=XlO-TUCYM^5141 z&z^J^JmWr27N#FOfj1ik&M0ccU2O?x)~MG|AnrFH{aA&IJbxJ{k#;?8 z$6@T=t>KeBX?mtn10r)Vf@iS^-R(( zCMw2iPwODbyTnRBUvviF!bv8j3cTOb<1g-Iougzrz7<4Em;a%7rvdsJ9Q5kg# zT0Fv!B1}6Z9Z&bgYARD$4e8;z+N6$Pp$;2@jPxh&&d3e#WL1#Q{)}>;H+L#FC$(P6 zS6cT-X7c%0rD^(3KVRFbRhT*Hu{B3>;3b@y$(k(oe}>Ndp9w#X<4NUPilp2}7m_RF zK1-2=BIM3}&VA1|r6_mEeIz-`vE27ouH~Hjm}3}*nVGSfjeY&{`2#+W&*T01d|vO@ z`}O3t>v+AVs3@K4=I-<53wHfv_$0f?=>-A^q|;ae*#LUT;#BXzZdHW zp`N@-%s&1-mYMAC^gsoCI7FMNyYBTmD`-V5&Cy!)VTHFhabWjq!<^jW%Ghfk&C_a? zYvu}KgKJ6L4IfW8bi1Li<;iJ3h@vITouyx6w4Fm9n(b!5mvT%!pBOu;%L2R2xGr7i zio?&(RR4-}uio1{S?^@$1k(6z3h@6t?trxm6NIrQJGGr-gLQ` z=}rhsBxgI5j;P3ZPM@FiM-y9xE6^{Mtl%K=w7)x4i{~@KxIE|r+nX~gBD2wxDiifwg>_;kn-^s9R8MT^A{(*J4ap?=j-iTv#Qvt0O zEDfbgxx#f803rRay%UHoO~GQ}#E?(EttshQFO;Sna@X&L$PYgPwx=g%0*M9q^O`%c ztsh}B4q*26rHwbAFFJM1h5Y%ddaaoLWnxyVNdR_rCe zjyhSD=eQPh%uJgeMIiWla9WS1v)_O0VJtU)oZ8uq?=t8Us`ZO!34H>1<|xLuyi4IE z(sTcw(?R$aM&R{SN$=;+zoH=g^5GwHB!cvfs!mxtVc z>>t$omnz>rv-hfgcW>p>H@4#Io@Uy5mpXSH3{Q}C({+Sd3c2)fonj3K4fknax9cb< z91z-LQ{{%?=Q?|VN%#!?jl%gnq#f|gC#B-C0kn}7xL>f(J%90sdb(8Y(=TLyK+C~b z1vrOG^pyi$ioli2(-zTtDm2hDo~~A1wUC1>1zq^?dU7H%IBl3mWbFqEf<_}fM){7E+D2NZNFdtrskAB3a(+%-$J!3T=?@rW0y^|?(K(wOOdKmRg> z`#l+-GRH9)rd{KrNrK^r!P&Plmd^0Tin7}3pH*H<8@pFaf>+b8|6oA|g;)7+!LDN#=Gy|=$Py4O7n&ov z+ps!J)P;EC2d`U?AvV{}S4B3E=6{aOo=eYv_Y2m`Q5-mN=VG&zZ9cj00S$alJ5Y%I#N6dRVb(z&{7d)?Pm!d67XlUtd`hyb*AZ z`Df!0(^88XO^VHR|JriApLncVzruRtvU|+mrY18MD&O_-JiYN~%s8^{#AI>qr}FC6 z;e59})r0My`}VJ&*~L_YJab21+uNVUBp`85#K)KO(83@{rN~%pyU(h7=GK`O4Z;58 zgGxG}+j^@rSi1b)6G;PGZa4*8TVH4oX$!&0|?BiE_ z2zCbNteLZ&3?9pYI^W8BRm%~Ue&dBp^Y#Z{FDbcf$qi)FpY)$l&QZ+M`F2Bp5P-5q z15vSBAKMjww5qq2y#Xq|y|vV&EMqMcuW;5=I??(2;}-WHA}JNo2Ytb_8Zs$}qUfow zyxRwj=LLNKlDHcAuiQ*t)vPQ`&tb3Na>@cI&?fmJ=e~S(B>@A^@-va%Xh`$FOH;BI zVRwhy+9&s%1^i`jN3@o7*eg`d1$^#N_x`GZ;Tr0jQXH>()-@lxLT?Qjuj0#&E&Ubc zrVlQvLREd_v*!LlGx`2#x%J*Zo!UoxNp)_u9zZAlEA|VsloG;t||)}#-bqfd$iOGRG6y3GgM^Q!rzWe+|SPK<@$vh zu9PNt^9c{YtN9ejYYR;94E%%*Z`YToj!}oI2ohEI z-uJ53T?~>KJ(vpm5$ZDuvszIm1V=>gR=tQ!I@Dc!(UBbP9fp>+@5*ZKl^t#VT_Uw? zfEw>_E?sVTr77Egt)7Zc>2Qgr6n_%FzW06}y#LaC7zNXTve5kFNloy%!;Md#8NV9^(FoK$D|Ze|O-J?hi^i|2o6$8rwpT6 zKmEm6Mk!ov!K<&kkh%IYQ)q_mXV_VI>{%F$AL~XE+NgwoWSeWA*?QS_@CJYmiYH@z z%#LdpW}k^J&CA$$|G|bp)e{Cy-5&03YvzW^6so9ZYV5;0PK0(6+q?aCTF) zB>da2Q(hQn8|I*&08jiU6!cAt*pswfH=~pM*p^fuEY|9~-nlcxYvtq>(_T`oT5EVH zdskXY;F7b^6zXltz8^SmLlKEBA&h5)22}J=QxNitd(M9{cdHkTy4=Jv!^71@+kQIk zkpICSwRlIP1y(p&w4dzNjhjs9CdIt@m+m&4VNS=aS~$p(j;o<88oEIa2&{qb%3IYZLEAljZ*9B)Y@@wGMby z#XJaXg+H5PsRnUSKtCt;I>(2J{_~Vuf0F$pBRaRO@BdU$PnB_trB8@c zeX?0XiI+%2<4se*nAxoPH$C5L_KwuhK(-yr8Mk`Bt9X{9N~5B*!UwuQ+zYnWk0HE& zaKdL7hm`CNz32q%!y(s%18)D5k8A_NNE#1&txPx7gA1viBR=xE!jMe6wqXk0%2Y)W z;0;e!jv3ti$8 z>#JU6*8Ljun;EsAZ(;$priQqpl73aKsW=I3#1g4Ikuc4Ez6p+J%rI$`vEbozR2dUQ znp~}0R}n7E?!pPnrN2KhLcMK4N;c^|qe(Y@lx2aqfqloq_Act-+;RxOjxab<>X~g^ z_$?l>8kYSKSz;cs_C|Gka&D%vm{ge>30Iwl@7w%z5JSnuRVgaEgrdfMtv|GE)Z>Kz z0NoCR?uPn#y#u=lz;{Ou(J)yDsqkeJRP(@)@$+NpL9aj{Do7m#bcaUJJV&4(x#IVO zrz8si^<6z5#FO5s1bhM>)ZxSHlWU}Pc}~?1AhD9uPiwuj>CUgJRthPl3;DbKo=%Ec zf#%gSji(;){RasxAxjf9=5n--Vw!!`r#ljVh}P{@6?^`(^U z77r?8xC3f;&FxJt`O7ObT@k*0@-E2uS+9TCW*Xu09{Hpy1UM5^qdF}1o z9d(t8LHhY&7KDaeRvEjZ6@Hs%H~c?(2=96z?=JX1G;QCRda))0JoyV;YtEgdbtWs= zCdw`NOI1!i-1p!5yV}`KmkW8*?Al@)4QjQCG5&=tS&L6ynjXq7)W?G{=J)w$cb^Yd9=&&mpGY`Onb}ytJXY1Iyn|E&D@gD4-<#j6$V0)82%bn#uSJQ&Im zsyvOPvx=g6st$WLNh%9T?a%Q;YsnVhG7Wwb?5-{ls98W?TW6qu<3QFbNAD#EyZdL5 zRhkn!eKbY*oVW1BeQZ|NDzD940vN)9=U(Tv{Vqk(Uu$*(SC2N27XK6xjlcetveFNH zPG_#7f!p$F$|%}hl9s68$JYLzpf6Ilxh-Bg;oOk2>u3lq>zSPvF9CKD)b`Cz@ev9N zs=l{pwB+R!J&7){U(3{ezEcekUhk;9+lqJvnl5_E2;d)ogpv#67ME`2i9GxlFwKHJ)KTbc34Z zN)E>=5foJWj}t+Yx@yS30#fud>%xQHyH9pA*jH%3Dlar6NtVz^FY#p+myo@o%+ygk zKHproydk@#Wf2}kp-~etG9syG5Pu=RIkB-qB{lzDld$sQZsNmn>{w`RuCsD4vgX2Z zMKcBe;t5nwLQ?OgWO>~)-a^Env3~vsInB*;9+$0qe|)hwhQ{p#Qn@yPS?2$eJe;)ub0Nc!{o!INkz7jw92~a z@3wqOf&ggHU+dSQPM?TuDWgY!*ulphn{(bQRcj1Oi|NVTp&VOh#YK%M48cJN)`Ob! zgp`x5-65a+>5Aa#U#c@o1Jc^IiL}xdA!LapyGB{zo;nyJazdHmSciu5<2T>(u;+iK z6#BN%u_lFovov$$G}gucu=|}@{K1(HvQsVU(HDfKE@JhCo8HGr=Ee~^p2I#QTP^VE z`L6tSV;AoZ*#0iNonruHsJ|mGf0&Gp(}yy^i9K9?hGQo~s_)WS zKFh0>^5uV5Ka8y(eUjOv;zJ)L_A2mXTCOC%(TPWg-m{;7u7P!ooK`ukj$dQl$jJY! z*}_T$9HN7{ar|v~rFzqCc>nHh6Hi%oN-QKk_<)azAdu}w#G-$BVSkMsx?knZ%HK()Pe5a+IpJTTtW4A8%2S7$XmPi@2K@+v^&;9fqzNwd%LB zdp2g=4-4++$GP9z#R*hK^X{M5fxP(ymbURC`qP{mo00=}-F9@coMpLujTKe1u4=3b zp|s4i)RvSKxFl#A?S!Wz(@>^lyKWNXYy?HB9XMWcD5Orv3y*R75crQk9Q0bZT)Z_V zwqAGaF~WB6G=e?+_H-KQyg#6-meHm$VHxXF)3%O6MNs8yW5J&3y^_LDH;f zE=#bx&N9=F+sM-u+LIT6Cpfpmt;(vHkVS$6~9)ZL*s1>c!Aj+n!y?dm0VlWr)V;BKso zF}M~RuEO)*p^sOOIg`bxcMg*E{-B|`zRfH2SvkcqNq{8GiVm})*l1pf&iohW{bQ2jZbmNKPA?P2i$*<=PNm;-5N~c z%*`nZRzwDywi=jp96p8R=($2Yylf$JiLh9fH3ca#zCPWEQDWRXe(*EzBh2UG!A@d{ zt5|dWpy%kx-oJ9LoA{baEVj4&HPL%=>~9)55i#Hj^!hm&7lwQ_3Yw?&YIw75NwUQI z66{?X?%C{c?6*X#p53qk7E|{$M}07PudAM}*SPsuPRAKbL*;p$|C=7ZKo>y3&*c@- z(2`b41c|*>D;^?jm@M` zld^M?Wnh)Led>)md?c@P`HgR&;|5pU9lUi)J?dTFH0@CuidcQ#o8kZ-W%;yF!&=un z4yrQU0T#nk4k?ck7Fxn~_P)7zr&nm`3A62jXMwvzvTeQ1NRBEuH%#@XfK?%A*2hjh z5Xr3A_d20N%k{8U@G|bi&MO?OWxY{OW1=wc@F-et@?&Bw8v2`R-u{72CpK+aO1~WH z;v5l*r`UdCAiKgsCamqM3HGiJ9mL${kw%?a)2NvcsajA}y_EAvruBFRrO1vN>{}_P z;Gk3uVN-6)3;SXYTPvPCYfS#GQ8p2)!zzZkV$6;9e2kbm>0%U9| zvKqdH?b+v_$Qs&~Zw~SP-1FnatpjiBZ1j4ow42IKwj9t%tQLIOk^^fKU6X$cx_C5| zg@8Yh>HGUlx7D}HMns4XTlY@Emeze6I<^N+@euMtg%9qn-QK=rl{xV7NEucoJaS9z z8FVj@UUh6!*5QqFq_)~Q2n{?a^m}75R55Bf*^2xH4w^Z_^{rhkSR&MC$ayBKYdJlgabw zGWrANZ&j8{E7~bCy$v0W4BvWv5>I3(7h3&loq!WFpiw3Z{nf1C0VSXN3Fh?1Z@GUV zU9G3dfi3=S*rR~NUJ*bGlWqgVId)5`m8;$TwQ|q#di^^ELy0hZxqc9S5dk{nexed< z1KV;TCmPxJ-$NvCRRJ>S%__=nfWxY0H)j#Q-*W-Fce91tZuhf4NO?6tdXb`ZvncYO z7rU*2nurp6CJV{VvxW3?Kwis_CH&xd2UPTESfJX4)lZ6d%`(8BO}vMvFQzZ-+^_r~ zndUGB8)J!T=^_oV3jO-x2>HN7wR2n=&+@jQ;x6E4u&7e_(Y2{ZmvOiD81cUnrWke5 zG}QIwCbUj}INzV-y0?wY-D=e>fyHzcwslshJQrnv>Z~^6iGloUy)v!S6p-qUd^q>+ z`LdzQNpP$Lc9|la=%-%MkZ1et;0zB>(h*{wRUa-I>GMWQt2^Fq$hv6<$+c95tk^+3 ztxw&%iwh=5)(8OeVqYbIbde%Ee$cljK~U=;g6kTL_C8?KgiLPvsxf3E7N`~&&>Rtv z&RK-0>>*i9{G3!Ftu+g%T1XIn?etm4YUg;1!JzW)bv+*6o7UXYUL}c8XkE*pW08{Z z50bmyKPO#E!AEU;B#W0wdl68fHu&+p^P!8+iNV?S>~|r$6LJg_@{{_gQ4vL$kFaCs z6!H^YDKV~YChs#@?`R6qdIWl~Z$_TXfdmFt<&UF{;cK6U^;X;NYCONU6I`*_WLCqc zj-D?;ry13NEufncpB>hswoElOjSErRYQg}H6UFPys~*rg zk$agK<@>d*vjgfkeB91LM;yqP(jr9PaMzjvBfnKCKu=XBNcf>iN#29{mhxb9nZ{HB z>_!Q^=3c0tNrOb_2>9XTMiKHe76C9;{Wp5&s7~x#VWq_&fwrJVbm@*v3E7e`6fzs*Ic<*#&T`aKH;b*TY^=~Ng>z=Wspah5ScdQj zwRj;l*Xj;mUW;Y1oDc7m3I(2M_c+;0Y?%(Dqv4VMYj52g7ZL$ zclGJ*V+YC6x;XYC!42Mq<6nJ2UyzW9^r@$bnzW3Mf0(`CzF;pWNXi6outB zOdYnqZI^SSP)E2{xHA%ZUCZk#xKWQ`4F2a#`#i-tC%h!scBVo!TkwGe+%e#xn2Jo!e-26eFFKk%v`UBmPGlebvK`dmpaCq%i` z6q-4qT8Rd$BLTy1t`yUgPV`Y2tyyx*SjfCWUo}nrhx*P4Y^|!_a>Y^1j5Il5({_Wl zgyTF4hvqmEFSmJC838Y#zZOXzf|uUJ|6Qb58(kFAN~&p(L;vP0SS+kGzcuU&3X1(9UfQdz zoOJf1cFTus2flPk&&{S4)oqqnA1)u|j~vaE2wd0MK;RTg;k64Tc|0~sbHOiQX}R2+ z?cw#&&0{>6RF>+3{fxplKWFhfzRo@ax(@@u{HDfVZeB~GuwSUfyR7`go>On=M%jXT1Leckw~Oc* zDtz(-=@qXUKX$EH_4@%JBel9j^8Gb>8YuPTl^*8()LJPAv@~I$nX~`+g}%SW&TO2U zlnFow^)Gzbst4!~J{mo=KLa;ld8puu3?LLi^%cJTYdh*Om}#Yt_iex`w_d6US#ULU zxo{-IIgxF_sY7Z`pSa9&;i(FV$UJW;CnCeG);5%E-3J}+O_Tg~3P@Km3KX9Cu6vy( zcl)N0y}gq{s+*8YfJpd4<}NL>tj94>)<;H|Grof#KPbwdoPDI|mYbFz&LeYp%fD3r z&{kY6sAbbRa=oB*Wq)qq@;pW{C}NkNnET{5F$16=~S^t9(MeAwRq;YfKU7EYuEKZ@{<+2!Z3>zTi881B)CCje+YPax{Lu0b?aqKfi4I9v3BTa z$2awAp(-n4y0GM%D}E`s*k)% zkYLU;aHy~saqdx+m=TJH7;S%f4}%d(nW1<(y-6YaW5 zx8|JorS4~iln59UFpRsygTu@33WibsTOA}?HghXCf0cbm&|&N{7V0Wp5>`%H+_7so zS#NPH5O{`^KI+q=l``HQ8NyL8`vE%$DV(*%7P>3E#ManJ;F7i6r2tG01Ly}k0sGGe zAnmwI(B(LXPhv2lXh)SGe?0aD-cs7LdmsU;tH=`b=HLglZ_`m7X{MRuYNGKW$gAc7RwO*I$M)3~fLY>D}V!Q?pPJWC& z-VvGWZn)jH6ys3gRcp|2xy5y-hh&TeYxigc51 zjgM5mre@P=3x}b+h7O?eqbJ~weNWPxygB`VPSLYMzFY#zW04vM z4Zof)V~rIwRi`dN{MyC62)wL|f!Zp(Sz23{-_4!ajxacg4|}bW8*t!y7H6f|Q{-!% zBG&=@j#r~a5+pich@GWX&1|lI>SLEy5~OJ{Ih=4$9;EoChRr$bG;+Ehm!Nz$^TTBr|DA*Iawi zd(Gzh0EE%JF)TXyfRB}iv@xHDd~_=uBYVz+nsX$~<3(WYT+ms2nka!b3T3<$yyPZ~PznutbLHYNBzljW<~v%b z{l+jmqv4+l*{%E}-Vt9$F+tuOMM*0R`L}MM zlF)$9ihbK`9Qc%ud@;fZFO3gi>q}Dx%Xkn7(vi~z3R(P-(;fN)$ltfh3+KOFKHUq2 z2XtB{`;C$0{d0s&`=8O&Eq&HaoY6&yDMyt`O7`1h#F}u1w*d?n5Db0&B5I4P^3~4o zbmzdS#SP!jy~z=ZUOR~b9&%1eU;*)?za4NlrxVQ&B;*Bp@!yTuVy#=p_Zm;+tr$Y< zPYGpte-1Ygb&bfJlzag2;eWpGS@OVVtDD}yX&{>t=s?i z3Td~t@v(tExUIH(uY+`w>(oQA6+7xV2(^f(GUwv%Ff^xSy(XGlU*gTDv0=;FpUL50 z?Aqp`4Z3jQ=hi+4@2ocWC)|h&zDA9C!t)YS@R41)&2dtBfr67(ghEKNYl6@&c*ns$ zx&f?8`ZG8rthI>j(8GU|YU3LO*D?dvg2vhHUK){0H@Vz~1uiA9c(=are<52;`H`J& zAAtjCtzU^sa8Ik?|J#xMOORvBwt%tCagyNPeot$4w{X7I$ROwrn2^f zo~oJI|K?U$aHKKx`8{OT2x0Tf$=0{2pUEz$Enb}=)Z<7k0CHXr7+BR~Hx}A8f0m_o zrKsUM!$p_jk-Xj2ic*~3TT<`Wa7w3OyB*z%kF^3TeXamf*%mox8$IM5hWGMWN1DV% z5%WnH>~lcj-UniIYR4y?ANJ`KOhXQ2cF;q(nVUc}iC%l#LNckaR_2S}K=|}L_MV1y zU)g+ChUM!}@&X2S(9_3rzm9u6ji3Dr%&w3qp_FX{sR;^ypyT{QCu@#a^^@*IS7o}P zWwpf4=lvSB?gj7&P2tbx_;|nYA(J}h;Q&Ivoi>DXPLm_ZjIdpTV%@=Z3u@(9GXV%g2#k2$v45fm0DF7A zk&#K@xPl{oT!L_}FJCEKV+b!IdDcn;__?PRe^hG*rY0V{xqtc!Vw{}^K5AhC__r^9 zKhY?9a~?G=U)vzcy7##8d`l^H_`Lskg}Ya&X7jhfVa_8#e4+e)TS(uNiR3~9;Y(7L zYdH!_Czxo=1>Ex&O|Aw@K##7H$RUjef(GAyL$5pifm8Z`6jIL+14F&ahz2_e5N%EwG^-QZMp8pT(($Wds4> zk18CHW%JcLSZFEmjhNebW}l1aoei^Dg$P(gmc`oUsoB7VcL9Px71FD!TW62Q_(hwO z!~Z+vuU0{ES{+n_`<|$^C5XbN-pX}XFPGbGORq%-z?PmD`wn&t%^>rjzEyn>jfZNE zE@xK&s_;x2gOy(^)t`oJSQQ6Km^ppiFKF;^Eqej~aZGaD^gGD{hG||=wnuA!yRxbY z!a0Hn;HB=_L$u6TBjjVad^4m`4{ZRHbXwT-eI}0NMN%rr7=nT;E!`OQq~>|j^wg8^ z@9Y*T0D9vX(z7b~;zAK00 zvblG5!rNbZT+P<|eDGlfHI<+66rxabQxkfI&)mvx`iY<6X6bzM9`yEe%Z(@`ML~fg zu1jLtry&MgF65~T`!TJKSngrkoBFmC&E*TNTZlG$Cs}kM%~(m?mELsPY~OfMp{mQ# zZ-TGQG5=^mKqq%()wP~`HM+ht7BCsRYgFs7Vesp7)9SCkKA~v5_G91N;9hmQ36ocP zcpyI|MWO7LG13|vHZD}v9|Hda{W_o9nbl!ZSr}Ye@p>clP6U)TEL!m>-^zm)aon-k zJ99hhMt9DL>j3d0!nMQE)6vR$K66i7F=s#S3HStTuR~@!{}u5FA)E;sH)Pu&4P?JR zW@9=Gzk5QLBKbQ#5MCAQK&5qqRI3XjKd+%NAq28j^ui|HH?ra3-j!fh_cV>kWHH=# zC-uw^qYVBjRXcb&57n* zZ?b`Z*mIb(0BI{+nTa)1=<$!#a`_qeRhZ+MT>p3fA!2XpGxCB(nz1zmN^*=W zww4pzyo6^`CzvO_f>g<*jJGTh^N8ZZ8OMS({iKXTagO}*74iYpkE8SXLi&Yro!@= zk@8sUg+MJWe~ozBi^!pSTTVY53Nl7}JH002vn#TLl7fvbIo;rqhIP-q(Xu$*2G>fL zD@RX~C#U!7V}mx%_W%wXW-NS=hyI3l^|q&EpLSu1QW~|0mv9jn1vg`x%QgAF3~YBJ ze(RcAfti=TTYZHIWYhJE(7#1)*)k%BC}tms2EOy|g@u&+AjtabUdI=_bT(%YF2dF~ zmWAOTF%xX9pqFq)%$7c}!0&Swb|W zRn5!%ceQ2PmOuC2{>$~E$T5@OFwstTf&Ejn;9Mvr(2dFcMxK?>q8JNPtp>=Qv5 zK6Q8jn^{X`R)~vE-PYrkDfqP7#f)jxtvFuf*!Uu2<3%f{BRRYNp@utbOftSyX(@G zclmbvoDBcI@os{e8OyO%&q&zZBm0-wZ1_Ss(QR-_wNFQ@w=M)x9PY2+_+G_>v@Zk? zKMyA)^83vjCmJU(-(p|U3|YaF1Nbwcjsm`w$!A+-QM;5bX*mtsg(cNtsoxzO$V9d01H{4+{t!;`R*l!Ov+OBVl$&v2>aQ` zt3ms$AAm|Iy9Viy`mXKUutM7X@8CmC@Z20fkAbSSGlDrISpw3XrCaoE^Z9ioWB!Tor?;GlxSd^y-8o4b$nHwBN;6S=hW(}oxD z%@0whuXnyR8RtEhzvuimKboXHMLl73RK8G!-S*g3#>a3bCc6jT8z-13C6uc!NWRR$8%9n*!%A7lrGKD`?+EiPlELq1<~ z_~Vu^G$%_G@r3_coSP#c+Go97(<)f3LJFPLMOy+T!FmS4K;M!D63irxXi?K!?L3WO zZrwtp?*7^kK~(Yk-FG_R(JKKxEt>yJ-2!}ac69S{0Aa7CndS-DxWSCqhdj#b^NfPA zeRgIpAs;V*oT|KeynpHlTYHSyeSz|?u5wi|xZoDhsqMHqW}&^X2c^S1BDpSJCB&Ok z(}^C5;To$AXXo^wVa${>4JK2$&MF3lUDVj-3;mK)2~M!nISJ`&aU?Geuv)g{lG8^* zT(~7{cyARN8~K~@dQ@Zc(c~h#C|c#1mTs7ZIk+|ZT2Sf}FWCGZZ{|8$An`5%j$f=NK2pzkyTw;{>yEpask|WN4Y)w2+V8 z)JT^%01RV=Z!GVh3;6CSHRw?lN; z4!&!FEd)e{FkAW5GAt~xh^=unVVV;`wptrsizvHHf-0Y|BoLHj+2MbI_W4|soKBkd zr%`evI@`#H{1#gXEiiP=QB*j~(uD}~0Tp#z-QB#udDVmS_qBd49om|X?+o89!*6e! zuvKrobI|_WRK_)n6s=WZyUEpB3BW7SQOV1JWTpByAhY(E{uY)=FL2*h=6mCb{5o+c|*Q zWRc?c5bArZxX;)!bTya(cZv=Mb@=5Rkt;pZBsOCmgu@8GJljIGuqCJ!Hn#Gqn6%Nh z1l_;_BlcBdtaIHwH!5`H3w`&o;g9IUhJ{n-+Q4V`luXvZ*7)86r~Mdu;VLrWC&Njb z)9w~XM(JBVRbwq9J`<*X)K+kdomqpSS%9|o35P8d=pgMSei(ld;~vr2q59P-g`Hvs z*(U1_^9!o|3{677ck+$n_cls4Iz@Z%0xu<(xIYwEcqV4Hb$qJ51GHNS-}adl+@t$I zm>7;Y{LATyoS}?bnd7tiLz9}D_4}u3-v=R^zYD;4^Q4D+94nVVdbARI25fLY^Ej0N zdCz*?DiKK|vU60!!p8oK{b?Lo+#6JiS6HtI2Bv$om5YyD zylb6Orhd~hrFLH9FG?z%xo^V5sTdG*K>y`gnZZZp2(;1~wo=L>aNmp$`F3pdag<+d zKpdeA2%osv+$)@Nd9Ri%)XGy9)f<|}GaA}|^R!yU4^l$|=bg3tV+NHF%+9Mf_R?>BJlY^clg!qrN6rT7wT}eT0ZDrZLRzZYSRAz2 z+w5kt>5j%duyuLi2lWi<+~-0Y-@z;YGJqFV*wUL$-ZS#wll9c0wauv}E5M&belVnH zaC5PY1T;}pL=z7!ZzSG<1KWDP5L~?Jrc8Jj{-okM1+y%B6#;}#-&nUyb+nmyu2L`W z`VO=7!cV>fTE&{LgO-^@mOtynX@=lnnUq}&u>AJQLDBY($2|lJ-DFJ}5nTsp39wer zCR-R+LZ}KsFO^9)90J+@6kBDo#&<4m*vncbV4g(`Gc;~S^rAd}7`Azx1-)ym3ez0A za_|;aB4Bv`+q>`xzYZ#Y#yw%BgqtOFnBJVpX|qJoZY9a$Nu$ zscM*kncEx)BP)%ZHr}|Rv5v{l>im(vBI3CR#<}HRMebUUSsvQ$i4D*GT$Dz8s>`~` z?2_|5D=Ib@-(h?o$N=klh?P-;;gUdI3-xv>AhuP9u9xg zuazI+_CoIF@zN1~e8%VE6p?wwFnQoYM)7Q1ok%`e7O5_zA)PwwC_)Xeei3$vc?*gV z9>Fj{93PKbOmeUM2hg+Q2I3zmk4V92Z3$Hf^u>FjjMC1j^}!FeZC5el<}M+Ds0;Tp zJASoi`u>aU@pT7$-XA(nox3LwY)SOmIgc+32;g^dOp+-$#(cmBhMwHq8$+$MVxG}o zF7(riW@5l)LSy1d7xzz;vY<_qTl4L5U7iFy;kQ5#NU%{%v5eo;O}r`6chyXacP_25 zcz)}$zdb+BR+hY__Ki98VK!q$YF3R3ScDzh7(USoVF|Q!SK384+Y_z#(^4Uk){)to z{bjp(BAukiYJ->73B3_v2me*1(S$dqZ@3qFJ_IENVNBm?z|4Xp%jJcr{0g%P9W zwQu~Udzlt*Y|D`XGQhwoM=)=f0fQZy|I%wu%s;XtbK$N`q*E>Nep%W-_!C%=Q|Brz zMQeSZb&q47bOuE+v*vAITFo%JxyM2%FGRa{o;$cMZC7M^ezZC zq|l8t_E%3O!?0S(2S_Wm!X{;ZR3CYOdpbIJykh=lQd7n%&4k{%X0;UQ_d;_bg&|$- zfKrA_XD5=Mp;W`rQiCjiK{sxQ8h~!Vk0q-Coi?CLcuZC_A)e55O-##|{t@EqT+HLQ zGNSa(>!3_G=yTC&N1-u+F!Q8^6RGu0*>rD2DpiLHpT5q#wI(x+%#E_fxHc_yKu7IU zYEclH*f+OZaCU4o*<}nU=Jeu{d!zG!VqZZzf+fp1qIObR^~^l|<7#x?yuiO#U^YdE zM6hE{)y0)9)&8zD?@9}^H=0&^>RRm3xM}L40a-)TergfsQryjv63={rwM<>#WjWG=>q{3GVE_5wgaNe+E{#?Y2e- z8*?MMoHkpP>h}3570a4LWpMez-dAW=63o%hBE&&pu97^+B|x}P;KSl=`HpO|ktXux z_?DPfX7=U3R1C^RpgZo#4`}Q|*vlQV*YH9tyVa{ZR%>{ll9kB=*D_p1vU9oBKD7dm zLYsP^H>?sI)K=r;8Pa>QCl`<{=`H@_=54F}eW%Mo0Oo+gBnGzdJc)MePvj1)<{j@m z{AmGw*b!u&ONFYyrzf&H{!vAq89*;jfzt3A*a*u+O?WclJe&Pz3Vrk0oIIHE#at$} zVc^$C>w>1=jfohkefE{3ez`O$`(pHYys3NUxrn}Z6;3r;GJitbr&oPYQ+ZWBf5HSn zAmjWGA+o57?_ivijYr zm+u=pX*`}F@iSqQsT3(oZfzS{Pba>Zx0sA3UE8xA*}FDU?&XK)!+*K^-ZaEn+Gq#u zXmEt1{8v)~*nO+3Vh8f3@@8NU4DErLL>l0%I%7RzKxUcj(&&L!WdfDs6Ubhzhk=FB z4MUD1suRAUMr~WS*K#VGT5tUfODFsfqCj20xfbuenfa`yTfCM7<+*VAM|v&C>_I%k zIVF9)v$(}2jRk#nkUF%_2XJq?Gm8IN+-Cnd_1Lj^~o)gx~YSnj+ zbp?CYbT8w-m`@?Rw_o=^1Z4DskXvHF zix%eBf0rej#~>s_{%s4Gy$8W+xY>%G0bf)_);F4eWM44 zmFxd&3Db#o%7*8lLbZNkMi-dl&hKqyjNZ#rj0She_rshS9jAbw;+>!DwCkP@GB5cw z)%2?`GvK;$$BMuBF5uxQ7GIMQukv$C8h=o8%e@9;c<(y2>)LGJ+d2Z?JJxB}{d)`h zJsZ#OoML;izJuR=%J&=a!l{SS?^@Bd4$-C&+?$$Wb%$fZExx;(&k)aQsgGjD-;sU; z#*Wo>`Cy6n{=KXL%y+o@Gvt?|iJbTOy#_1r-c6z%b$)-S-n%wrPv4lA*~j~=m4AWsbfI$PdwR-vja4P~u8uyV8|(3|k{R~RF~Jzt!ul2F zt99#3>&(S`Xnbo`pXW#Q76-xaOsY;*gJ>l8>>jK)`-We;<6TkCPx6KJ!Vk}%$HKKV zCx0!uz2)N1>)Y(!AJ#|q!}}>~_8Q!e`?m|f&d|O9mwRQ{eB^QEGjPYOw+h%mz_)KW zAr`xV@~mRj{Wv?GA^O(GeVAy!RcSSD$VWP+ST0=hkdlCJacr;ESaV*Z;jxzsYQ+<%JF=FPyQcZ!`r%&g-MD`3MC(uT6ZMA@t^e^;O#bVTY(SneqWeSq z8VlsNa2*xCzc0X#+&YqcNZDvDpNX;R!m#|9xJ4e>(rfS>XirA+SWB?yw3g6Mm_3hgU^RT zAL;_j-$XgFq0#6KZIvAjmiJ){-#25S@x^w?4ci+H=UY5Kl+3wa^5#a>cu4datt`Pk zC5)!+hcWiWA|pVxq}~ zYluATcGfJ!SUr|7xJGpjZk7z@a=36WQn|@tH%caI01mDY4=beQG0~{?0lyCABEJUC z2yoczO`i8&+-p4lF5KVVX>qK_Yp+?0`fw09G16y18P6S$;24k~T!(o<+Xr~6@X6hrjdX*GG9S`zrmB3|8oPJICrt|0kH8SmfMm! zu$Yf+eJq-rF|X$-KR9uoZQrqWz1P#sM1d>|SkZ2C`g61=NuHgL@maCL=r{Fd&W(%Z z5q+o3@}~yTR*ft5r*_=ezQT9~aqRgr?LS>Bn?t+h>7?D^alo(eyB!#l9r)kZ`Ycz# z=nB~>v?d>jS>AHWSgg-%JtVPWHsF1412$Ay>+)BE4s7hR zoL83~Yrh$jt%rT(|2DQqa(zywr+iPjeubW$h~#^YO>QlBY!}W3&}KYjN4;{n1U4SZ(__+y57gWKRk!aO z@0`{b(b$cW_5A#EjFtg^u09cTM{>k9)QL;1PWsw_FKiV4Z1nh3fHxj@UI0x`K=v&M z4SfA*+xyhcJt3f(oBFM$%KndHJZ77%zoE+HZqCJQJnu&h`8ut)xsJ6*?_tc;j}peB znY()*o;@4i{_@c#kF|jgzldvd@q;@79Un1W^8BRv3s+!VzKmzr;T^xA%@Od685$>y z$-2ILe#iIyxXi|-1bw|4zgaj#Yq8zNX@wtC^2!q;+i;22B5OAC*>QeXqgtLXwDwMX z=VGkm6rNW}8z|Sr)u!8yd3_i6+=26jfK7lZyldSF=Cc?P9bTD;cxzJprb~8^(NN~* zT02&AE4iEB7t?y;9=4Yo4Ohnt*M;PDzb+E8fijoZCuJ92jCC=;%+>?xhWj62xWasD zCy4eR95&hHI`r>ggT=rfl-zNUeZ@Bpo@nchJpKWnBmWifxv!#In=FUn3bcE0-jDVK zC@Y@^to%wW_8+%^7q2$GWA~Ak+hA-s(Baz;rHzGapK{W*Ws&|9YtNtinAe*CR}UI) zTwNB;KV?zQCHF>+0q@6vr){%MXLQ%l&IF7BPiNx#UuActY~EXG<2kN6W<2J#D*+d) z?PdMA60^7WDOYV@U*u0%-=05rPSz?jy!PL=aoFm&l0I;+QMlGO7TmW&e5Ovg?Y=K- zbe%Z5822w0elNncGckuxU_C8rw|V?knPOV;|4+`ay#s82zEE~8z&5<^BaJ2t-7lGl zapZlXiIlI`NhM#}xVuM;6 zYulswPaJD_;d3p_6HOdj8|m79F1W6T)sB5Ywe)6Kos>rt5kIAV^ui3|Pvb{gTwHFQ zEHwYXAfbqVU`%=l`G?beWvg2+-a#FBOt!j0IcF?pd#A<%J3&l*b+*Qcg34HdUeLri zIN)~{`cMyGsKVM)CRrb7bN<&Umg9su+#Uf=Us7r~=M1=S25Aokj8TOI%Jz} z5>3An^K_x~tYO(qIj0@6O}m&Az$sayf$u^ezdU1Nea_QX9#j7~V*#$sGMqn1+dzYj zKj{%;R;fqE#1|6pviu4j z7T)*!2HU^H)}8m+|9+3LN}QlQ8)f!B`d4OWwH9U=Zy%o#*iST{D^3XLGupLl4e!^A z*S(DSn%x-5yM^~1rTbQ|F?;A|2h3OQauA}u6!O*BX=Woi_z}zVdr-13+Xb|j9c_DU zX*VN0Jjrm0c*8h~Vc^aAY1>mvSzz4ruB)x)-WWc12Wz;`xA%;r4|RY`082g$TbUfoguK?z#}46Xj&EWfHwx#+HLj$?7f!?ZRPcZ4xW7RA#i`OO z>#ZK_@HFX`ajQSPNIsZ@+{*^}<~7JWoAB({ApdMS!P*gAKZxt?kb5?L&SFFMO|ktt z%o$Hzj(m(V*8Pl!75$lWs_9v8O6GoZh1nc9KIGTAx#=^!@%U5hJ9BurHZyjb?MCU_p4Ltm-f?`|M5Ec?g}C>B z&#-U&chV@{x4>xnxa10c>)_XaHA@5|%?Uc9T zz9!}GJWKF7!TGx0>)Y}}bMJzB#r)mE@ePHa5!nP zRjw_!HQ1Ci;I*@AbWe%F`6ZIE>qNt*nZ0*B8QsUcq-VX;yQ*wWWfM^z@$APi-;nhN zu@0XG4qOg61vILs(d@oGJqE04-{bRl)S0iH`+yi9!?=_kq?y3omvDT&a!ZY=4Uc_J zg?{nCSG7;-4BF{{cPCWaUNT;1-hbwbsY_b!+ST}9GidUUe-p)rx^Wn{_@IN5%@=f8 zE@__o*5x4u+*%RI6ldWZp8-C94)pGG%2zxro0)H!_r4)xeQHq6USHelvaH4Y_o#NV zJ7&GqHL~T$%?{V3+G)?wR*&N=SPyVea5?zTLcl3F z?isYX>$yPlleKnS-`Avias0ls7$1po{2a#k{4&`M%T1PgNJNH6M#CCA_xLf0=UnF3kJ=v9OXhd7wgL0Q z6S8yh``Hm(2I!e<5MPhWu?XA!rbOVE%gQtR_*9KTccg z);DnV)>2zX?9VfNH}L#(f_<`~JK4qeS8K8Xc+_wWjsb%$f^p$A@Vn<&t2L5`)AMC} zY>#Tf#}bj2eq~mytlb{XR$wkAqeqW+(uFcjPWvcZB z$GLTzvbE3o-%%Oxp~7{`m?Y*sKTked`YzKJQ~l4l?;?EvO#0AUZN6Ky7sls_+CRl| zBe+=STJdbH1QUV=Fy9;a;`UEXf~8v5_Dz@HxI)DO0ce@nI`eRgtCDtK?)@bQ0=CI`8G267O2 zDq~k0hOG`VYsxqr!L`e=c24QET$G$o+K))jdorR~P0^Zh{3vboh_V;o4fS9`n&H+$ zx%HKO&hcvU>FS7&jTP`Q$A_?XH&qx-9d9?8mNh9^qww-t(Hg}k(5^yY4PNqYGLS6z z_oi|2deQK~0RzYH2Mn^|F(CGdm~%vCSKHp5h8uAFU$}3%co`VgWh?d0ajU11dw;Fv zJZn)+mLH3c$9i+Gdj zzj5paC6f-~_;P&XDV3UA$XGo`0iYjep?mgR643U7@nIezr!!K9J_hgdG>C~bpd^le zL-O3XWZ=1a=lAffcj4KeFmUe#uJ`;4j$g#L_D3=j^KY_t4rO0gyA{vB4A&l%+6D#?LohuSGIB>nV}06Gt76Nd915pdQI4J^r}eWCBMoN^IRaysR<(_ZiX{ z$nu{fJ`yiMKOUMU+avHGgY}YP-7nRDz8meFgu%aNElw_j_M7sjX8_;Kiidcexyxh} z2VI)iY(QrU#+UorIyj-G4oqJ_<7kC)azF zybkLF{}cN0PiSfC_%p`%l1b(VJ5P2qvJS_4#CJBS#*UYl+5TIX;u+EI#29Q740qX> zBr#8K(Vt#s-+x-d;w(cO8SP^?R;W&l>|z{C*0y0St}JlzlZ!P@xaVIp);Ip96?Ch$ z(Z=$;K9e7vOfk*q_&8|9({BieF&CGiPY*sSyn}q+v&8HnlmWTvpEa=;Gn5kjAHr`x zO2F|)aqXkvJs-vVFB7m%Ipe%|4;?zrrZ6U(!VZkjMgUt}`yF#opF0F;U` zDi#kJZM+q0>%$oPooKH_dot$r-^$F^#Mpnd}eEZLvZLPSv>yrz{ zwk&^KUEVs{GN41Xy$ipaZndPD6S!@@t)deWvax1J+9YX|EZm+`9*ZcV{De)n$~&ua$p7jcVt#qk=RWchbaR?VG% zQ>-#$q#0Z3$IH>;YLne=t+w&J4>G`gyoY#sq~)I>uAYB{*$vyuMWyv+d!0-P1-Nx#n3zbX@EGZs5e-Ew=8ziT0Zrqgm%+jI$rX`cFrA zack1@Z16iy#`oNZ?|QHJY}+LHK)9B0ysuVtM(^a@d~zw?*=X!8bKYVD(xUS& zwp?xWN>xHYSdrlc6Trn7%h|c<9HI<9B|e#z!@3$=kEBNY@+OiShAs7!y8pOZVdd zeq4Jm+5#Pst0+`3Ke|T-2UwGAWP=aMPDOwJd1&8|K8-fJ zS-fZ5>e6Ga5mAEzp7yxv}qkCwN+`|2rIDafRDS>YKJI-ap72_&`gsxaOlr>vb^IwlW=rjIz?rJ!z&(Y{SO*nrEkR((a;uHt;{oG}=UUqr?B(sV`1a+Bzom`i0O&@w7E)3* zV;U5P&-|0eXudOQxmKE0@513gsg1#Wz(vZb!`NEZE1v>BT+5iyRcLox{mCStdv14u_$`HqB4>WU;k1FQ^zmfGC)&SpT)!JIARSsFMdB1-6ZKR{czLB+* zQ>~_-(}$M+ylOH5(rOz4H+9>djC6zX=Dc~3Tz6a2_RD2d3(ey?Yi@8nSgWKK&zO(( zbrJgWc$MWE83sO1!L`~Z%ZpQcJ;nx;bSADh;QE0k%MV&nVQYxbJOOZ_>O642YEqE> zBwFzGyP$X7J&JD=4pak5tD{<)o0NON_j^=+s?lULw#1)%Ypi}{QvdUHJGKFCOIgn8 zU21ozeg|_&^Lv@+lsN-vb1S3^tQF3-YXZ99=n?L{2zc>$o8^=k#`jI>w76Z`w;9L7 zefdS#iTt;1K~YivF6Jxu#~pfiI8NlxN%_0mx=gO)Usq6bj&>{7Vd(@kx7gki(mB^} z$Zr?bT8=MAM*&l6wZ~hv#FqokthGGH2LR20idx+dxF|cp+EKe4aHjm)t2tlemYdn( zSBvO4Yj)%MFqGsefZ7hlYLmVI&YWp>{nah@4Hfeb#jo|_(OM7J{cOM-<@T8myslpB z*rW9yeZQz5@9#HVZWu5HPWBu^VVhjDe3VqA-aVhB;^}*`$-!tc8hv+S0Kw|)ea~oxEcLVo`LHtBmPBu4Rd$9 zb&-f@731>VyGkvmprgmii%pr$?N?2ies>$>q&?w!sy3O9HNEa7ex!?xkH?Sf--aJP zZ#wf+Fpw_YYcy_z^o=yH&GPRwCao3*f4{e6f_cH*P4WEp!eBiz9%nV?<(K&G8;x!q zmha6lAC<#P;OCj0Ruj5#J%@4vZRNLlzBkEo{B$05DBnxYGym`j(4lA6SxtpZqwOn5 z`r{KVUSN)D$=~}i(0hE-!w*Pqq1_+zw_Q0{Zc7^v+NFIplp)VnO^*5E^XzXk=Hvw6 z`-O~=1!M+{HoJUK;vcgCbC@IX8ua;LjQOzEQ83<1#?78YJ!4A3_JI3+T9j|jTx7M5 z+&a)Y^0jd5R3~jnvJ!#+ORIK6Bk-(x!1i7Zt+Dto>YH_{Ig?gR8<)>9IBx{pr1}Qw z+JNq09v{aXCO~V3aXw|H?cHYF4u7*8%FUSz(BD}B-Dwfsz;|7Q{ynZeKErDR{OYss zcHisi2EMx)_*-$A?r*o;mya|5CGc?=|C_=+3=dn(sFPnw_m~?2|385LHD8MR_ZHB- ztoUjmx9*Z1dNy!r4%SBsbY~65yBc)oTHbAYD{9n4?zM&CN-Ea7?^%VO~?ss7vVZ6ueENi=>oL4lR)Z+V><2ft3 zP4+kdsMZf$9pko9*3qdt$ECKADA( zDH&rv+x9clA9DaWe>?YjKu=1pwAjcKY67{<%R=MP@od1HP#(z|JqTrS*4Oj$7x$@W zr{aH;#G4W(i{D#fCak3D^K9}trV_@VsQZNUi+N3NOhmPGxJS7eZ~|cFd(dCV$h&~2 zdq@*$6KuCVgtGy2u*Or&gM{DR#N1KM;-?AI8R$URiMi-!J;pCvo&sl62w?PP^ck?| zKrA*dmcJhF7>~xw$&Hxz4DdGjUad!t7uxyn4c4Q7|61|$gwfrkcz#!#$!t#UY_Oa~ zjQe9=(Zzses+%_C>#d$-tv?@xJhPN`YQWyB?0p=2)>3o*4cG4xmP;aud76!Rngg1! z;R9N~K-ki2^}Vdc2Dp&5i?gQBjS4R^!jlj`=6kumKp*irF}P=GbdqpO@mGcGkoZB_ zfa5%qcu9Wx`KV?YeR-5~X9MN{Qh@ou{()oei0BhiJU<3k-sijV`c+z^_CW^ z@wQbp5glZs^UX=iJ2-jwM!KHA|PgS#LYpvz{@UT_wW~}L(03$Pvf92Lwi`55@ z&qW`>6OsadJR8^NwAec+H~IDC*Rj(J;uh=k>q(}&(01zWJI$50&tZOv<@OKPvEwh< z{|EWwl7N2UJ1&GQ83(V;yahb?l07@4Jf^dIirk+))K)|vfw!mS@VS^>0qdf972exd zKsRxoT#Dn1(aynpL4WVY8hi|6G#~P0HRQKzA3l^%tOp(0)vtU*=+`db`Y68VE_~PB zCjb{9W8I7Um*W1?hi%<5?bc5fL+s_^g!)1I5cxsmZtH&^N%^N6e*FA^D2Ftp1I_cR*Zu*Id53jZyx(jezB2k!>R< zdlj22!02co167JgLibHUrk)RZv>I~7!_V8gXl8x@e8U};wqK>F4AoqmS9l!tYs<-g zsz2fFo%97Xmlf#hqSbjaV`ww05pFBbn3tgr;Z1KAv1JSw;f>U3hJ)`d(Rjt|ef_|P zF*IQ_cX7QwCWQPz1yugp*)$K`!EL#hSUz?o~4q{_bM+xW51Tw z8IgCiJ!SITNQ>D-Xg_nZU0isPjPh1_or%2cwnSj_smRxv?qzMXgvpun8_agQWCflF z7{>7w=3#7<4h|x+9B?L};pdhQzj+GouM2FaSPx6&dl&{x0n}=blB4Ufz~+5{*)gfZ zySknD->0gLet#eEJ<<4GYF`K3RBii(&jw778y!dn-|KY;)=oJr?-nkefb~5SI$r#* z_&w`ovaZp)0$B&w=CqohWj>%9Pg>; z*-u$(r&GY3UH1a7m%e7PjD^GlmCzUM;B zeH`(O9--|7CC#hf$c%(ojnCUh?wnVZPT8Du2!?P`1Rn=J6o+bB!9m% zD|%ilpVOG-!5s!n*_fYKcsbzAu|s`MtZ%yoa1Y=Pz zEOt$c>BBeEmt1c-gbypj`eVQL`_0BVAF_Y-6QCW}Vs7w~C%zhseI0Z0WxzVX){U00 zYDC9uHxnT6T?hCTU=iSgeF4n{%xsgM*B0g7_Q!XPTU?#9%N5eD(5}{IwzSa)gZtmX zuGYL3_ha5?;@W!X{+T8l?9Nu*Vt~XnMcm2ljkU3C_%9cH5>*l!SzB?EnqQO_Js8y$$;95_y9@0_H3fDiZ|#oO@>6NcHOY9M+tB|#M@n}nvm7|?efXv|fLTqEe~-0!R;iX8Wsp6S zELM$v(U+8GVu@_yr&gI?*U?(#M|Ck<*?`VYL~E0_x27#)F}z-8O?r8@+2SdjELsr9 zdwECU&{lnnmmN$%6T-X-S3ashTKSy*UM=PeATzeDXVe(4F2sS83vy-=ixGAp3 zFm5W8d$_;M;WB7j*T*a`qm#E{*0R1~AwSDobE+A8Ov=_1_XJV~qdeIR-dR;<_MB4- zV-RXgK08Oh&qyBib|BWW&C#ULm!;fZnem9mWv;gTearJ8*E-2E$p(f+a>wb#inEfIb)^dLeU@2%c@4(cY51oyS58$ zzvS3M@F9o+C>95ov;P$I*M%icGkIpV>bFuiWlg|EN!x?5U-WKwrSW9u@MEs54LJTO z;2Q<&ax3W42=h-51Z!05nEl)W`Qx5Z@wiyNeay=#ca2(X80FS`UkGRm@v2X>jd?{+ z!2J!PZKQKmW;3~qHsmhZLm-z_|48$yc#}5mi|7jU`>t3-mvgjOxi%82-$#)kr`NPw zPR?|-*>IT8Z8NSd?X#R`Y2{;bb^+$Tx)N*pbo0j%h89Q1o3B)i1LL3*0S#wt#%cJ@ zixoo`+7X*21L1lKFdx6YX;kA>C_{Oh^-=)dmw{|NihE|CEWP!3$zY$B&02XG+O$8t zD;w#ad3N7HlUYKZ<@L^)otAek&;D6oL|^_g-g^t)`+NcK>al!+?6;d=jBN&TfAVxXtdX;S;{4Z&Pj`HyQt|M#e}Ycmdz8scjH6|~9P%FO7_Pnu#0==`<;vYKe4IFM^{L5dlcw!e{mp1y%cQz?Lh&A7i#cvN( zn9TXwk(NjH8*%$?XQNA7{`Pfg`Pqg5^DLixqDk>+^(I%)H<=bq<{o|K$mIv_6pbQ% zb8Cq86M(;+&9-;cui@+Q`|cY9*+4a5&aamrHT1vM1T-D+1;vH_it@}1tU*A07QUHz zY6Y2D*5=~LaDMN%(D&^a=iR0!Q9j7o)+?eo4(=0mGRZNrS=B1Gxyo#txUYrt$9Rr=vL<&jf1$$(@8{=lFfOwJb2gygfcbyG999N2 z4`X;jr)*xNJ?9vm;+Rh)$9Y?K5;9wJ+HB<)(pFA-r8tn}w#vku zfb;7qCk-3Fa6DtN>;~SC4VWL=v?TN0laY;vcA1RXXPk{@7g~JhUC<5g#`@Sm{|MI5 zO&_;7#u3%fW{m;n0uF8Adsjv=4=x^1|J!>>0ndo(yDyNBq%dwNdnjF@J({o^za0Wn zuKJSMKt}c&&1KAi$J^hBc&of|hm3o%dFu&$O4)pSM}oR%snwEW&0*Gud;;Ushi^UM z9rTBU_9}XN>(+MjBaL_&rBE*M{^L4}Iat;$zk~b@jBQJ3PZiHMx0s!l&)Z7+i4JV} z4f=Jmbfs3ap^yH-=o$B?Q?9rRaQ7TM`mg5yXD!5sRU2&6kIf#&y^Ai!iS~HVpy7kY z-tvDC6UT-xA=YUslz}mVOJoSnF z==aVbCc4#PW%K4MZg!~=<;$r~**tIkJIM((w!e`%SV_x&J=OGqP|qv0=`fbD`qWtL znPuSbDqynrL%6=oVCx6*KA(pL=Vg+Y%fndFBC&B^*3M`yX9LgYtiZQDf_H-l-2{Gg z?fePWR3M*wx|X-5!dMaB|9<0v7tXL;)S34O`d<(;=I|s|V1x9u9OF2Xb*eH&Y;o_v z3l2+*eH_8(%`d(Ia4$OX1Zcqp2O|CT9?+th;K}Phg?G+Y|6BC_7U}mhZEs^3qeH)n z(^m#8zxPnR(FJE4i`ja1a&RK@H}4Jm-7OidJ6a!3KU=49@5OsTY*S!X^U>$(_hQ_B z6Y;Qn(B8rQ!^4(mV$|P{evCpUyX#4e`*M6YWY2r?4L3pWIOXBMmiS)TZhsxjdyDLu z$%)6EwCjmCVzIOEjt>I50Yi9CA7KB73T)Sa>j1w(UlyTX7fi9Wv|oEvzmK)?YT%z7 zSNnrWvDlw5U+>i(wo}Rv6N45zRJILykmucu;aN<240r&?Lou5}uJ1ma3}KD+Ewda^ zOVPG>OK&+G?+K3Gc+pRIgvrF!UzWawwbzXEdvHFp-guCwfk|A?0Fq~7zCI|M@iyEK zsK%IG`wx*Hn)GmcBHE+qVs|y~K1PsnC#KcOA)9Ee)iY&HOy>F?f?Uwom>)Zu_!xe3s`QkKAfBiozJT+~ z(&yxJjIUvwi?`S1@yD779~jT$?yHo&PJ8ews%+i9g!e7G((2>xJuR}0gvYPrxEgqv z0HhaBV3XJTva+LcU-z#R-;}e{#Vl6D`Cq%N-cY71>c3k9=-+JU7;~P%7=nJxKi=#k zE+$X)I37=%zI&88Mji;eIuW;dYi+b)%7?Y`;p=7 zJLyQSZW!M4DaB5FA7lBl>R@LlV+;V71O7z2C&qOF`Zm2vHg(lSS_j%O#5m|7tD}(a zvt#mn<}j%qve?q}g1}z)DCol{O{WUwtzD2!MnMnm0^AMQfb)BC{U*S*&q?mVIGk`a z_`z|p*h9FMNeA*))_ekYEw(&O8_?bhxCwCW#fpt>w{=54=IuGTSOUqojg3~5ihGCB ziF|pB{QDtqdjgFgeMRyX=6g02)4S2H)Ks%=RKHJgeBRI9Vu7VyEyjOFwJ(!(1v9AR=o0PL}Hb@4+^}Buwyu^A- zO|!br)#qEh7w7FU^!FC}io0Z&1@4YOCfh67o@46hjA#zWboW(OCtw+%Tl)q2g1rO& z*zYN5|BUwKB{Vn{71@NDD`Tnb0co$RC#19ay=U11y4G&;jg!y9803~f z9?qCOYe;#)6Q4I9U!UM<^nIz0_ewsXO@px<8yRa}9oZ?E1CRWDbKKVL^~%}hbZgll zT>KHP?L+&+gyK>C9+jFP-YRW%Lz54f9O>ktanm;_LpeUyp*Ub1-$k2Ov*J_0!+A# zmj>$(>*WkwVD?Jd=x%JXmi9U3HgSHmD$}98&C2U#P7aY=!Q2^z{;W~`kM$l`l|}dE z)@e%fs$3*F{?Vj8OWrnDYqmL8i#)BpEH$=YCd|!{x0fRo#eGu7bM&my<|gz}Zms=) zkc*on=PkrLp;J|VOZwE`qW31P4xRHSV9xJ-G(X;mev@tE+OV9>j~Q~llZ@qZVNB&? z&c#<%nl0?qFu`A@agV8<|cfa40GB~lFz{{WewYQXh7^kD81AlFU{L^(N?-rAj^Y%9= ze_x?rd$;P;vDRw$ki`dkJ#lErbi|yVD8A?Dy6QcF*4-;bFo3Vcuc9qAaP#yln3#kxOOk#3(ZB|n=SBrl9zo2 z@BJC@=!1d36>`+W4;q~(y?+L@WeVB{j*RrP-NEtGM;dQ<1pKlYe6t)-`n=?@jQpN6 zEZ^YBiMVI!;pJqgLJF4jG<}Fn7@?ATjv!Sr$Fy_vURomkCoC7 z8PB13U56K}8`hw>;xen%%Nk>BF9w{A?|l3y(3d8or+Iv{&U9nq_DCReI(t^Z_tnm` zoX#$mqt4=VY8BVddNGCZImKdg+&9J!jY~@^<}kWs!EdA4~0$JLx#XvS4?A97x zY1jGOEf;}?{vBv&QgNGmaQ!ljYf^r2%Ko%jc3Xbid%G>~&$ZczcWm=~qcezYkX+p{ zU_7IfGD3rJ5VZ1vbp(dt zOx>deae&qNG92^U_X8&`#{8ZQSaPKK9Zzkt`UKo7@Lbw__rH_hybm(ad#*Ge{R`;l z_46XR@y(h7nL;@Ohlq<6mWPq_k~K=t#W$i>1w9yftnAce)wcC$f>OPW^hzCdJI4UB4~TAslbz-lgZGn4%3c zZ0}6YCL8$m?qDobm-NW4fH%`Gh;|O1wc*4=ZMqIG+AOBY#RD$3J&$g`mFTXE=k9ft*t4W1^4iy^#*??JYd&{ti20xH(!@8O%l9#OxSNXOh$v>eB0sz%J} ztoD{Y_ztqF_I1#=<@cy~osayD>(JXQw#r|cQ0`{u55~34taA=oZ3N%4ceU~8TwJ(( zqzUbbV@{%xqwE=*GqT~zwo)vwMoy-|81H&9hzs~b5Emesgtj~SG^TzNV*_~L+jt+^ z#J>O_2kiY%doO)C%mZ9TzI!zA=Q#N+{T@xO|7&8ghi=FCklybye{SY>YiFaKgEn=$ zd<1AqpNr!8bL*ik${R5nG2EX60{YY$ofcO6ia0ia>2mE8IV5~P| ztU<3cn4{!P0L;@a#>!rbv5Hv?%7(M>-X}4?cYyXR5U!xT2Q=Z1RT#S2(Ynozb(j2p z@55LhWAX4$;GWXo+g`Tj*_x}_c7Nt1`3y?~nl*FG89)&E#yHL;(>nms*by46m{~!D$6WB*`aTE&j+$tH8F(;wz%=t^x`SFBK769&cw}_96ue&%g z@%PPXi#2mJCS$n+CX8cEXr3wS(a*{?HJrbu52UG(}pN?Y64y*4Lq18#{1h|L!sK>3AcWz!|MPz^h!)M0Q(jH0L zaTDO{z~`TVxp!lY4`Ds5`g_dpk8zB-?!z|@;(QSFa^Y=|_rO~gf!?3eZ1eS}z@PlU zmm_~NVK2`6aD7nl2+mglkEdaLOY22D8w&PfWD9b3#e$f}hWs3zcR1VM`^KwUs*1Kg zR;?~nt=d~UX-laNd$iQ5Jrg2{R#Cg9W)P~StyME-qV|rx31SC9kVMwk?{{72@An_? z>pJH==Xvh?el;2Ot#xbsw*K?1K)faE;HNA~t6$K4_3*J}LgG&i@6OOd8BT|d%Q4LU zhu|APCn9c82zK$9%U|<}tG$3Y&f+;TZw`Svb<7eY1J7;UNT7&;xLy3xeSEPo@#4-5?8lOSE)@-a zuBehGSOUK0t{ERxsdmCQXAK&``gLpXcHCV99zV39cJPg45f5__>Va1VK=d4HvSs3W zcq_lTs*1e0Nnv};L3wFks~O(s8Uv{21hbLR&AaQJSxkQ^O{^~HHA?(h(&STi?>_nP zLJsNQr+`Ae*oGS=ffQz_+?nw=omn~0Y*jv+ybI-9VN2t^`GvIaXEXW`{8&$n{G$nj zo!RvFty1OBze_<-o@WyZYOabY!^KAy9W2$PQ&)ng_<^gP{*ree@IOGI&*E_(PHd4? z{foF`c}(KZ_cjHM&*O=kEiQaAIo? zJO8GkT+5et*r}eCYl63TMI#l@=P8sKsEx8rJ#Vdjt>ZqRusd(q$Ndz+ z11VYlS|u@>B7-hpH^O@0@;o#pz0f~t5?)zWa)h4Ikl1dY(7$73xwl;-zs$n%K8uTX~+cT3zT2hc0f1HM5DIA<({$|IddDiRQb~kscy*WBUXVYpy z&1d_R-j6F-lBB0Gc|P^&wh6|n*v6}|(cUQN@($5Q#p}E7WubgZ>^I@cyrH9a<#W2N zK2mW`E_BgC@nN$FZ}ggQE+p&_%g)UTGazN!WD&Q6o7CVK!|V&0NthzZ-GBe>x%tyq zK%j>G18J!QjBr{Xo94gD4@NpU;s|(HW8;6sqr(;c*jn!GL9r=mY)jS~n;>S(_|R(a z9gJXjWqF75QsV*O8Jk68kH_kXB4Vm98zM1@0YA3!z5W;Q#T@y{xot~fC zc`*tVTrU)u$Sm>aSoP}v>WsOPQe4HsbT_dURVg$9+kZwHj#<#6u{_p-{$F|<%>LRp zw}-HSx4If$45mOsuI#4jEV<%X<2 z>pZ`l@iq09@ifIIw*5<6c=}xNzSbaOTvSxsGV%~7)Ubasr@TL)?vsNI;-9zPr0C>@ z$G}|J)>&gotrE1!gK=4WRhAOqv{zaxJ5?i{_$IX*Rh-vi;kJ4qNJB+FM6b7F)vo!O zhJ3b^ko<3piwJXh-tBhbOOP9$)>^Is@?7*v+rwL_rwkGdusOx5s8;Ap^ji@{_w(}Y zOz5{bGSA+6fvQEJAPInQ7RC;nTlPtlPJ6W<&bh*TBv$!5Cs=9@;B?Y-c+AFnMI)w; zvaJl`ccbjQj=A@b!dvt`{iMS1Kxur=kmfh^6QusY5-@kxyv8V-cqOssOgl*UB_4~A zM{UB#OKgU&H=0T47*((qBw*wnyt%rN*BM^>pe8zMr4X}HDZ8cMc7y!nvfq>~k2OQr zfXA&cji<H^sg)oql28pY-UgR{xkYRjhG(b3^taSZ(^zI$64CKhQ}4u6wcV^gB+6 zqNccK^D_nX^H%mR?}1@z-J6A85MKJR!6_eD(YyYBg^VrAxdo5r@95Ze`AKiuZNJpiNj_Y-roJe<7McjBl8Es-Wd=%{`a z_A*ES4ft`-dW^qvk-l2j%&&K4`CzxsYcs{Z(L_Tpbu5c9tQ=gCK~64)UWrTFk0<;{ub=K@dHU^mb?44f zAH0dL`l&Twa|>=g{eI6!b`r|(NWG2PV9nJgePnC$HF{<6DG(Uiw+_7HT;|Z1!0s7R zXQa3tn3}fjMnhlm41V$-QC~L`sxePGQQ+R*q1e@R=U7)04%kyzAo<&O%k`}9q>>J# zUCf#`d;2-p|g7bKmY0qw_A*kI|{`ZhwAxh9Zc=x+B(J;`pievQsttyVIyt zIph_0n?10CK6Ai<#x||$Dv;+%d3aUoi`w5WD_~jUnT>YEUfX+3Ho=z-S{yXgU=Sxf=p)uYY`d&W9PMOQh;=YU8ZX-sPo2mpicn1= zyt13gt{9v9trIJ6Rx-8aywXf(*Oz0&ptgD0Sh0SIOMw*>igfIh0dbt0bXQ5>5u&@M z3g+E!l@qC7ieQ&h-{Iel#Ou;K{Fw(VT}qsC3PBg@m+gjUs!t6vt~GldlXT-|62s@S@zA4~$GjrVwFi1S z+Mp($Y1=nHmjEk9S0up=$BVAwd9o4s*i$3Y$*e8{jyiTMC%S^hF|9ek9GU6WAqlk7 z{(KZIT_GcX`+MuxiJ#%KR=n#Db}k2c*4~{LoTQL2N#3b~T9;a$Sbyn&3Z$aGc(FkC zvHu%1Gq*ZCY(f#msfcvJO-Bg!ZZuUe9YYH~%F~VZbo9KVDkBPu(IPk0jeqn*B;5hU zw48?5CcCe@RTRwO&}sp9u_e&fVbxMUpSfmJ-D6o3^ZyLTS0=`OmHZaXAHL+k&)O5h zJB$CT=&pu3b}TmQFsice)X_O$iT%k)tmxAJ790J$BGl|h|0pYD-T;ZN*85d%`tl-A ze46^ind-Bf{n)>2Pl_m8p<#MK8#V_5I0&IG#`Z<%QflwX6okfIg?H~qWzw2JrcD8! zQ*Ab(ibSDo7jP#KEl%#b(qJ*dGpI*~wwey>bsTK5_3t!TP|VF;G5pJML2>w#@qqPU zP43)`Q;5fXs-eCQ_Vy-JCIIUegurl=%UWK1@a3&4y_a#vO1#dJP~Hk@)+^K!t} zI~nn^9&%Tq;sE@cW2s!1$+Dx3g3M%5j@+Q`Onaq`L+-Bf_OsTaQYC%b~m(x z(v4BEb#lPT`D3G6lTVa~F1_B+!i_XN@k!luoc3U;K?9zPQg#)zHC+I)(ylh)^dT6x z-vjvkx}f10ppbDzL_xS$$QrN)YPAE<)%$$=8o{CYmQT&p$#@qvkPQ=6r5ZZ zFtQk{1mVr%1C!DI)EtZ7^w$Cza$XM=+4N9honB0n#BCmn)YsY0gSlUMSOun? z2KaJR$M}Btb~|w<^tH;=mi?S?n4Brh5X}tinj9_+cCb3uo38}gL1~QJD?n=CvoDe9@(s_3gz zk!-Grdimjoy&g9mYV4O7YG+rofKp9mM;ixw!vdbj2K|FY!{XTMET6czVoxsaICs3f zh<9h>ch9z9Arz8gxd3>VIh^ugTcMAup*3{254&fqceMwoes6$!JOcu(2Fq;m`zmjxbV z=1h{>bXF2^Ld3lU@rhNc%ES|cz(dmlw?v1UTJOCtq;|f_E6Yv?)b3i?2m#|mnZNpA zwuL(2yyPtcvir{tM>NF(v{Iq zM?X)TxesPY1+)yDT0uB7EHF&fR}Hjry=sJMevvdPxXi~9syMH=L5h|94~)@qH)O%Y zS%zNZb3`Tz>d1V+HT`(xsBf>9-^9Jm-<%j$B(Ols-47D;xMLZ+ChWuDKO6_f^zx97 zYS=V6tJvl8MMmWd!5s&#$ihi{Xbg5$eT08=i{B*=@MS8p{$2R8x-!DNX+?WBB%?nV zu)8X~bY^{n(u}cJcg3)7KQM5^7-vwpP02-a136>07C{8rk=VK%(m*>iQ5i)&D0cPk znkSvrkbv)9%$ecN!a`ck)LX@ZQUglL9F6tP*@Sr6pr%a>rRY@w!zOTr)vqQ7_5AcJ zb=C8NQx1@4k2_{1>ZLwMxhYTecQ2>tza;elRzscMt0xLSD@f=R30oPFh34^VC=Wn> z#j&qf1$mTAnK5yjuGshK);qZYwgOSC87sY(GssGkbgMe*Byq&Q;=(k(-c!LhxM)LX zc}!uEreVYE$VhT3=#JE}KJwN%+8A_xSvq@XzUGs!Nd29p!jWl5{++|1`r)SyFo4go zc3jk11%TN8Y;WHL)&pxIuD;!6_yHa(`6%e!bZgLUy%_34M4R`?FAy&(4|(@!+kXEo zAg2PGY(o3w*wG}k{y=X2Nv>W+YaGG`3f=?lK6mSZ15AiAwnvbI^}gR50}`gX{3)Ni4Bz)50%ijq?O=d~D1@MUm^7lc3I6S`8;yHQw4Og(OAXo`z*=~TPEQ#UlF;5> zuU^WFj&=qrJ#QEq?RcLI4zj<+*rtE8(6;ZWoUo0-BHovK7>hBBtHTl1O`kc3a=3*2 zhjerQp*dZ9SM;r24P^T!%Bg<&SQ8tuHdAIiuB}nh<#xd`W`h=T&fDhg+BX3|utQSK z#FwK=1NQ6MSBRcU_Hs^M!?iAhP@i)0YeaiWZF<`^3L~l*bMpD7(XHH^H4W<3X=#hz zIdxV{rxEhKf%d0h{DYZVQ@@K)|D*K1Vov#rLqA?}yXBW{02wW7zyo3XW(rI$P(TJL zuP$z6)G|Q}?M#7K`p(%tf5hfSo2Pwza$$Ah=I4x73z=TuIyBw?#l+iD`Z^V zD6-qYLugF9Bv5O{|LLAa(mf&4P?zeI$I%t3iKFOF^B(RkN2`xyewRdBkK^C5qCypl zA##7!H5!bob%A98X8Wa5?`2n;31|IjcL}lCZ+%B*-1$so=iX2a?sN!QgSV@Q*TKkx03zhlGlXxGnQ_V}>u$5gl_~{589T0XxV@eQ%oxQcDRfXXRbNRaQ z%RkG~Ec@08wdho=!Aw93SWb4V`JmFbNnW|fjd*_HR?M6q!B8jj_!bOxVQcq55 zvQ-LX1h^+xrk?59AZP;M?8G@a0|ecbLNHAzSj*vJ!4m0j5Xq4c-EPMM({-GD_owhw z*|V>RNDv!HbWQt%V_Cl90=vIjS9^h@oUIi2OklbRn`$!~pFJ0ax?#&NUg48A)Ssa(XLjeu4M4+f z06S*qqzlo0Z|M7p#6iE|T-EwwuV+cnFSeo=_9q;;7ZXlweuHK1&lp!anppozenzjK zezjR&#%i+8ZjV2ua%d6vVy8)Hgu^W@kLS+_p!9}lE@Xm zBeo1)4rYf=j5_#^E4Ewj3!j8FLkw-dl*xPmipI(9lVo^=U^6$VbzqoA(D3huKPo~0 zkS3EbTWemZHo2QCqjeT5&wNut@epj?=u7}VoX3h$c$ELqqvCXr!BU+AYw(pu7O&@w z@x7xiQmw&+mnU-1%T&IE5nKxpYH#3qP*9xZvUeHBQJL)r5FsIg7OZ$Xg8lZw2qQwC(p8QQ0&w20fo=mC1A7meaM zSZ97);VQLCUrlp!xfp0Rb!*npZRbTj`h<{{SUO6V8`7y1Tj)BCi-d-y^7xdPcYVW+#%so9d1d1GY90;E z3l#4#e8XG<)z=f#cpZePzEDqee)J7E(=WWi;pWw}p(@Xo<1RoxdYeT;uxFqon&C>@ zT+WakLk~c4uN-e>@EZ8BfgkQfQs-mNDdXslpP%l6RaB1qL``fE1;-S9H_Y^k{`pO> z^`pxa+KvGcI#M>kGz$iC$D)l>+sbo0;g-qqSjiHfU}0&{ioACtGWf%ab^@h zjk7fPxoxtGa$V)D4ciUQrCRu)eXx5*DDb48)e5L!Q}auw&)jMU`pa5gnXS|k zqk9^-K#bwb1J8XIZmiMw)!fd~&N3g5^(s}Hb2Z6^a=Kog?|6le*PM3ib&hLM4VzJA zr_yumSxDZqzi_OX$=a3e!IEqKjS}C@!RMVM<{Ao~54imWSN@Ue3SP2U**gY(^9Hi` z9Ob>}O|Ho8f2Xn9?_Yz!Z42$#tsc9)!S=ZJ3!r8W!JglkgRR*dxWn0r^y1hzsDKuY zX%hQ{t=@A{D#gK0^_WUrwLZ|2!dA<`Tn*2N+3QzhZd~eeJ|J!PP9jb6<<+`fNrOKn zsqv$e^BK44dQ$npdW95h@J&=Uj$6=NJLJbutO$yHxU^=Y6QicMDXso_U}b$y#hpn0 zw%&JTC`9TcVWQSwFX*fa+-I%47MT~;S#aG3=qMnNC^1m=NAes*fNQC;O?1IBI13vI}HBh#8x2H1(fY-QWItpiC2ATV|=RszC1strv- z$~;(&l6gi5tRq(Pj&MTPZZB+})@k4x)M_QaZFnQ_W~`wv@*c%8d0%~ab!Z7c8;uU0 z8peV1?7qQ~y!#U#^YqN3ryH#D1dHo~()eN~c>Sgq$BxNEsNT4~U%d{lRT3_nnf%~< zAVsZtMzKl}2DT>@c1{vkMK?j(k;%^zSS^s}hTsy`jG7FoMokNXKv5%!wru%wvv z^tww3oC%ok+|jZzNzWoI2UEI46Q4YhZ+z(YwhxLdFjjTc*m0FnP^2rv$7`eQ`Ns^V z`^pBWGcNka=X|5_WAQ+9U&tUniR2tNzAt18>d5~ijgCF;HH{>Qz@#Rsd$7X}jY=jt zh5~5@-QM=;NeaoJ;QeQN=gK&BZ&OqWjDVXXN!}$yRn5EPRp2?7TQ6DJ1UpsP9Swr* zc3WP>X`@#z^aK6`LCNYC6a5IgJY&GU9__PUm(=cVABhpLQ^$5KClb;>|miN`Wk`1YLYqgO?ww9 zqzxn`GxC@-+8%(-aydzMWYt3)$@w|>bB%#Z)G#?%%-WUp$2>-}K(?NXK$CnU^`_yC zxsT3AVA-i0g|{#*PjToAB`H#s2IAiR`t)}{jOtdt9|SIBbG=U)+O)V{k8uCs4t!Xp zqt2AhzhMk5t)fK-*YZ|2)e?*30C(tTwTCb)J!4RB@XwW)HLu#(A2O>FUga7p!bz15nKOOZ0MO_-T`V?EsrI@vqWnt#v8SgJH4z)A89T88TGBQ7# zHxQ&_Jy_a?-mZUC|7CX@4f(HAK-Ef|%&=ymyQ=_~J`fM(`Y;u0P7K3op9Xowx?$4d z7ZSKWIePN~PoWCX7uV2;#7;;asMu@5{c7T>;voY^bMkYN`Jjj0VA1WfNA}*x2|A=6 zfMLV0;O;||#JbbGkF(0wnZ|>}4_>%n+YeldF6>rvy7jwIZ>B!>wi}=s#AAL1rPajk zIHl4GLR7Z?>X6>pXkySyB=fcAuJVs^?H_4VW>s*wo$*+6fqTP%?vepI3O7pZQ?`YVCG3C^=oQ_DJoV zcX&OZ>(Z(lswf4R)veXnd%_9+>C9s#5XZ3%q?T2nlAPyrr`;Rcih_;m{bex!gsrtk zNg?^-RrZo?mD%XR*C9?NQ?rCV{iDmJ!M6?UOkm2wEBzofnHd-Oc<6%qo`%Wsbavdk zzdAGSxi2HYsT%s4P3soD!i2pobD^TC;aKQgP7El!_rnhj(U$Wx<|NTmAs!dVk<61h zQ!*~I#;|D){C;h~#oUdekinj;DVHW&c`T&ZE{b#%ISCz7eY9QB1rmNAqaHSKUx_emX+D^>Bl~vsdpgY)08kpynxVnf$6@sQhe2_K+93 zH4M3PKEc20PwUZxwH=p)B>j9A)PU{(<0PsMI^+h zL+!F=JGl^TSmZ&{eadzIF12>h8DHq1y|uX{9uZhcl})_R>Y#3q>#NI+e^^5sII8}@ zGIq?fInZX({(-O4J?3D)12(jV>XW&>75b+xy2`L2w(S3ud#AsdKW(kMqB4&UHA*=` z+aAZ0UTSJxnnpF2WK?)&uax+Q2)T~uZ~ti*?$h2lx>oVzzE%pEH+VSTipRG7*zVUz zwL!?&IXvJXXle)tX%?5S) zjs|+|pdl7ppx$`h&?F30O6wIZ5Ux!Z%)%yOz1$TAp+MQAlGAezfEl1Q)O}O+2SLt? zs!21oV_%xh*F*S8Vxf;|{rM+M_2sDwgK!I!V0 z8=i>#h$^XOu7PWN29P))(y=W)8pDpAqeCTGOxgTx%bklPz z;g|pkw6F&Dzn)9|7SG2d&<_UWzx=m-o}w>_@YWDAsV9n2gx1m0@4<*L7pIR+!=sn7 zp|w4s>2-op_u*!LkJ525baCD3ePY9*0lHh_Y^ap&Uuczl&{JdoAfrZNt7iw+F#>DX zcBI4bN+z5G`-Hlz<<*YtJiSvKma zL&kbtPRzFZWka7INUjurY3%i!`O}@ybB1xf2b4s4qJFu@@rh8G03CD@qk|k@=Vz+t zXpZKX@=YrzMdITO?3y#bx#xM^(-VbzDmI_#i1I;SUleNwPRFtNVX`sG-I>Xu1<8px zE1*-50-87w`w1!C{p%0kiCBF@b$;i8a0R@WpUN4 zcz;uWSUH~M8YG(l5m-)qI=HM0sX)Bs(H;ujGA`qE^U6(YsKcvG!z-WohzTrHkM-gd zH);p>-}!85?pW8~RrsqGvK!~G?SW7&qh|Wdq@;aR+6M~eQ#m*-3_oM$6wqW4~Y@r-HegZ z4So%DsV+7_?NXCJ<9ro+<TT89v!jw8hZC*m zN34y|RIUM!LD_4&=YvC!sj`qr=jnn9mr@nH_6X{I*luSGGGEi04k<23sKK2uxSLDB-0@6Kb-^=Hk2=Y&S{j)uMA3le~%?nG99DQEhr4vg|aye(v znX1B@H{3?931K(=FG^G~v!M=A>gn*;wr03WuH8n5u<7#EBST}?vPzMeIJhp$cDV*t ztWSHw(QDSEPn>j;9LDMRPkxA=V~mGR|D6kok9Gb$pExemgnC>p?3%n6RGiSv9dHi8 zD-P6C@5u<`8OaIxFm5w@&~0xj)!`3*QL}oBKzi-Y<1kGN8~vU5Y|>&hW>sUxJY%JA zvC{9zeM8%=J*tVnSa_9hCz;uduQ4u5c~(#~?XV~qo*HeS^pQAZQb9l6O?pTu^wdOp zDW^6>`f>X|uBU&fHubu(^nlL|-*_u^=c49=BkxVjK_$thj~is#5$det_113EtX=vk zw;wr%AYPD@WVRh2aMSQB;Ut=C@z!pjljplAqVM0l;^nnFRb0D5Z;jFt-P{tUCX?5a zu$M_s66=DVl)2fj5NOl+T&PDV_Wj>-ZtZP9nS*cbX!NBiJ421j!eIl?yGj4eGTFPV3*%0UEa36pmQY0;Y+KJ zeA~DQFP(`(-TF1p3vc`)JlV+76ha7B_j+>I6=als3XM|xC%?m$CA|Ekr27OsnrQd| z+g~QU^eltsCR8GzkbI}i=5@qgesB>h+8RD2ay;j1e~VYoAMvr$Jce7VQP&PsWc7Uq zI&Rn}xZ}I!QU#}fIp&(#)^g#BAna-`%Sd%ees_6k{5c32QraqfoL6_@uB8wx^Y$ck74HUGAfxUNX zx;i;&O2Tc6HG`%AH^++l#ezafxsa&_o0!F86&PA{Xnf!j@{eaf8) zpotrn@wmqKfs9%r61sy#W-!~R4e2H~?3^8&sl7edb2bPob*==E3 zW|$7JAn+$ChPX=O;N@C9ZU;SFa|EQa&qXKv=)bN8x9JO^3F2AkNTP6bRI#;?y2!$; zS01`hMDYi1fD))vw;^;#sq5JT((( zhSyHCy-*UWI{HY1FIql%iHA`XWQ?v%ELm6V0b8Z%HrWreY;0s zMSsAoy;RfhZjZNpmfe{-%2?r8+n%O#gFNH9uF%TTxUp9oFFg6iBi_MZ(@gJASPS=w zkIXp+q#iRu1}bR*2NSw7Xxk2gbqlR(JR{D~o{x#0@mxsQ`(>v?wJGkjyFWfZ6NOs| zbLxR@&!?5IWjFNA_p0TnA>>Ic`%Qfc|0YcY9(>$ug3bD6VFB-hLHdL9O!q47Q|OwI z4<1O|iN2t0DOBOj9BYk0bl~p$qP`uwSj`4aXRysJb>d`p+By@o)}Omr259b2AYw=zi3C&7)s-YPtL)3EN+n%-;v!t zVL>J)Q0rmO-Jaj$da#&k@9a`$Kb%Y@du|be!@MQGGmxp)r7h#*zYaSk(xc472)c4? z-u*EN91_G>beYuKW?)X?p3q~#cs;@$oMyhPI0!8~vfm05z;w#&V_&{lZkRkqF#}Uk ziGgi8VcfMyCXs|`d<@p^i`V!?z z5G_a9<2eX0nj39##7(+bc$tC?oYfwTKpxEeJ;XbIC&igRq!Vjt)^o~3^{cb9r}I|e zS0`bj!#bA+{_g3{LL_PlDS8bEIgFv6D~T&S?eJ(7iTA}m0CoIqj{R-e+H{~M`7zh_8=NKr`_r&qSHZeL(}Vg8NG;g`jLP(rr=A8d`Qr5t(Q z2Qx(H@LA-mLjHyU`0SQ{-Z;h&o|8(1Wr`pPul7;wFEg=IHt?}%u%xj^f zpN1b;#XD?{9yPmT-sq`)VU}fqxKq#K7G@Mst@T`;3W=$r&hzKWPEV*E3GYtY8rX}s z?4{6oaaJ}&)Z&G3B;XyWCR{beY<>C*WbGkgt^OB5#`S}?i64!B>PqH0^Hxfcp@t-T!R$_Z4os-XRl#mY3sh&B%?oF+o7x9C}h zt1WM#sqL}(nMb_=jV%*+e5DAVVVb2b6_paT#vuZSwbarc;WOQj{#|!`2r0dY6`?Op zei=WS)SSTq)D=(SN<%N~B0d7Y-%x+NwlLfDT0Zk5F<;6GvA$Nc{@?`r-Ggf%$Fwj^ zs`Ns7JUj-ZD?{!f^XMkc#jS&9hD&5D!*eI*Q(79E&V-2Zbga@|Ze?e@9ogfw?s-_! zlBcDEe>4kVRap$)ty}}-U^`m^w-({o=8A4HbQ$m`lQ*A+^X{Y2BTE~UP3jA|Ue zPJUS1tTAe`K*sP%wxTWg_o{{3$2q3C1Sg~vz1LzBeY0p*8(ie z@9-zBlNu9=O#W&0!TF@Ws=(eej@Gc4@t(`VvBq)RhU?(Mgr=!+VG;ZHyGWYO$TN-% z0t-PQlIMr5_$6*^1eVU50K0XplHWD!Bk#;k)UYN#m~Nqjg05@YQzaNZjWNfN8w)p^ z1tb^Vdd}$+vOMl(vOi{F$2z0_{tU8X3`MV;Pp}u>Y4Xdc_H-?K1>X2llI=23L5&^a z>pA{m`@_0X-}-J&DJdh`jmAeVEsNgS2g7V7o9bwHl>SRl&x$=#fheGSA0Vo?@R60= z%o6jXNnnCp4VBOeQ8?=uIC6%>3w+XRVs~Yz)q#xnA>C0D@eQzkJaKBqxW5xygAt2) zDIyHej|gbl2Kf0*sm{JBG#;fWE*cJQb1qX>~u_z1^_JnAi_ z<+1)%z)fAUUQRiW(k8^v2q8n$GjQQe6_3Xrou6io*9#4*|M%12tV)h&m-79PyKqgq z!J#XTsW8a$tD0(?z23q^;za$KHB<`2%GTcgR8vW+VWeK$@evRNTh!hNhpXO0#5AGD zLL+w6HSDnO3Er%uNGn@vZD|Q2ml@hwfMe|3y#Z*WY4osPq~C0Qt+mIlkOl)a&)x--ZOT%Fk`PJHk3G)TMa1F`;jf;L*yE@K1wj~z4l)R>p)^E;&Hb``P_-i+_@|3o zyA4~yA)Kq;j(3g{#;c~Zp8(M>G`OJ`&hIL0ReIC2erWB_d_UkMiIfr0Dj@x`weTn* zKxg8o$}K7142a31IvSpAVkl}XX5GjXVOM7_iNuTGzhlk9(3&(JpY`D|0UN6@-UzHc z_HxNgxsbkr+LC&jSd@z+BNc~gm#Zn2&&t5SVi)ZdXZvye?W^e4-A-mIJ_6rSmhk|z z(Fn|eVN1PZbFzh*!TLZ(hSseODHQ%mx5f&Yk@nC)lRvRs-mzhCp>wyfJ%aootCPTw zW_MJb0ZCxNBQ%;fK|;5)p^*P8pv8A{3=|@Agr97k@#ks6qH#XB<{%?Q&qJx@L~Nv* zHFk&j!_t$@8)@19U2U;Fl4G6O-GX>K9?*Gmvw2oyXKQ!0rlVF32Zrc#)9O185=-~C z9!9hWly93|cm$OFcx7c!;v2`)a7QNkiIxIKn6FA;53)V;Qc9CE{P51%JC_2C@#gWTKfW}g<4v%N2lHI;-Yo z?U!_si5jC$uNPy$P#XeKktr<*+tgY?6F7>n!Ot6ulaS;U?s9Lq2Rx0o%EpasLcX zdquF#CR7;n;mbj9xc0lllAKoUb-k;{ly8*!4V1O(a$0*}Mz|o($`tm^ z?J#%2nK1W~u=?uMiAE(0;j(-Ts|4i^C&0C&N@p`=tY&S=FzzdRXe{nus#>XqUa0VH zfBNFp&cD{+tu$%C(Ea9o^Qk)a@yB8ddY@SOw0#;};GZeB`pKzyt8NU;m z#Oy7RzGtn3M$=Gu2Q~eP?wo+|-LH2Hp`|@9ZfI#&euX}oTu4+NLcMA+KLB(h+a7=b zjz1f{whnMc0eyH+A@@Yr_#LS^_afE%DkWnmxd_~=j1_HcnCkvJefLv74;xnM5~cP( z)V9@j9V<1Y;VRD6R^;Ef((BVV&Pl5+-!abKSH0Y$VuqBxqy3BBj{4Cjw)xoqVZnv* zNvX^*W*D}>Q?&83B7g&rze!`>Tpf3y``IutRqYJ0jYaoCxic^yH-#j9S@&O_}hsu4iel zL0j%i8jZO&?IHDHxN=FnGCyYP)SAINkDVo!WzZQ4-lzG-^j0w8lX+hgVGXAqgGra$ z)r*SxD0nBRQD0{P`2$?b_?JGk%|c_EmL8`6`z<2XtV*8i^x?iNOcfl!zRAwHoS(-0 z#B5U4Ag;uyw^2b$=>QvVEyz7i+7E4F&|`-OIwU54kh`F&BRa6h#**H8N&mH4Ys!|SIf zlqO{VVZrP;u#s7_GO_SzDCD(w`wJwMDhU@7n7u6$7;V=X z-Lw86hmv?^Y?8R-lbl<>m4ovhs-#e}H0Hkvm5vQci9Dc=mZzNU z>J{+#NOJ^Fs?eZ5T?MLc;dQv9_iE=wSexDN@>C6sOL7q6I&^c5*d9X*hS=!|8<1o! zNTDJ~CM-F+rx}5l6U0kCzk{p49|io|s2>3BZ$zk^BhgvOBP}7__nU?w5uuUv(1&CO zVv`*Uet$hiaZ4IgcrSzm7(~Lyq znlO>~4@yTjC9^-fGmV+ap(O`5ni8P&|A;`t>7!3$>r_qtpH7m=+#=Da#SEtAC&k6t zJ0_1xPB9gJU*zG1u97W&?(KBmj!PSx5Z+Vv^ zufp3Jd>CH@^5BkJ$=mmJ)|fB!PIE&}bpnQ}#qL+HzMwv@C6NC+@Mkk-+w}BiD`Vbs zOm9W1jk&i|SIv6tZQfV;X$`t zZ|3{oLmZJg;sV3SZ)3SQS{kQ-2BA2mQiK>RnIOPg^R>(_j4Ah5%aNfy#WOzVt5o`K z9(md_4PTTVM@?ORG*5J*B%@OQdNd<(xm#Oj zMhp#ZVj(#}9=SsxPiv@Kc|@(&6OLM;126GYK#xx}oig_)I(4$$& z1cmbn(NR@Gw8Zxd5h34Tgjg%dg23gmpro9h$Bj7IqH2(CAUvukHNTT|TL-Y9^zSz(8k~ zYYo>04!P7#_FOSC&u=Q>p73Ug*WkJn?&n-|mACr|S}y+GPbEmFM?WU2$Ac?LO z&<_-=$a0O+spVJ0?Io%;tJz#qZ|lx@nc8a9z*7<2jqXXLoxMllgqnWUDc`aTP_N0ItT9LfwJ#SKc3dK{t3+?E9$r_qi}C^2<)$& z?U(5G`Ff^b6EUiy{K|bI7e|t7j&_EvZiqH%I|a9)H2DaWbH_f{j%Nf8zt*<{{v7(X zJoKxz#uDSlQBk-(sIYiT>=pQv3KviYrWO zmd@3=kA6#-_a3649MX5!@IuZ}|A}b+J(#izyYj(I&s{ZX5krMEl*Og)A17LEUxiTn z$FU$~e+R!tw;Mk^=#N_tE-3W=4cxylaWOc0i*4l8p=uJRAm%Fe>xk2s*pP!-n%yjz z!I6u12{S2tCN7>-(meBA)bp!n=Fz70D|BWs zj7aWW3*ga@Yt#9AS>DnJU|tKp1T2wy?C~#DWz1w_vl%EM2$#Nl$Zq_% z9^TaP-t!^8NP{D8n5}X9xcEkGWwQB_uA}q(TmzRYfG^2?zc^1VFXq%az?4wh1LSea3ueV}`&ruO)dmKq9Gp?h`+H-b6460C6AAj6c;d ztz4({bXWrJAO3NrgBh6+s<3y94T`Co^`P{BZbsX@e!vCv<-XC_QB8y08 zC!?V?8bCz-S6sKTYcHrH$xXtf!KeS`+YuN^tjU2h*dW$VWIy2EeuwsmUU#;=aAn z4vJW~-+B|4fa(vfLXJGbJSVX&=W;0`BYbVTLw)zMK4qm6H8!$rD4MG`z33zZB(_(* zYZIO%IDZm+mQQ7oHDZS3G=JC{Rf zR&anaH|+i$MuMCD8R7nH?{)ZfjGHBHUmc13z&#~&kN0nkx;zcR;rINdy-d#vDV=}k zjz@MADsS5Rv7(qo*J5`OE6Vk>tv^VYl%9@i>92C8WIQ7kg)m$(=o=iGvQ)0@@>q?7yMxSWTkq-QOx?5gJZ1) zm8HX?i|e{HERX!Nzr?@`P@&uKbbV8Ewk@OsmcT2zd`j+R?W_;XtGqXOHgU72!CoUz z@uPD=;lD#pUm|)gRj=^%_6&MMe`QK9C5u%}j~6M)%(0CSWYBSczl*eOZuiqJ!^E|O zOFmczgX6i6!kQP=6?};a8RUTuc5T&g3}(%E@kvW3*JC3L!VTsjI8S4S1xi#h?6&9? zea0ELcdaDkh&BG($`$TE744S==YwvGo7x~CmrYFz?u=_LIBV41;he133t;Z2Rk8&1 zGDwjHZ6E0m$Dse-pJp`(?C*Z|TMo$~#m5O+ z4O9IxEHV#=Jq$RIeE(^4ua(V~>=*gaveBPdd$4VaB}Z*D zh>yRQ=;0w|O@|_FN84QNeAMT4aUH}!;cnTPBxG)b4@Iln_T(jSfn}My!(9N~Z~r?I zApXdLJZnsu+%jFPnVG*$>m7R_nJj3y9V@R-AEC4MBISzn#cg*^^Zf1!;Yz7ZKr86m z_yFbHE~+U-jK@m^jI9-a=ZlBr`gTP@e6Xlv4bKNcfyxt8Djf+#Ha?2J?Mt#bb5||M z3Ch7^IPXXiFCgwAW10M?)Ej-PaG2lpZ?kSCb!S&(2_Xti0v&I+epaF1_*<=%+eTrT zr}thIID4exJ`T!CK^;9@87o=$sDrIX*14F>ADjM5q-#R{ISKW?)nJM+^$U(C;Rj?= zOyr<(LKv*3k&Et1fcwt_QOJ|M#)Wa_Ilm%IuBo8>-6AE}nkFzr^lR#tMEvwCU;9QwB| zE@jWXsGfC8I#6GmSY@vqXx>3+ISK531qTGLbc8RQs!?OR$nojU+-gSFt z9i69AnHS+|9Y(20UVQVVxkj4FiaX(9e-iHZR=_1!wp=p%ptSqDYWZcL)-!kaxAexv z&35e;LwL*=g>l9;gbA14zc{)v zskHoW(|KRJ*5xcCsG?!SlZ?8bMgnLN7a5TV;)*Mo-%`MLA|K(MS9Ma!xLrm|tzdt`WoXeFJpN!2G(_x;I zq_>2K96~O@oaMQr+bP7-Ea8|8rJz~q2yjG?+Z(kMyq& z@DTPz+#sKT3XA#y%)rc8hjwv#Y@D__s0q7&^oetfozhqdTl?*DcY#84^N?qeI_P); zSSQ*2m@hwpNzTY8KWlmKBK+BAF6<HdA;AfYN@4Kxl zW0g-6!q2=Ujdg3JTyJP>ei=MFSccw?CbZ8S;$oBQ48$&(XI=C2yTLpQFtIr(n%wV* z&Sc^ZT3r#qnkdoWR}505jzf1oq$G=_8)PFM)I%NPtVYMQv0)DH-9L&N5kdn_-VNO) z_+&uat{h2LOj%#d{VTeD!ygGXL4i)fzEeS92s@^${=^InN6L>{kEJ&P7y3A;$@$KV z|8*S=67SAl0TAvZl;;VOxU$iqRI{K{~%wQGZ-osF{bZ> zr8LNpm`lhNB2p?nwBuE~{_75OTr!tWFXe*1H$=W|h00jf<@B5CQ0X{#QI{+-fF;3f z|L$y+k%!7t?_o=Wj7 z^RbZD*au{cwIBr|RtrC?XXCttEAhB0^I?T@b4^8vv~YI1TC#ezj?g|darHFx^UeOU zS>=v$aTM!0BUpzV5I+}8&GvmDm&a5ZVy0R>tM~VHww>r+9kH1+sEg<1ljDNmYonxN zBDp-|Bj3cJg+Awgx|bUJ33$?EtSfB|$OnPKAh?y_@iJ zo_$5!rKOM^|2Q0I_oC(&`19hk1s$^-oi}Kb_J~egzjz}kk*>p%5h7Y9@AD93P(C4k zH8>`~F5DmcEz({`ap26Je$;-U>%E2D9yXBw)9FATu{%56c2|&Hl#c+AVddDY_qtV1Gy|LH+uj2A+LO z_V|8bP^gc`z5NtL{)p4}mNB;pp55%M94`@wHQWNb(*Wp4XU*V9h_@{cBY|Et zDrggN4Yrkqlq**o<5yY#-kfu-2W6Y7Z6ikq$)hUch3%+69_-FcLS)UR>taySu9yXX4Y`f{~xe*SZ^OE~Xj|LGlP|CzbjBuJI{5~b63^T5(n z&g0jE-!DM1K;!>ljN*HR+VX7+AL;Lxl9+=-TxFV4|LZ8`J4rdcy8Wf<9czEI^RL>G z8NP#r;4AY0$2b8Hnp|Uc0%;@I#kC1tqC(5h*hY^x_d(wW6$I7ssr{eQhT1C^XIQt_ zCXii=US{P2-gm-lI_G&Oj88;p^6HLzIE`O;jEI$nCLILaw_Eq0C00a zY+cdN`h&9O%``2zf;MCK!~ zuhN$TMyI_-=1<*z>@;iOrEoSf58MXG~~eq422=e!gGEk!v=F}(l;ke-=3R6OLt^?8ITXje`jx#%Gg z<%cbPj=?p8j+F}NOHKMgQ}(;FaJqw~i5$-!c+T%(#b(IR=*f(QeSMixS(5yR+Kkm_ z{qZ+#DivIJx;+BQdu;`0itWg+a)_S{>9-usij@`G-%GsPK<}lmaCB|Qc4XStB?E)| zADCD)*XNTA2E75f9+bwCRH<#njtA{Yht~JZe7pr+rC$@xVd=+0>np1oQHXN9K@4In zcj4~hjs(wr08#lnLcEF zsno8I@@#t)bV|Uix5MV`2g`X9-;IXoqEn9#UCJ+6d|BD?U&C$uXI2Dk(3Elg7pI&{ zVO0;B(!soV=(>`*FKv*cr2$%|yVE+H?g0y^zJufHEH8=?<9|HZhzl^^@raaRY?x|Y zYV3Q4ElgrY^*_GN_2a6MjzEixQvWLf-}fjN@s_r-(ftal(z0e6?BW;Fi<~>+{wO%J z@)+va|28?lW$V7t9HLzi;;D`K;*)vMBJ$T~%Re-f$evyK{P4x?80j0NaUJtH;oJo3 zIqhzx?z;0`$mF^zY6`UItn1ViJOM0|GGcB!e;WxRi0v;d7;TsK9zLKxv^n`p_Sn@d zlxeK{FjiU5(fMJzLj(&|tYiG%Dzh?wW4t8FNzvES66RF@pZeL=m)8i8{N5LoR*>LD2Hd2<;NQf zu&F5;ishW@)#V*BH!0l#{XSQJMH-X)el+1V@e;~;1)Rry;6WR3b=yR8-9F1nm)tV2 zDEQpS^;yv4%8YNpe4x5%NgxCI_|?zpsl~Vx$GT0=1y#)ar*a!* z=t{Obk$iUnIQ}WQ=pamdx$mfg^#AC0$ZB!_Yws}N?YOnqTBIb^5E*4lW^(0t9LxL;WMM+(7t}TdY+cxZ}A!5g?TBj<9 z;+bkkP21H=83}#|W>?p8|GUH9%(1IGa`3lqnweKC3uRj}V!M~`8RxNR<}7nZP^_fl zU6w`UqhH05Qd6pvxJKUy0wjL53dUwLN-Bi{#L-mWDK0a=ZOK1UPYU8wFo~Dk_Ih!N za(vHNY(fNJeg>t=Qi||p4_>he32im-!lN(cb8bnD-{cS(;sMCYU9;Z@5Qi~RKVXkRpV^nk1rf-Akz%AUmU=ENZ(|X0RYx0S+U$HPUq_tmV2JPH%8k>W=!Y}ve zPS%B{(Bb!iNoC08gQ-Je2lIBKgj|y^+C!gR>8r#Rt;mAMby)s9v~qW2AXb1N0fbksW6{>?_>+xl9 z^q6dIpWlODetRH`|4iWcfL<1vtCRL~e0yFt`aRz4q=x3f9RTB6250Tc!=d;D4|kb+()S#az?sT$IcFNMZg$DS{13LFCqcs-)z!BSQChZ$QF)<@xq4rAsMSAjYPDMu24$M}a zGNub$Q%v6)R~ZDJo-`51WZtUVD^`rmR3^hE!~S@S%$!unay4Tm7qU_u>r(?(e<*a^ z^a@6N^3}?1+kQGtdnd7|B2=FFP4b%#Xix+(E2^nq!BukI?H}Yufl+z;NHD2crwnx8 z86Pf(SmbW3f7l(#!aI3VMFR&Zx_YV*aefjKx5$dhoyJbyL!>%14dOj9N{D~jw zOPYa>75OuA)Rw7GU zmAlb{*BsTmPl)97O7IEX?!S)I6yEH!sy;-P z-3S+YR!9Uue6H~;pL2+# zJhiDIixLML{_M_6eJ&2;pXPP1=9lMJefrO%K|{uF;h_Z=UZS{XlROYKa8q$jKtL5k z1RT8CVk^gIDZFhN@?M;@K@-b&p75x{Ry;?OnY1*sMmjx!!rWko<_g*Q>rK?~ZCRPg zjgKbv_=y91o?84_|u!n0>g>%RwKIXS36~2#OBKJF;;Y zao>f7y{t!w>~|zfJwhu#BAHk4Bm}z;J=#s1R~YrwI7>O^+Fp0*+zgEjz4x4d#ufE! zGUrXfM*kuN^kGE)MS$;uZI(K$WV~bGEP0J6it7AOOYqrK>@|8^wUQ z{j+KRuT2nD#Sur#Z{U*?$3GYdww>d;&S{H&Q*%pA|1pR7-OdfG%hjeoW+AV2X@g%h zbuIsQt(PfD8ur{;&y5!L=UJhpX>#a~9}%>L5%W>+zj+ahBd%s@PCmb;&6;^T`UmXZ z%OeXEWoAO2D+hFv+e|rcAdGyT$v!s?YCmaYV6sbS7G80HGgL#^%)}ejT&E>v*l;!p zTSc5oVg|!f`h2e!g)RA%5ic{i9lD!<*i+Uu24&SF&~}sTlSKKuaFcehYrDGF5ZY_8 z^fi+MSnAL=TB6%ZtMwx6)4FM2-d25zwNT?c%E~`D3*u9bVVdU(O0bLf35Bzy)qeCJ zRWI}&D|mNxfx)&O!?s9oG|k=F^M!yqy`c)aexO@Do4-HC<-b)04EdGj@s#c`uqiDM zE$co!!FQODQiOh;>$=L7<5vp);GR;fTt^orKZ@u*>{ewml#avPKOMK6MbnO&E$QZ&W=XxD z(e{$Yy|GKM@51W5^os^QI{WO#=4zf!Hoz=4{mJlS67SDamuu`foCB6Rh^-Lg4CnuF zIbUz#xM6)u=P$;g>Jw%1*ia;}Uxjy+5Reoej!$xTmOYF$klMqr5%)lIkM&P9;-!{& zwc4Y9JW0eWb{VK_`lR}aMi=6g?^`I-=J9x&J!wt+?dlPH)22}2uOWZsiFwL74esy- zL7Be=>&?XB($my|U_FYjH}DY7)63H>*otkm|BPmu%4<~z(FRFQ1bHQB$TNVR4~agp z5lNv2tsV8Roi}Z~r-qZ>Y+W-^4Netsk2a%`DO~JtR$<6>y0WXhoL?DTt>;7#mocml z@(FF+F#50LeE3*%8x)9xzTEwm?i?;F*x^;Sm1&~*Tk3aVYDfn?@eAqW-lz84HLA(; zkqkxN%J94@n7;rMl?$JW}Hao(@7ZfQz%02M97aQtHZq z+QrbF3S$a^!dJ(8SDkmT+)}Zc$3;^%lBpJDSkRe2gTK<4O8Gs9rPSgx>AT)J0rPd8 z3nZswz{5TLA#9IbTlDoD2g8#UDV3a^tj50FUre|=+IlFZvy~?Jk(RRSeGTcg=;1XV zFPUzYO#~U{0sMWdW4*!&>HLC6hxf!k;lR~Us-opx=8dgSNB&eELr#O??FtZBBFr?{ z{UzDby(gG97pvdP??g6tFQm+TDk8{84N9MIouFET;oW>@@CCf^h%+yg*@8REpBt{W zPw;!@79722Qn%X|X#ER)uInl_R_ZekL%dvgFYhB%U{l|BEHd4^mr8=k42jAakV&6S zdU?4{nNGHlDu(=X#>?ED%3hZ8Htyx4Tbw*Yzw*x}D*dSBX%+elR)%HfJdw|NGm;1M zrgtPm%0R;3_X0UkvtBDWXxQ+CSr17|1eMJ*^qk(GQW=*wtu(CMu9;~6uQxLyh}Y&? z2hyw>(2a~h7+CL3iT$_Xb$A^fV1}N_`+>L_Y46sVUR)IB(aYDa(nAQUR|CU^4g<|) zwh-%{*1z0z3=Nitn*czh0ehX{ z8Ft?))>W)z`x!`z%9+BmJc4Lyx zVdp${tKWQvWgOS4CS~_`_@0aQKkV)0FzhDeXrAVbJvzj=o+lG>x?&P`8%=>IN5vix zJycSuTTy(uY@g*WLBx97{RKs{6qVBA8`1ESD=CjDPtgYz*?<5AzKineP)A6w+qbV4 zA-bcyBSu&b@7V?r*zr)|U5n03)X6!p5Z#x_nX6ZQFxvu3)R3}AsS}#UR1*fFplFy| z-UB#LXCCAdW%!|g$cUVKOtw$qo5A75)nlLdFZJRspX&t}MJ8C4je$;~FShLSw{Nw0 zUD!fidI>$x%Mz@_;#v8-mNU8^jaTN~G^^Yb==I2`mFWSPMIp}1qe*yos|v4>A%*#d z(U$in0P|?)haqEYgkP#-5^GYICYOE|>cKB=Y+%|72H;#62sCmpAoB$?O@}VG`F<25cMI5 zFfKhr13LK_=Wa0&z^%G>V>wcz1N(-$t;QjE7_FPS3V7@UQXcO*%dw|AE=s^|lU=57 ziyV?-AC5R@PlIMl(KoW(i1Jgavhn-o+-rz{LlQyrx17Y(fRLhV?{oC!`j>?5hk;0E zmByaN>GJ9;RSud&6U%$gCTCjoC`hF&n^5#M|6!@&O<9m+1GNFRZv8O;$D}-L8Q$s| zal*RHnU2V`;5v|GQvk?1qhOY`=8``h(DJeyM{aR_x7qf{KrQ_iDc`94c(OkH==ah8bN(VoA<(8>^0|%@sN~Bm?g_u;ll5RT%&g`sV2uGP|ZAMWQcfAkZY3( z!xHw#Y_qL3VCZ)%#|o!cV=k}1MZsa0U`>iuFwX+JpU_hH70K(iNw0rS@mGnNUuu|4 zI!**Nr%BMtApm~QupFm47UQ$Psc}8%HKp#pt+*>4X$~iZL-1e;l|O(xKIfeUyw~|> zK=qhkLKS1#(+$NdiA^jg@efI|W=Apcos^~np6)yNcyT^{g~45cwxeiLUSaUZt&U{U z!zX@V@fqokSGZ;HtvDvHW^IH)^Atj}U06Tl(XaURe-F8I3X}@OXF6q={W*4IqhB$d zMobx)cZV4+<@662Y7V}HPR;)}VNiRRIqwpm-p!M(YvgBs5iNY4 z@2%h*JVHx^NH3OsOE) z@cDu1ReyrwnUYwWKpY|m*x_??K?)k_N0ZC3yc8-pmVA(c1Kg|3Xge2`H!#u!w_1~!!%y|RloAM2eUV@p%0+$^3p-Df2giHteFmCu#@T!s+nT% zhMV-sQ>;>DzP-b|h*1pE?00#-U7oOgf7xtM4k?OG|LFnbrDQ1K!+!u}Bs+a8Q{f$oodoVR zd|r=w(FIDdhs&7-ei?V6!ZI$*-NPxa`9zPOADbd4=k>q%+WEL%R`6T+Xuxd%V9ek= zng`PDCd9{h7*UJ}AN%XkGHhN7k)#tAu}wk~tWtOUP@v-h$^)ZDd=?)d0J zXL(m7-m1XX20*@ryB7TGCPp!D25a_9nq&mQ`y96Ut>M`tN}M13xIW@MO+%`te&X+H zrVtKE!9)tmZ_CW*bYAE)b*>z~QHC{tk%js}st80fOZs(kO}$$hYF>!&GN3@O`+^Ep ze&>1&?yo%4Kd3FPouccC18d6`a0nb2R)vL~;$)V$V*t9v$6^t|d%p8+@r<^2VXDlh3KxE#d08p4;ooa+P0Cq)&CpYuU!Lca%Gdmx;`egBMa{I@JW= z@EE2u)4UKef7;>ezUZ6l;|Z({RG)Z9Rlvdo53UsK`+%L5TPB*w@*GtJmzB9X>$Qe= zBkst6_OwYOOS~i_MRdy$;x#k)SY74CVD=Lj*_B@gmC)X?R8=?-Z@IuG-JN|%EFH5`TVz*}axD2jhfenT^PF9$tmp(0_+qFW@QK&Y5UY5|4~IOkuaoHB zDXG0KM?!n$G+N2eqWiS5A4a|C!grmjl%n}_IS*<-i;i7)>|t_53wl!%oP{5|(2=dr z+$~%fmyG42|534PK|QWuj|ex3MaYR2F~`b`8t}vjvxNI7uJ4&}2ErOo;HFUo{dcaW zhYRlU@5OlcRv%8ZrF;{G;#4!lUPr{gn<#bLHptQUdJ?V@FQmLtqYEnp!-mgjm-GoL zwn7{3IYS|#SCA#!f+H*)S~wP3ivl$m^-)eoIjmzfJ0hWm6MYxH^-spz_dt0*EF1br z#z7f3jW0c;Q+93&Z<(+9heg2w9fb!LpQ)X|e~C9h;p2XFEIr(Zw(9h|HZhJn8`fQN zicTuq>F+U9syW8$VT`6$@L)EMt%#$Dm*|F>#j8fe1eO_Nx+*_E4S$-DrG-8jTl@(+ZZ@XR0?qv z3MlZZKm%BUc}4kb ze{RJK^};k=X?v*|s2}sN_D`DJIk$04y?9vq?*f07RgwUv@pVy0et5v-rI{F+leh#w zne{cpEmTo_w_lVkxN%u3pyTCy^A*%5l)kyw1H45As0Z~akzY4!cGslD0rd+VdY5yN zt>p!b0@$2wFN;*U&tx`)Si>V;sn3f^qF+pBeb=OK3o3&_+dqt^m&iWlMBf~NSPYP5 zKdj*m){a^W6a5C7fYzcm7|RVa$>akWM5Cw6FLl*u?k*5RK5rT^kO01W%H|o8ecyHW z-jbm_u8@|SG5B%s+S%jf^H~Wa^~6hrtLeIoZR7}^cp|eGSik&Q7;{KO^P9u6u;p*} zQnTCmQYh!vyf#ta#b9foe-iVa4Up?2s&uXbCR6XMcj6D*MF!YqMwHwI2B^B)7R>9x zKCEPEPZ^J)3DnJ?&#d7hXW@r|S}=6HvGvl5IRg?+SxdB+T;E_xS~B33XtqcX#k2L6 zgqpV*LxbAEM{igW9563wSkqStUfIuX0CazvQj&?>BDgU?H0*aUT9H$osXtM20vtO$>eB;{yV>U$?P5iQV(3#wy{K-CqE5 zU5h0}r+aUT{V<+CSbk|O$I(HGy4%Fj{Iv3W7eEeQe!KKwN5XVBRz+B8dAay>!C=iljpyKM znnR2f4K!55I~*zX0-DcDYWx3JT+{i8bpH@Md_*aWZfk7SA@)e?u0^Y@5e$Yhx#X3v ziH--|5W>_td!BKxa;9z^$!Iidf%?)0QBhY1H5V#>F)sqCo~4cZjr|xSO>fk?Z7@kJ z`QQg>b@&+C23}&TxeAd>yC7l}rK`>!h=)|gl~?}G+ig`pJQuVBfppJp*vFRV_917x zN=C(YUXFCMCn9_Mt{=0;X^6A^8h1F$(>smmWlfOI0t}myn)?nxez#D`V-v5oMtFTCB z4okf{q+HdQuz1hw?%68s^4J}8rsI8+}qHmw*Eyk>d5}3q0E&ojY9%! zq4`~WnD*J3bIeZ*IFJ0zu{1cqZpu{3kF|-*GuY)vz5IjiAXaM&TeJ0d7?e6dv_8dS zE!(2c>*+YhmtH*00w;+Ox*l>39oR!S<%a4Bl7E}R>Rd!@etw;sgd9BDS68_pEg2>c zv8Y!^iLF)3#Q)qZ;4>-mpNUB_|4W!Ws!|?2g=81LcGVmHB5MJl7AM|lS8COME49OF zWIbNLy+k`ztN}8n^H}<>c+}X_dNQhCPg`fuYFkL?753q+zEeS|$KPNr&bi4}IOvIFzn%9<+Mt4k67RFB+-Pf{`$DM}vd zycp?IZpFW)$t$^%tB&)Tu{8Lyg3p5eMyb&uW-|u}53Df&#q83W0k+_a6jg{m{<_{Q z{_@HWFfNA88Hv~=Cvb=wNBK2Yh1`pdu12*=Gf{wjGkO1Un`keH?!RtfbKsjLc9KIo z_>}@yq*A25h+Uesggd%grHMC!tmkA^Zl5F0Gq>$6%3)X`J22o0 zCf&Zz`8~PIvgodwsq>1{Aznn|&6Wlf2O`p#@_0azIyR(;D{VeLSjVZsue$ji^yk1258A{*T|6NwvFF?6M#F;x`C=nq{ z9;0+VZN*WuYGB7~G+#yF3>;1(5Fg_gkhegN$s&$ zzwhKk3LYJiSdwu!yAuwoU|fqOa&Pu4LRBsXX&ZDR@{|XPCrdzCIw}%-I2l@2RdWMI zDJ1XgYoQ1ghR41W-|Rk||J`qsT=TEAgZQn1p&yPoOc!2Suz2$(Q#FE}{p4}s0>#~m z>JpW^uKyA-F(H+4dtT2<^BOgA7xRPj!F+YQJmq+r>kRe($b$ zV`w-@-1=FemUE6$NRTu;+bS<%sz0}wylQ1c7X0i+H!G)g=9u6qRaM52pmCAZ<6AfX z2&1TLVDVCMP&A&61H8n!IT0jK72r0xSi$Vl(VVV{Uz4JkL5a}trYNjvKb9Sy|g6CKR)n^Plxnji^Y}~ z=IF%}RoyWoP3}9^7?#AaRspgt1BoPU@b-!;duQO4F-dQLWs149EG%s(CiW)s@bAb% zoaCMgWSXn#PW?shP5;r8>w4bJ>-R{wxoqJ9N({`w%@%m?l4$|+~%EMhu} z31ReT2>0wx|J%0A*^745@_7_mD&rN9(4!~A6=8N@#51wZ%&rW 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 literal 0 HcmV?d00001 diff --git a/package/.cvsignore b/package/.cvsignore new file mode 100644 index 0000000..d992c6d --- /dev/null +++ b/package/.cvsignore @@ -0,0 +1,3 @@ +*.tar.bz2 +*.tar.gz +*.spec diff --git a/package/yast2-qt.changes b/package/yast2-qt.changes new file mode 100644 index 0000000..c7084b2 --- /dev/null +++ b/package/yast2-qt.changes @@ -0,0 +1,2612 @@ +------------------------------------------------------------------- +Fri Nov 23 15:55:31 CET 2007 - tgoettlicher@suse.de + +- fixed unneeded help icon in "please wait" window (#202818) + +------------------------------------------------------------------- +Thu Nov 22 21:13:01 CET 2007 - sh@suse.de + +- Moved setLanguage() and font handling from YQUI to YQApplication + +------------------------------------------------------------------- +Tue Nov 20 18:03:00 CET 2007 - sh@suse.de + +- Prevent self-generated events in YQDumbTab +- Fixed cut-off YQInputField labels +- V 2.16.3 + +------------------------------------------------------------------- +Mon Nov 19 13:44:00 CET 2007 - tgoettlicher@suse.de + +- fixed ignored arch selection in package selector (#304966) +- V 2.16.2 + +------------------------------------------------------------------- +Fri Nov 16 16:36:13 CET 2007 - sh@suse.de + +- Merged mod-ui branch to trunk +- V 2.16.1 + +------------------------------------------------------------------- +Mon Sep 3 18:13:36 CEST 2007 - sh@suse.de + +- Limit pkg popups to screen size even with substandard resolutions + (bug #300632: dialogs too big on PS3) +- V 2.15.16 + +------------------------------------------------------------------- +Wed Aug 29 14:38:24 CEST 2007 - tgoettlicher@suse.de + +- wizard shows titlebar depending on existence of title-bar-gradient.png +- r40568 +- V 2.15.15 + +------------------------------------------------------------------- +Mon Aug 27 16:14:15 CEST 2007 - sh@suse.de + +- Fixed bug #297637: Repository names not shown in Package Manager +- V 2.15.14 + +------------------------------------------------------------------- +Thu Aug 23 13:25:08 CEST 2007 - kmachalkova@suse.cz + +- Display repository name instead of product name in package selector + (#296782) + +------------------------------------------------------------------- +Wed Aug 15 13:02:44 CEST 2007 - jsuchome@suse.cz + +- Messages back from proofreading +- 2.15.12 + +------------------------------------------------------------------- +Fri Aug 10 17:53:20 CEST 2007 - mvidner@suse.cz + +- Finished integrating Feature #120292, UI as a namespace callable + from yast2-*-bindings. +- 2.15.11 + +------------------------------------------------------------------- +Wed Aug 8 09:27:30 CEST 2007 - kmachalkova@suse.cz + +- Added text referring to whereabouts of the license text to + license agreement popup (FaTE #302018) +- V 2.15.10 + +------------------------------------------------------------------- +Mon Aug 6 13:55:08 CEST 2007 - mvidner@suse.cz + +- Adapted to changes in yast2-core needed for making UI callable from + yast2-*-bindings. +- 2.15.7.1 + +------------------------------------------------------------------- +Fri Aug 3 12:42:01 CEST 2007 - sh@suse.de + +- Fixed bug #295485: Text cut off in MultiSelectionBox + (in repository names in that bug) +- Fixed bug #189267: Unlocalized text in online update +- V 2.17.9 + +------------------------------------------------------------------- +Thu Aug 2 17:34:26 CEST 2007 - sh@suse.de + +- V 2.17.8 +- Fate #302052: Restrict patches view to show only update stack + patches if there are any + +------------------------------------------------------------------- +Tue Jul 24 10:59:06 CEST 2007 - sh@suse.de + +- Fixed bug #285915: Can't cancel package search +- Consistent naming scheme: inst source -> repository + +------------------------------------------------------------------- +Tue Jul 17 10:12:25 CEST 2007 - kmachalkova@suse.cz + +- Require new libzypp (>= 3.11.8) +- Changes from libzypp refactoring branches merges back to trunk + +------------------------------------------------------------------- +Tue Jul 10 11:55:26 CEST 2007 - sh@suse.de + +- Don't over-simplify whitespace (replacing newlines with blanks) + in dependency problem reports +- V 2.15.7 + +------------------------------------------------------------------- +Fri Jul 6 14:03:15 CEST 2007 - ma@suse.de + +- Adapt to new libzypp. Installation sources were replaced by + repositories. +- V 2.15.6 + +------------------------------------------------------------------- +Thu Jun 21 17:40:44 CEST 2007 - adrian@suse.de + +- fix changelog entry order + +------------------------------------------------------------------- +Mon Apr 23 15:33:26 CEST 2007 - sh@suse.de + +- Load qt_pkg plugin for PatternSelector widget, too +- V 2.15.5 + +------------------------------------------------------------------- +Mon Apr 16 15:44:13 CEST 2007 - sh@suse.de + +- Added qt_pkg plugins to file list +- V 2.15.4 + +------------------------------------------------------------------- +Fri Apr 13 17:50:18 CEST 2007 - sh@suse.de + +Merged mod-ui branch changes back to trunk (r37143:37466): + +- Reorganized source directory layout: + - Header files now in same directory as .cc files + - Moved package selection related sources to separate subdir src/pkg + +- Load package selection stuff upon demand as plugin + (saves 2 MB VmRSS if no PackageSelector needed) + [see also Fate #302119] + +- V 2.15.3 + +------------------------------------------------------------------- +Mon Mar 26 14:11:50 CEST 2007 - sh@suse.de + +- Fixed bug #251215: "Save screenshot to" not translated + +------------------------------------------------------------------- +Fri Mar 9 15:36:01 CET 2007 - sh@suse.de + +- PackageSelector/PatternSelector no longer use zypp::transactResKind() + to emulate what a real solver run might do, now always does a real + solver run which is no longer painfully slow with recent + solver improvements. +- Auto-solving on by default in PackageSelector +- V 2.15.2 + +------------------------------------------------------------------- +Tue Feb 20 15:02:11 CET 2007 - sh@suse.de + +- Fixed bug #239829 (again): Show patch version in patches list +- V 2.15.1 + +------------------------------------------------------------------- +Thu Feb 15 16:46:24 CET 2007 - sh@suse.de + +- Fixed bug #148469: Exclude -debuginfo and -devel pkgs on demand +- V 2.14.7 + +------------------------------------------------------------------- +Tue Feb 6 17:38:34 CET 2007 - mvidner@suse.cz + +- Prefixized font patch check. + +------------------------------------------------------------------- +Thu Feb 1 14:37:29 CET 2007 - sh@suse.de + +- Merged SLE10-SP1 branch changes back to trunk: + - Fixed bug #239829: Show patch name (ID) in patches list + +- V 2.14.6 + +------------------------------------------------------------------- +Wed Jan 31 14:22:26 CET 2007 - sh@suse.de + +- Merged SLE10-SP1 branch changes back to trunk: + - Fixed bug #187322: Ignore solver errors in patch mode + at first solver run + - Fixed bug #232522: Added inst src URL to pkg versions view + - Fixed bug #152997: Install progress icons + +- V 2.14.5 + +------------------------------------------------------------------- +Wed Jan 24 14:53:55 CET 2007 - sh@suse.de + +- Merged SLE10-SP1 branch changes back to trunk: + - Fixed bug #218669: Broken UTF8 chars in pkg to text file export + - Fixed bug #227409: Add installed packages to text file export + - Fixed bug #229368: comparison with string literal + - Added Qt-UI support for feature #301178: verify installed system + - Added CheckBoxFrame widget for feature #5673 + - Implemented feature #300729: Saving of patterns and packages + +- V 2.14.4 + +------------------------------------------------------------------- +Thu Nov 23 16:50:28 CET 2006 - sh@suse.de + +- Fixed bug #223416: Updated patches not visible in default view +- V 2.14.3 + +------------------------------------------------------------------- +Tue Nov 21 12:05:34 CET 2006 - sh@suse.de + +- V 2.14.2 +- Fixed bug #222505 (left-handed mouse) + +------------------------------------------------------------------- +Fri Nov 10 13:39:07 CET 2006 - sh@suse.de + +- Merged SLE-10-SP1-Branch to trunk (r31627:34245) +- V 2.14.1 + +------------------------------------------------------------------- +Tue Oct 31 17:32:00 CET 2006 - sh@suse.de + +- Improved bugfix for bug #183735 (display only relevant patches + by default): Also display patches that are satisfied, but + not installed yet + +- Fixed bug #189134: Show description of initial patch / pkg + +- Override patch category tooltips with "Dependencies broken" or + "Dependencies satisfied" in patch list + +- V 2.13.73 + +------------------------------------------------------------------- +Mon Oct 30 18:11:50 CET 2006 - sh@suse.de + +- Consistent handling of isSatisfied and isBroken for bug #173488 +- Added real "isSatisfied" icon +- V 2.13.72 + +------------------------------------------------------------------- +Fri Oct 27 13:43:42 CEST 2006 - sh@suse.de + +- Added missing icon to dist tarball +- V 2.13.71 + +------------------------------------------------------------------- +Thu Oct 26 18:57:05 CEST 2006 - sh@suse.de + +- Fixed bug #162164: pattern detection does not work +- Fixed bug #173488: Status satisfied for a patch is displayed like + uninstalled +- V 2.13.70 + +------------------------------------------------------------------- +Thu Oct 26 17:26:25 CEST 2006 - sh@suse.de + +- Fixed bug #183735 - YOU should display only relevant patches by + default +- V 2.13.69 + +------------------------------------------------------------------- +Wed Oct 25 17:35:07 CEST 2006 - sh@suse.de + +- Implemented feature #300756: Added support for resolver test + case generation (PackageSelector -> "Extras" menu) +- V 2.13.68 + +------------------------------------------------------------------- +Tue Oct 24 18:29:08 CEST 2006 - sh@suse.de + +- Implemented feature #120142: View installed products +- Implemented feature #301229: Fold hidden patterns into parents +- V 2.13.67 + +------------------------------------------------------------------- +Thu Oct 12 17:32:16 CEST 2006 - sh@suse.de + +- Implemented feature #301222: Easy access to updating all packages +- V 2.13.66 + +------------------------------------------------------------------- +Wed Oct 4 17:27:21 CEST 2006 - sh@suse.de + +- Fixed bug #208694: Allow deleting patches + (only the patch meta data will be deleted, packages will remain + the same!) + +- V 2.13.65 + +------------------------------------------------------------------- +Tue Oct 3 13:58:43 CEST 2006 - jsrain@suse.cz + +- added missing files to Makefile.am +- 2.13.64 + +------------------------------------------------------------------- +Fri Sep 29 17:53:59 CEST 2006 - sh@suse.de + +- V 2.13.63 +- Fixed bug #205059: CapsLock warning in password fields + +------------------------------------------------------------------- +Fri Sep 22 16:59:31 CEST 2006 - sh@suse.de + +- Allow pattern categories to be collapsed +- V 2.13.62 + +------------------------------------------------------------------- +Wed Sep 13 16:42:01 CEST 2006 - sh@suse.de + +- Applied patch from Ricardo Cruz + for new UI::Beep() built-in + +------------------------------------------------------------------- +Thu Aug 3 15:23:52 CEST 2006 - mvidner@suse.cz + +- Added a configure-time check for the X font directory. +- 2.13.61 + +------------------------------------------------------------------- +Tue Jun 27 15:09:34 CEST 2006 - sh@suse.de + +- Fixed bug #188018: Patch description: Text in angle brackets + +------------------------------------------------------------------- +Wed May 31 18:49:40 CEST 2006 - sh@suse.de + +- V 2.13.60 +- Fixed bug #179679: Untranslated text in file dialogs + +------------------------------------------------------------------- +Wed May 24 17:47:15 CEST 2006 - sh@suse.de + +- V 2.13.59 +- Added support for licenses for patches (bug #174476) + +------------------------------------------------------------------- +Thu May 18 10:51:01 CEST 2006 - kkaempf@suse.de + +- adapt to libzypp 1.0.0 api +- require libzypp >= 1.0.0 +- V 2.13.58 + +------------------------------------------------------------------- +Wed May 10 15:05:21 CEST 2006 - sh@suse.de + +- Set package to "update" or "install" if user selects a different + version in the "Versions" tab of the package selector + (workaround for bug #164487: can't downgrade using a patch) +- V 2.13.57 + +------------------------------------------------------------------- +Tue May 9 16:15:03 CEST 2006 - sh@suse.de + +- Fixed bug #173122: Easter egg crashes the installation +- V 2.13.56 + +------------------------------------------------------------------- +Tue May 9 14:36:44 CEST 2006 - sh@suse.de + +- Fixed bug #173865: No "automatic changes" dialog upon "Accept" + in Qt package selector +- V 2.13.55 + +------------------------------------------------------------------- +Thu May 4 12:32:46 CEST 2006 - sh@suse.de + +- V 2.13.54 +- Messages back from proofreading + +------------------------------------------------------------------- +Fri Apr 28 12:20:54 CEST 2006 - sh@suse.de + +- V 2.13.53 +- Disabled patches view in package selector (non-YOU-mode) + to avoid problems with kernel and ZYPP patches + (patches view is still available upon F2 keypress) + +------------------------------------------------------------------- +Tue Apr 25 14:33:53 CEST 2006 - sh@suse.de + +- Fixed bug #168904: Changing "all in this list" status in pkg lists + takes too long +- V 2.13.52 + +------------------------------------------------------------------- +Tue Apr 25 13:44:39 CEST 2006 - schubi@suse.de + +- Bug 167565 - UI: deselecting one preselected pattern deselects everything + Added transactResKind( zypp::ResTraits::kind ) in solveResolvableCollections + +------------------------------------------------------------------- +Mon Apr 24 13:22:50 CEST 2006 - sh@suse.de + +- V 2.13.51 +- Add installed pkg to SelMapper to fix "update problems" list + (required for pkgs that are not available and marked auto-delete) + +------------------------------------------------------------------- +Thu Apr 20 18:18:14 CEST 2006 - sh@suse.de + +- V 2.13.50 +- Re-implemented list of problematic packages during update + +------------------------------------------------------------------- +Thu Apr 20 17:15:49 CEST 2006 - sh@suse.de + +- Ask for confirmation to abandon changes if a language is changed + +------------------------------------------------------------------- +Thu Apr 20 12:47:39 CEST 2006 - mvidner@suse.cz + +- Catch exceptions when calling package management code (#166278). +- Adapted for libzypp in a nonstandard prefix. +- 2.13.49 + +------------------------------------------------------------------- +Tue Apr 18 17:39:43 CEST 2006 - sh@suse.de + +- V 2.13.48 +- Added infrastructure to fix bug #164869: Duplicate "Accept" button + in pattern selector + +------------------------------------------------------------------- +Thu Apr 13 13:47:50 CEST 2006 - schubi@suse.de + +- Bug 164365 - build 906: Deselecting a selection, all packages are still selected + +------------------------------------------------------------------- +Fri Apr 7 19:10:30 CEST 2006 - sh@suse.de + +- v 2.13.45 + +- Fixed bug #163827: Special package licenses not shown in weird cases + +- Fixed inconsistent propagation of installation status of packages + that belong to selections, patterns, languages etc. + +------------------------------------------------------------------- +Tue Apr 4 17:59:20 CEST 2006 - sh@suse.de + +- V 2.13.45 +- Fixed bug #161400: Switching between alternative patterns +- Migrated from Resolver::transactResObject() to + Resolver::transactResKind() for all higher-level YQPkg*Lists + +------------------------------------------------------------------- +Fri Mar 31 22:02:38 CEST 2006 - sh@suse.de + +- V 2.13.44 +- Fixed bug #161860: Pattern selector layout out of proportion + +------------------------------------------------------------------- +Fri Mar 31 18:34:56 CEST 2006 - sh@suse.de + +- Fixed bug #152700: Automatic changes dialog displays garbage + +------------------------------------------------------------------- +Wed Mar 29 21:20:47 CEST 2006 - sh@suse.de + +- V 2.13.43 +- Fixed bug #121872: segfault at program end if no Qt style defined + +------------------------------------------------------------------- +Wed Mar 29 12:08:01 CEST 2006 - sh@suse.de + +- V 2.13.42 +- Fixed broken umlaut characters in pattern categories + +------------------------------------------------------------------- +Tue Mar 28 16:15:20 CEST 2006 - sh@suse.de + +- V 2.13.41 +- Show language specific packages in "languages" filter + +------------------------------------------------------------------- +Mon Mar 27 15:44:05 CEST 2006 - sh@suse.de + +- V 2.13.40 +- Fixed bug #156590: No way to reset ignored dependency problems + +------------------------------------------------------------------- +Thu Mar 23 18:46:11 CET 2006 - sh@suse.de + +- V 2.13.39 +- Calculate and display patches total download size on the fly + +------------------------------------------------------------------- +Thu Mar 23 16:29:21 CET 2006 - sh@suse.de + +- V 2.13.38 +- Enable auto-solving for patches +- Support for multi-arch patches: Prevent duplicate entries + in pkg list + +------------------------------------------------------------------- +Thu Mar 23 13:17:39 CET 2006 - sh@suse.de + +- Fall back to search view if no multiple sources + +------------------------------------------------------------------- +Thu Mar 23 12:08:31 CET 2006 - sh@suse.de + +- V 2.13.37 +- Enable starting up package selector in inst sources mode: Use + `opt(`instSourcesMode) + +------------------------------------------------------------------- +Wed Mar 22 17:49:52 CET 2006 - sh@suse.de + +- V 2.13.36 +- Small fixes + +------------------------------------------------------------------- +Mon Mar 20 09:11:43 CET 2006 - visnov@suse.cz + +- V 2.13.35 +- adapt for latest libzypp + +------------------------------------------------------------------- +Thu Mar 16 12:54:29 CET 2006 - sh@suse.de + +- Fixed bug #158576: 'install -> all in this list' does not work + for patterns + +------------------------------------------------------------------- +Wed Mar 15 19:06:18 CET 2006 - sh@suse.de + +- V 2.13.34 +- Display patch content (packages and scripts) +- Moved solving for single current item to base class + +------------------------------------------------------------------- +Tue Mar 14 18:12:15 CET 2006 - sh@suse.de + +- V 2.13.33 +- Fixed yast2-qt part of bug #151834: third party licenses + (Acrobat reader, flash player, ...) + +------------------------------------------------------------------- +Tue Mar 14 15:21:16 CET 2006 - sh@suse.de + +- V 2.13.32 +- Ported disk usage in package selector to ZYPP + +------------------------------------------------------------------- +Fri Mar 10 20:12:21 CET 2006 - sh@suse.de + +- V 2.13.31 +- First version of patches view that can display patch contents + +------------------------------------------------------------------- +Fri Mar 10 15:18:57 CET 2006 - sh@suse.de + +- V 2.13.30 +- Fixed bug #155799: Qt package selector does not recognize newer + packages as newer +- Display patch category in patches view + + +------------------------------------------------------------------- +Thu Mar 9 18:28:55 CET 2006 - sh@suse.de + +- V 2.13.29 +- First (still crude) version of patches view for ZYPP +- Activate "patches" filter view in package selector upon F2 key + +------------------------------------------------------------------- +Wed Mar 8 18:33:27 CET 2006 - sh@suse.de + +- V 2.13.28 +- Added "file list" view to package selector +- Added "change log" view to package selector + +------------------------------------------------------------------- +Tue Mar 7 17:27:25 CET 2006 - sh@suse.de + +- V 2.13.27 +- Allow searching in RPM requires / provides tags + +------------------------------------------------------------------- +Mon Mar 6 18:34:50 CET 2006 - sh@suse.de + +- V 2.13.26 +- Ported "dependencies" details view to ZYPP +- No longer translating RPM tags "provides", ... + +------------------------------------------------------------------- +Mon Mar 6 14:31:56 CET 2006 - sh@suse.de + +- Ported "languages" filter view to ZYPP + (no lang-specific packages displayed yet, missing in libzypp) + +------------------------------------------------------------------- +Fri Mar 3 17:00:34 CET 2006 - sh@suse.de + +- V 2.13.25 +- Ported RPM groups filter view to ZYPP + +------------------------------------------------------------------- +Thu Mar 2 18:37:06 CET 2006 - sh@suse.de + +- V 2.13.24 +- Display product name (if available) for package versions + in "versions" details view + +------------------------------------------------------------------- +Thu Mar 2 18:12:12 CET 2006 - sh@suse.de + +- Yet another performance boost for "installation sources" + filter view (~120 millisec per click instead of ~1.2 sec) + +------------------------------------------------------------------- +Thu Mar 2 12:17:39 CET 2006 - sh@suse.de + +- Performance boost for "installation sources" filter view (factor 10) +- V 2.13.23 + +------------------------------------------------------------------- +Tue Feb 28 19:19:35 CET 2006 - sh@suse.de + +- Installation sources filter view migrated to ZYPP +- V 2.13.22 + +------------------------------------------------------------------- +Tue Feb 28 14:52:33 CET 2006 - sh@suse.de + +- YQPkgVersionsView migrated to ZYPP + +------------------------------------------------------------------- +Tue Feb 28 13:35:59 CET 2006 - sh@suse.de + +- Removed beta warning upon insistence of our project managers + despite the fact that the package manager GUI is still broken + beyond recognition +- V 2.13.21 + +------------------------------------------------------------------- +Mon Feb 27 16:40:29 CET 2006 - sh@suse.de + +- Fixed bug #153035 +- Fixed bug #153032 +- V 2.13.20 + +------------------------------------------------------------------- +Mon Feb 27 15:35:23 CET 2006 - sh@suse.de + +- Re-enabled TABOO and PROTECTED + +------------------------------------------------------------------- +Wed Feb 22 18:10:14 CET 2006 - sh@suse.de + +- V 2.13.19 +- Removing patterns and selections now works as well as adding them + +------------------------------------------------------------------- +Tue Feb 21 16:39:02 CET 2006 - sh@suse.de + +- V 2.13.18 +- use new way to enable/disable autodocs by mvidner + +------------------------------------------------------------------- +Tue Feb 21 12:08:32 CET 2006 - sh@suse.de + +- sort category-less patterns before any category +- no tree indentation for patterns +- disable closing pattern categories +- disable selecting pattern categories + +------------------------------------------------------------------- +Mon Feb 20 18:47:44 CET 2006 - sh@suse.de + +- V 2.13.17 +- Added pattern categories +- Patterns now use their sort order field + +------------------------------------------------------------------- +Fri Feb 17 18:56:08 CET 2006 - sh@suse.de + +- Added pattern icons to pattern selector + +------------------------------------------------------------------- +Fri Feb 17 16:06:21 CET 2006 - sh@suse.de + +- Don't install and distribute autodocs (#151370) + +------------------------------------------------------------------- +Thu Feb 16 17:57:28 CET 2006 - sh@suse.de + +- V 2.13.15 + +- Use patterns in PatternSelector if there are any, + but fall back to selections if there are none + (and fall back to detailed selection if there are no selections, + either) + +------------------------------------------------------------------- +Thu Feb 16 17:31:41 CET 2006 - sh@suse.de + +- First real pattern filter view + +------------------------------------------------------------------- +Wed Feb 15 19:08:14 CET 2006 - sh@suse.de + +- V 2.13.14 + +- Fixed package description formatting + +- Migrated "automatic changes" dialog in PkgSel to ZYPP + +- Workaround for incomplete selections packages handling + +- Migrated pkg description popup (for hyperlinks) in PkgSel to ZYPP + + +------------------------------------------------------------------- +Tue Feb 14 19:14:42 CET 2006 - sh@suse.de + +Package selector changes: + +- Display selections filter view only if there are any selections + +- Display packages that belong to a selection in selections filter + +- Propagate selection status change to corresponding packages + +- Display separate columns for installed and available package only + if there are any installed packages + +- "Technical Details" view now (almost) complete + +------------------------------------------------------------------- +Tue Feb 14 11:25:02 CET 2006 - sh@suse.de + +- Applied mfabian's fix for bug #132577: SuSE Serif Italic font + +------------------------------------------------------------------- +Fri Feb 10 20:26:15 CET 2006 - sh@suse.de + +- V 2.13.13 +- "Installation summary" filter view ported to ZYPP +- Re-enabled "Cancel" button (saveState / restoreState) in PkgSel +- Code cleanup + +------------------------------------------------------------------- +Wed Feb 8 21:46:53 CET 2006 - sh@suse.de + +- ZYPP resolver integrated and working +- "Search" view working in package selector +- V 2.13.12 + +------------------------------------------------------------------- +Wed Feb 8 16:19:11 CET 2006 - kkaempf@suse.de + +- Initial libzypp integration +- V 2.13.11 + +------------------------------------------------------------------- +Fri Feb 3 11:11:09 CET 2006 - visnov@suse.cz + +- Temporary fix for build +- V 2.13.10 + +------------------------------------------------------------------- +Thu Feb 2 14:02:54 CET 2006 - sh@suse.de + +- Fixed bug #145189 (untranslated text): Added "Textdomain" + +------------------------------------------------------------------- +Tue Jan 31 11:20:19 CET 2006 - sh@suse.de + +- Fixed extra qualification +- V 2.13.9 + +------------------------------------------------------------------- +Mon Jan 30 19:12:41 CET 2006 - sh@suse.de + +- V 2.13.8 +- Implemented YQPatternSelector (feature #129) + +------------------------------------------------------------------- +Thu Jan 12 17:08:21 CET 2006 - sh@suse.de + +- V 2.13.7 +- Now starting xterm in background upon Ctrl-Alt-Shift-X + +------------------------------------------------------------------- +Wed Jan 4 19:24:05 CET 2006 - sh@suse.de + +- V 2.13.5 +- Implemented feature #3476: Left-handed mouse during installation + + now asking the user if he wants his mouse buttons switched + if he clicks the right mouse button on a push button or in a + selection box + +------------------------------------------------------------------- +Wed Jan 4 17:33:25 CET 2006 - sh@suse.de + +- Open xterm upon Ctrl-Shift-Alt-X hotkey (for debugging in inst-sys) + +------------------------------------------------------------------- +Tue Dec 20 17:08:25 CET 2005 - sh@suse.de + +- V 2.13.4 +- Fixed bug #114193: YQComboBox doesn't send valueChanged event + +------------------------------------------------------------------- +Fri Nov 18 16:09:44 CET 2005 - sh@suse.de + +- V 2.13.3 +- Added new secondary filter view "summary" to inst src filter view + +------------------------------------------------------------------- +Thu Nov 17 17:57:40 CET 2005 - sh@suse.de + +- V 2.13.2 +- Added secondary filter views to installation sources filter view: + - All Packages + - RPM groups + - Search + + +------------------------------------------------------------------- +Wed Nov 16 14:57:56 CET 2005 - sh@suse.de + +- V 2.13.2 +- New filter view in package selector: installation sources + +------------------------------------------------------------------- +Tue Oct 25 11:40:55 CEST 2005 - sh@suse.de + +- V 2.13.1 +- Merged aj's patch to fix stricter gcc4 warnings + +------------------------------------------------------------------- +Fri Sep 9 16:43:24 CEST 2005 - sh@suse.de + +- Fixed bug #114072: custom package selection lost + No longer offering the user to delete his base selection in + dependency problem dialog if he set a selection to "taboo" + the base selection depends upon +- V 2.12.12 + +------------------------------------------------------------------- +Thu Aug 25 20:26:28 CEST 2005 - sh@suse.de + +- V 2.12.11 + +------------------------------------------------------------------- +Thu Aug 25 17:26:04 CEST 2005 - mfabian@suse.de + +- Bugzilla #102978: Japanese TrueType fonts are not used in first + part of installation: fix typo in lang_conf. + +------------------------------------------------------------------- +Thu Aug 18 18:09:47 CEST 2005 - sh@suse.de + +- V 2.12.10 +- Now using llunak's updated qxembed.{cc,h} to fix bug #46495: + Keyboard focus problems with YaST2 embedded into KControl + +------------------------------------------------------------------- +Thu Jul 21 13:54:11 CEST 2005 - sh@suse.de + +- Now using `opt(`hvstretch) to restore old YQWizard layout behaviour + (centering content by default) +- V 2.12.9 + +------------------------------------------------------------------- +Wed Jul 20 15:30:48 CEST 2005 - sh@suse.de + +- Prevent segfault if there is no steps heading in the side panel +- V 2.12.8 + +------------------------------------------------------------------- +Wed Jul 20 10:46:59 CEST 2005 - jsrain@suse.cz + +- added libxml2(-devel) to neededforbuild +- 2.12.7 + +------------------------------------------------------------------- +Mon Jul 18 17:12:41 CEST 2005 - sh@suse.de + +- Removed @plugindir@/libpy2qt.la from file list in .spec file + (and removing it after "make install") + +------------------------------------------------------------------- +Mon Jul 18 14:42:19 CEST 2005 - sh@suse.de + +- Enable font switching upon UI::SetLanguage() +- V 2.12.6 + +------------------------------------------------------------------- +Tue Jul 5 17:35:18 CEST 2005 - sh@suse.de + +- Added support for background pixmaps in YQAlignment +- V 2.12.5 + +------------------------------------------------------------------- +Tue Jul 5 11:31:55 CEST 2005 - sh@suse.de + +- Fixed alignment in YQDumbTab to properly promote stretchability +- V 2.12.4 + +------------------------------------------------------------------- +Wed Jun 29 16:51:15 CEST 2005 - sh@suse.de + +- Support for `opt(`boldFont) for some widgets: + - Label + - ColoredLabel + - CheckBox + - RadioButton + +------------------------------------------------------------------- +Tue Jun 7 17:10:13 CEST 2005 - sh@suse.de + +- Reverted wizard button order + (postponed until changes can be done consistently) +- V 2.12.3 + +------------------------------------------------------------------- +Wed Apr 27 19:00:19 CEST 2005 - sh@suse.de + +- Added support for icons in selection box widget + +------------------------------------------------------------------- +Thu Apr 21 16:50:01 CEST 2005 - sh@suse.de + +- Merged selection_widget_cleanups branch to trunk: + selection widgets can now replace list items + (SelectionBox, ComboBox, MultiSelectionBox, Tree) + +------------------------------------------------------------------- +Wed Apr 6 18:44:24 CEST 2005 - visnov@suse.cz + +- gcc4 fixes (missing include and forward declaration fix) +- V 2.12.2 + +------------------------------------------------------------------- +Tue Apr 5 14:38:04 CEST 2005 - sh@suse.de + +- Merged 9.3-branch 21937:22910 to to trunk +- V 2.12.1 + +------------------------------------------------------------------- +Tue Mar 22 18:54:04 CET 2005 - sh@suse.de + +- Reverting back to old (SL 9.2) auto font sizes for bug #66498 + (Qt inst-sys default font is reverted to 9.2 font, too) +- V 2.11.13 + +------------------------------------------------------------------- +Mon Mar 21 16:24:09 CET 2005 - sh@suse.de + +- One more fix for bug #72799: Help/Steps buttons not translated +- V 2.11.12 + +------------------------------------------------------------------- +Wed Mar 16 18:30:09 CET 2005 - sh@suse.de + +- Fixed bug #72799: Help/Steps buttons not translated + Added setTextdomain() call to YQWizard +- V 2.11.11 + +------------------------------------------------------------------- +Fri Mar 11 18:11:03 CET 2005 - sh@suse.de + +- V 2.11.10 +- Fixed bug #72174: Installation font too small in 800x600 and 1024x768 + +------------------------------------------------------------------- +Fri Mar 11 13:22:52 CET 2005 - sh@suse.de + +- Fixed bug #72158: File selection box on screen shots +- V 2.11.9 + +------------------------------------------------------------------- +Fri Mar 4 12:57:32 CET 2005 - sh@suse.de + +- Increased calculated font sizes in inst-sys to compensate + for new (much smaller) default font +- Fixed bug #6649: Japanese, Chinese, Korean chars clipped +- V 2.11.8 + +------------------------------------------------------------------- +Wed Feb 23 14:59:49 CET 2005 - sh@suse.de + +- Fallback rule for reverse layout for Arabic and Hebrew + even if no translations for predefined Qt dialogs are available + +------------------------------------------------------------------- +Wed Feb 16 16:03:13 CET 2005 - sh@suse.de + +- Package selector: Keep width of left pane minimal + +------------------------------------------------------------------- +Mon Feb 14 18:43:11 CET 2005 - sh@suse.de + +- V 2.11.7 +- Fixed bug #50468: Segfault if querying current item in empty + MultiSelectionBox while recording macro + +------------------------------------------------------------------- +Fri Feb 4 19:01:54 CET 2005 - sh@suse.de + +- Fixed full-size dialog size for multihead + +------------------------------------------------------------------- +Thu Feb 3 18:27:43 CET 2005 - sh@suse.de + +- Added empty space below wizard side panel upon explicit request +- V 2.11.6 + +------------------------------------------------------------------- +Mon Jan 31 17:09:00 CET 2005 - sh@suse.de + +- V 2.11.5 +- Added "Release Notes" button + functions to YQWizard + +------------------------------------------------------------------- +Mon Jan 24 16:59:35 CET 2005 - sh@suse.de + +- Minor usability changes in wizard layout +- Added "add -debuginfo packages" menu action in pkg manager + +------------------------------------------------------------------- +Wed Dec 8 17:04:21 CET 2004 - sh@suse.de + +- Added hotkey to switch to a special high-contrast color + palette for vision impaired users: Shift-F4 + +------------------------------------------------------------------- +Wed Nov 17 13:53:29 CET 2004 - sh@suse.de + +- Improved YQWizard debugLabel() readability +- V 2.11.3 + +------------------------------------------------------------------- +Fri Nov 5 17:41:40 CET 2004 - sh@suse.de + +- Changed save_y2logs key from plain F8 to Shift-F8 + +------------------------------------------------------------------- +Thu Nov 4 19:13:47 CET 2004 - sh@suse.de + +- Added F8 hotkey to save y2logs +- V 2.11.2 + +------------------------------------------------------------------- +Tue Nov 2 14:05:39 CET 2004 - nashif@suse.de + +- Added new special widgets: YDate / YTime + +------------------------------------------------------------------- +Thu Oct 28 19:38:43 CEST 2004 - sh@suse.de + +- Fixed bug #46805: Error handling for TextEntry and ComboBox + with restricted ValidChars + +------------------------------------------------------------------- +Thu Oct 28 15:42:46 CEST 2004 - sh@suse.de + +- Fixed bug #43389: Tristate checkbox doesn't send events properly + +------------------------------------------------------------------- +Thu Oct 28 13:48:21 CEST 2004 - sh@suse.de + +- Fixed bug #43410: Timer signals close screen shot file selector + +------------------------------------------------------------------- +Mon Oct 25 17:04:43 CEST 2004 - sh@suse.de + +- Bumped version to 2.11.0 for 9.3 + +------------------------------------------------------------------- +Wed Oct 6 16:47:30 CEST 2004 - sh@suse.de + +- Dropped support for hardcoded images "suseheader" and "yast2" + Use path names and/or the wizard instead! + +------------------------------------------------------------------- +Fri Oct 1 13:46:37 CEST 2004 - sh@suse.de + +- Fixed bug #46598: YOU layout broken with 800x600 default size + Now using 0.7*screen_size as default size +- V 2.10.12 + +------------------------------------------------------------------- +Wed Sep 29 17:03:54 CEST 2004 - sh@suse.de + +- V 2.10.11 +- Fixed bug #45111: Use arrow with clock as busy cursor + +------------------------------------------------------------------- +Mon Sep 27 16:14:49 CEST 2004 - sh@suse.de + +- V 2.10.10 +- (abauer) fixed bug #44926: Xinerama full screen handling +- (mfabian) fixed unicode fonts + +------------------------------------------------------------------- +Fri Sep 24 17:10:48 CEST 2004 - sh@suse.de + +- V 2.10.9 +- Fixed bug #45772: software manager segfaults + Now catching WM_CLOSE events only for dialogs managed by the UI + +------------------------------------------------------------------- +Fri Sep 24 15:51:50 CEST 2004 - sh@suse.de + +- V 2.10.8 +- Fixed bug #46047: Table columns always too wide in Qt package selection + +------------------------------------------------------------------- +Wed Sep 22 16:35:06 CEST 2004 - sh@suse.de + +- Changed yast2-devel-packages to yast2-core-devel-packages + in neededforbuild + +------------------------------------------------------------------- +Wed Sep 15 17:23:25 CEST 2004 - sh@suse.de + +- V 2.10.7 +- Added support for ProgressBar with huge numbers (long long) +- Exchanged Unicode font (mfabian) + +------------------------------------------------------------------- +Fri Sep 10 15:07:28 CEST 2004 - sh@suse.de + +- V 2.10.6 +- Fixes for right-to-left languages (Arabic/Hebrew) + +------------------------------------------------------------------- +Mon Sep 6 11:49:01 CEST 2004 - sh@suse.de + +- V 2.10.5 +- Applied patch for bug #44145: Package EULA + +------------------------------------------------------------------- +Fri Sep 3 15:10:58 CEST 2004 - sh@suse.de + +- V 2.10.4 +- Fixed bug #44331: Sysconfig editor unusable from kcontrol + +------------------------------------------------------------------- +Wed Sep 1 18:23:27 CEST 2004 - sh@suse.de + +- V 2.10.3 +- Fixed bug #44579: YMultiProgressBar integer overflow + +------------------------------------------------------------------- +Thu Aug 26 18:05:06 CEST 2004 - sh@suse.de + +- V 2.10.2 +- Removed obsolete /usr/include/y2qt/ directory from files list + +------------------------------------------------------------------- +Mon Aug 23 16:03:28 CEST 2004 - sh@suse.de + +- V 2.10.1 +- New widget: MultiProgressMeter + +------------------------------------------------------------------- +Thu Jul 8 11:29:51 CEST 2004 - sh@suse.de + +- Fixed bug #42846: Installing unneeded header files + +------------------------------------------------------------------- +Tue Jul 6 16:44:00 CEST 2004 - sh@suse.de + +- Added "Install all matching -devel packages" to pkg selection + (mmj's idea) + +------------------------------------------------------------------- +Tue Jun 29 13:22:58 CEST 2004 - sh@suse.de + +- Fixed bug #39227: Over-long pkg status column after pkg search + with no results + +------------------------------------------------------------------- +Mon Jun 28 18:02:48 CEST 2004 - sh@suse.de + +- Fixed bug #10524: Textentry label overflow + +------------------------------------------------------------------- +Mon Jun 28 17:29:44 CEST 2004 - sh@suse.de + +- Fixed bug #40259: package selection hides search widgets + now using a combo box instead of radio buttons + +------------------------------------------------------------------- +Wed May 26 18:30:28 CEST 2004 - sh@suse.de + +- Improved support for low-color (<= 8 bit) displays (bug #40228): + Only use complex wizard pixmaps in high color modes + +------------------------------------------------------------------- +Wed May 12 16:47:32 CEST 2004 - sh@suse.de + +- Workaround for bug #35612: Layout problems with 800x600 + Now using smaller fonts in 600x600: 12/14 instead of 14/16 + +------------------------------------------------------------------- +Thu May 6 16:44:10 CEST 2004 - sh@suse.de + +- Fixed bug #40071: Obsolete doc about making screen shots + +------------------------------------------------------------------- +Tue May 4 19:07:41 CEST 2004 - sh@suse.de + +- Fixed bug #39846: Strange button layout after RestoreBackButton() +- Fixed bug #39692: Wizard tree and menu item IDs returned in wrong encoding +- V 2.9.24 + +------------------------------------------------------------------- +Tue May 4 16:10:22 CEST 2004 - gs@suse.de + +- messages from proof reading merged back + +------------------------------------------------------------------- +Fri Apr 30 13:48:01 CEST 2004 - sh@suse.de + +- Added new DumbTab widget +- V 2.9.23 + +------------------------------------------------------------------- +Tue Apr 20 14:21:14 CEST 2004 - mvidner@suse.cz + +- link against libyui to make loading from Perl work (#39192) +- 2.9.22 + +------------------------------------------------------------------- +Wed Apr 7 16:00:09 CEST 2004 - sh@suse.de + +- V 2.9.21 +- Fixed bug #38603: Excessive wizard headings make buttons disappear + +------------------------------------------------------------------- +Tue Apr 6 16:10:39 CEST 2004 - sh@suse.de + +- V 2.9.20 +- Fixed bug #36908: Dynamic font sizes during installation +- Fixed bug #37001: Dynamic default window size based on resolution + +------------------------------------------------------------------- +Tue Apr 6 12:23:30 CEST 2004 - sh@suse.de + +- V 2.9.19 +- Fixed bug #38216: No shortcut check upon Wizard::Set???Button() + +------------------------------------------------------------------- +Mon Apr 5 18:41:36 CEST 2004 - sh@suse.de + +- V 2.9.18 +- Honor environment variable KCMYAST2_CALL for KControl embedding + (no wizard decorations, suppress wizard help) + +------------------------------------------------------------------- +Sun Apr 4 22:19:57 CEST 2004 - adrian@suse.de + +- the old (bad) qxembed solution is back .. :/ + +------------------------------------------------------------------- +Fri Apr 2 16:24:00 CEST 2004 - sh@suse.de + +- License change to GPL + +------------------------------------------------------------------- +Thu Apr 1 15:35:48 CEST 2004 - sh@suse.de + +- V 2.9.16 +- Small fixes for wizard menus + trees + patch verified by cschum + +------------------------------------------------------------------- +Wed Mar 31 16:20:37 CEST 2004 - sh@suse.de + +- Fixed bug #37581: Inconsistent widgets in yast2 modules: + Added wizard menus and trees + +------------------------------------------------------------------- +Wed Mar 31 14:19:50 CEST 2004 - sh@suse.de + +- Implemented YQWizard::currentTreeSelection() for QueryWidget() + +------------------------------------------------------------------- +Wed Mar 31 13:59:51 CEST 2004 - cschum@suse.de + +- Do UTF8 conversion for patch kind tooltips (#37584). + +------------------------------------------------------------------- +Tue Mar 30 20:29:21 CEST 2004 - sh@suse.de + +- Added tree to wizard side panel (for autoyast, sysconfig-editor) + +------------------------------------------------------------------- +Mon Mar 22 17:07:52 CET 2004 - sh@suse.de + +- Fixed bug #36218: Use YaST icons for YaST windows WM decorations + +------------------------------------------------------------------- +Mon Mar 22 16:46:18 CET 2004 - sh@suse.de + +- Fixed bug #35625: Wizard button order + Restored old button order + +------------------------------------------------------------------- +Wed Mar 17 15:07:36 CET 2004 - sh@suse.de + +- Fixed bug #35645: Wizard layout looks strange + added HVCenter() around ReplacePoint() + +------------------------------------------------------------------- +Wed Mar 17 00:35:10 CET 2004 - nashif@suse.de + +- #if 0 not working hasSmallDecorations completely + +------------------------------------------------------------------- +Tue Mar 16 18:05:46 CET 2004 - sh@suse.de + +- Minimal approach fix for bug #33584: Show license agreements +- V 2.9.12 + +------------------------------------------------------------------- +Fri Mar 12 23:25:48 CET 2004 - sh@suse.de + +- Enabled shortcut checking for wizard buttons +- Integrated wizard buttons in YQDialog default button handling +- Adapted to const ref fix in libyui for all widget constructors +- V 2.9.11 + +------------------------------------------------------------------- +Thu Mar 11 18:53:02 CET 2004 - sh@suse.de + +- Fixed bug #35611: &product; macro not expanded +- Fixed bug #35623: Allow status "protected" for YOU patches + +------------------------------------------------------------------- +Wed Mar 10 15:55:04 CET 2004 - lnussel@suse.de + +- New conflict resolution remove referers (#24306) +- V 2.9.10 + +------------------------------------------------------------------- +Wed Mar 10 01:45:27 CET 2004 - sh@suse.de + +- New wizard +- V 2.9.9 + +------------------------------------------------------------------- +Thu Mar 4 19:10:51 CET 2004 - sh@suse.de + +- Fixed bug #34909: Pkg Mgr "auto-changed pkgs" too large for screen + +------------------------------------------------------------------- +Mon Mar 1 18:39:22 CET 2004 - sh@suse.de + +- Save screen shot name if recording macro + +------------------------------------------------------------------- +Sat Feb 28 14:16:49 CET 2004 - sh@suse.de + +- V 2.9.5 +- more fixes for improved GUI + +------------------------------------------------------------------- +Tue Feb 10 20:36:34 CET 2004 - arvin@suse.de + +- include YQWizard.h in tar-ball + +------------------------------------------------------------------- +Tue Feb 10 18:45:36 CET 2004 - sh@suse.de + +- V 2.9.3 +- Merged wizard-widget-branch to HEAD with NI +- Misc small fixes + +------------------------------------------------------------------- +Wed Feb 4 17:42:03 CET 2004 - sh@suse.de + +- V 2.9.2 +- New embedding: No more QXEmbed, now via KPart (external program) + +------------------------------------------------------------------- +Thu Jan 29 19:49:03 CET 2004 - sh@suse.de + +- Fixed Y2Component handling + +------------------------------------------------------------------- +Tue Jan 27 18:05:43 CET 2004 - sh@suse.de + +- V 2.9.1 +- Adapted to new interpreter (visnov@suse.cz) +- Adapted to new libyui naming scheme +- Consistent naming scheme + +------------------------------------------------------------------- +Fri Nov 14 11:30:35 CET 2003 - mvidner@suse.cz + +- adapted to doxygen + +------------------------------------------------------------------- +Tue Oct 21 16:03:20 CEST 2003 - sh@suse.de + +- Fixed bug #32510: Excess initial SelBox SelectionChanged event + +------------------------------------------------------------------- +Fri Oct 10 12:24:00 CEST 2003 - sh@suse.de + +- V 2.9.0 + +- Applied cschum's fix for bug #31965: + Wrong encoding in YOU "display raw package info" dialog + +------------------------------------------------------------------- +Fri Sep 19 17:19:13 CEST 2003 - sh@suse.de + +- V 2.8.15 + +- Applied visnov's patch to fix bug #5547: IntField value + +- Fixed bug #31015 thanks to llunak: "Solving dependencies" + popup without WM decoreations + +------------------------------------------------------------------- +Wed Sep 17 17:59:15 CEST 2003 - sh@suse.de + +- V 2.8.14 + +------------------------------------------------------------------- +Wed Sep 17 15:31:22 CEST 2003 - sh@suse.de + +- Fixed bug #30236: Bad fullscreen geometry for some window managers + +------------------------------------------------------------------- +Wed Sep 17 14:55:35 CEST 2003 - sh@suse.de + +- Fixed bug #31155: Busy cursor in disk space warning dialog + +------------------------------------------------------------------- +Wed Sep 17 13:44:04 CEST 2003 - sh@suse.de + +- Fixed bug #30513: Some PkgMgr popup dialogs too large in 640x480 + +------------------------------------------------------------------- +Wed Sep 17 12:37:02 CEST 2003 - sh@suse.de + +- Fixed bug #31047: File selection dialog untranslated + +------------------------------------------------------------------- +Mon Sep 15 16:15:20 CEST 2003 - sh@suse.de + +- V 2.8.13 +- Better fix for bug #30500 by jw@suse.de + +------------------------------------------------------------------- +Fri Sep 12 16:51:37 CEST 2003 - sh@suse.de + +- V 2.8.12 +- Interim fix for bug #30500 + +------------------------------------------------------------------- +Mon Sep 8 15:43:54 CEST 2003 - sh@suse.de + +- V 2.8.11 +- Fixed bug #26494: Keyboard focus when embedded into KControl: + Reimported the latest version of QXEmbed + +------------------------------------------------------------------- +Fri Sep 5 17:01:14 CEST 2003 - sh@suse.de + +- V 2.8.10 +- Fixed bug #30151: Enable starting pkg mgr in search mode + by default in installed system + +------------------------------------------------------------------- +Thu Sep 4 17:14:49 CEST 2003 - sh@suse.de + +- V 2.8.9 +- Fixed bug #29529: Package links (again): + Discard trailing slashes in URL + +------------------------------------------------------------------- +Tue Sep 2 13:39:42 CEST 2003 - sh@suse.de + +- Fixed bug #23660: RichText widget eats [Return] + +------------------------------------------------------------------- +Mon Sep 1 18:15:45 CEST 2003 - sh@suse.de + +- Fixed bug #27336: Combo box for YOU patch selection +- Fixed bug #27437: Display YOU pre/post scripts / extra files + +------------------------------------------------------------------- +Mon Sep 1 16:34:42 CEST 2003 - sh@suse.de + +- V 2.8.8 +- Fixed bug #29529: Package links + +------------------------------------------------------------------- +Fri Aug 29 13:12:22 CEST 2003 - sh@suse.de + +- V 2.8.7 +- Fixed bug #29603 - fonts.dir should have %verify in .spec file + +------------------------------------------------------------------- +Wed Aug 27 12:20:32 CEST 2003 - sh@suse.de + +- V 2.8.6 +- Removed qApp->unlock() at end of YUIQt constructor: + No more QMutex warning in log + +------------------------------------------------------------------- +Tue Aug 12 15:02:25 CEST 2003 - gs@suse.de + +- V 2.8.5 +- merge texts from proofread + +------------------------------------------------------------------- +Tue Jul 15 17:24:50 CEST 2003 - sh@suse.de + +- V 2.8.4 +- Lots of internal reworking +- Completely reworked event handling +- No more self-generated events during widget creation / ChangeWidget +- Basic support for right-to-left languages like Arabic / Hebrew + (not perfect yet) + +------------------------------------------------------------------- +Tue Jun 10 15:30:13 CEST 2003 - sh@suse.de + +- V 2.8.3 +- Don't build obsolete standalone server component "qt" any more +- Don't install header files: they are not packaged anyway + +------------------------------------------------------------------- +Wed Jun 4 11:25:52 CEST 2003 - sh@suse.de + +- V 2.8.2 +- Fixed yet another ambituous overload due to changed Qt lib + +------------------------------------------------------------------- +Fri May 23 11:59:39 CEST 2003 - sh@suse.de + +- Fixed build problems due to new Qt lib (ambiguous overload) +- V 2.8.1 + +------------------------------------------------------------------- +Thu Apr 10 15:29:01 CEST 2003 - sh@suse.de + +- Fixed bug #25419: Qt PkgMgr shows correct version downgrades red + +------------------------------------------------------------------- +Tue Apr 8 13:39:02 CEST 2003 - sh@suse.de + +- Fixed bug #26155: Hiding YOU patches marked for update + +------------------------------------------------------------------- +Wed Mar 12 18:39:26 CET 2003 - sh@suse.de + +- Don't force *.sel extension for pkg lists + +------------------------------------------------------------------- +Wed Mar 12 18:16:25 CET 2003 - sh@suse.de + +- Enable mounting floppy for pkg list import / export + +------------------------------------------------------------------- +Mon Mar 10 18:57:03 CET 2003 - sh@suse.de + +- Fixed bug #25011: Force dependency check on startup in PkgMgr + +------------------------------------------------------------------- +Mon Mar 10 17:37:33 CET 2003 - sh@suse.de + +- Update disk usage in PkgMgr after selection dependency solving + +------------------------------------------------------------------- +Mon Mar 10 15:47:59 CET 2003 - sh@suse.de + +- V 2.7.15 +- Fixed bug #24981: Can't search for non-ASCII chars in Qt PkgMgr + +------------------------------------------------------------------- +Thu Mar 6 17:49:30 CET 2003 - sh@suse.de + +- Fixed bug #24615: "checking dependencies" popup not centered + +------------------------------------------------------------------- +Wed Mar 5 21:47:35 CET 2003 - sh@suse.de + +- Fixed bug #24707: QListView tooltips only on right scroll bar + +------------------------------------------------------------------- +Fri Feb 28 17:23:38 CET 2003 - sh@suse.de + +- V 2.7.14 + +------------------------------------------------------------------- +Fri Feb 28 16:41:20 CET 2003 - sh@suse.de + +- Fixed bug #22513 - language selection loses some key events + +------------------------------------------------------------------- +Fri Feb 28 15:27:58 CET 2003 - sh@suse.de + +- Use new 'floppyDevice' parameter for PackageSelector + +------------------------------------------------------------------- +Fri Feb 28 12:34:31 CET 2003 - sh@suse.de + +- Fixed bug #24388: YQFrame repaint one pixel off in both dimensions + +------------------------------------------------------------------- +Thu Feb 27 18:03:03 CET 2003 - sh@suse.de + +- Fixed bug #24445: Missing status update when importing pkg list + +------------------------------------------------------------------- +Thu Feb 27 17:29:29 CET 2003 - sh@suse.de + +- Fixed bug #23368: kcontrol embedding fails if first dialog is a popup + +------------------------------------------------------------------- +Wed Feb 26 19:26:29 CET 2003 - sh@suse.de + +- Fixed bug #23574: "Checking dependencies" popup + +------------------------------------------------------------------- +Wed Feb 26 14:48:55 CET 2003 - sh@suse.de + +- Fixed bug #24274: Wrong disk initial usage display + +------------------------------------------------------------------- +Tue Feb 25 17:32:45 CET 2003 - sh@suse.de + +- Workaround for bug #24088: Leftover busy cursor in root window + +------------------------------------------------------------------- +Tue Feb 25 16:28:13 CET 2003 - sh@suse.de + +- Fixed bug #24255: Multiple search in yast2-qt package + +------------------------------------------------------------------- +Tue Feb 25 14:50:18 CET 2003 - sh@suse.de + +- Fixed wrong tool tip "this version is installed in your system" + (for all versions) in package manager "versions" view + +------------------------------------------------------------------- +Tue Feb 25 14:35:11 CET 2003 - sh@suse.de + +- Fixed bug #23855: Asking for loading Modules does not have focus + +------------------------------------------------------------------- +Mon Feb 24 17:35:40 CET 2003 - sh@suse.de + +- V 2.7.13 +- Fixed bug #23923: Can't save package selection + +------------------------------------------------------------------- +Thu Feb 20 17:58:39 CET 2003 - sh@suse.de + +- Fixed bug #23868: Handle preformatted notify texts + +------------------------------------------------------------------- +Thu Feb 20 17:14:07 CET 2003 - sh@suse.de + +- "Obsolete" dependency conflicts cannot be ignored + (RPM always deletes the obsoleted package) + +------------------------------------------------------------------- +Thu Feb 20 16:38:11 CET 2003 - sh@suse.de + +- Fixed bug #23914: Package manager crashes when opening "package" + menu and package list is empty (e.g., empty search result) + +------------------------------------------------------------------- +Wed Feb 19 16:18:06 CET 2003 - sh@suse.de + +- Fixed bug #23755: Busy cursor in file selection dialogs + +------------------------------------------------------------------- +Wed Feb 19 14:58:39 CET 2003 - sh@suse.de + +- Fixed bug #23654: Window partially invisible + +------------------------------------------------------------------- +Wed Feb 19 11:52:39 CET 2003 - sh@suse.de + +- Fixed bug #23770: Always show automatically selected pkgs, even + during base installation + +------------------------------------------------------------------- +Tue Feb 18 11:47:27 CET 2003 - sh@suse.de + +- New "protected" icons by Ken + +------------------------------------------------------------------- +Mon Feb 17 17:45:11 CET 2003 - sh@suse.de + +- V 2.7.12 +- Fixed broken "protected" actions +- Fixed preliminary "protected" icons + +------------------------------------------------------------------- +Fri Feb 14 15:40:11 CET 2003 - sh@suse.de + +- V 2.7.11 +- Fixed bug #23577: Popups can be clicked into the background + +------------------------------------------------------------------- +Fri Feb 14 12:33:35 CET 2003 - sh@suse.de + +- Fixed bug #23650: Confusion about "Export List to Text File": + Moved this function from "Extras" menu to package list context + menu + +- Disabled pkg status "protected" for selections / YOU patches + +------------------------------------------------------------------- +Thu Feb 13 15:48:21 CET 2003 - sh@suse.de + +- Suppress "YaST2@linux" window title (bug #23584) + +------------------------------------------------------------------- +Thu Feb 13 13:18:23 CET 2003 - sh@suse.de + +- Improved default button behaviour +- Removed junk logging + +------------------------------------------------------------------- +Mon Feb 10 17:23:28 CET 2003 - sh@suse.de + +- V 2.7.10 +- New package status "protected" + +------------------------------------------------------------------- +Mon Feb 10 15:30:27 CET 2003 - sh@suse.de + +- V 2.7.9 +- Don't force Unicode font +- Show different icons in package manager for autoinstall etc. by + selection and autoinstall etc. by dependencies + +------------------------------------------------------------------- +Fri Jan 31 18:11:03 CET 2003 - sh@suse.de + +- V 2.7.8 +- Adapted to changed PkgDep::RelInfo API + +------------------------------------------------------------------- +Wed Jan 29 17:11:07 CET 2003 - sh@suse.de + +- V 2.7.7 +- User messages back from proofreading +- Show auto-packages on demand in package manager + +------------------------------------------------------------------- +Mon Jan 27 17:10:32 CET 2003 - sh@suse.de + +- V 2.7.6 +- Added "rpm-devel" to "neededforbuild" +- Support enabling/disabling for container widgets as well +- Show "auto changes" popup in package manager + +- YOU mode package manager changes: + - Show total download size + - Dropped "Packages" menu (pkgs are read-only there) + - Added "YOU Patches" menu instead + - Addes "Show raw patch info" dialog + +------------------------------------------------------------------- +Tue Jan 21 18:06:15 CET 2003 - sh@suse.de + +- V 2.7.5 +- Use textdomain "qt-packages" for all texts to avoid textdomain + name clashes +- New command line options --fullscreen, --noborder +- Fixed busy cursors + +------------------------------------------------------------------- +Mon Jan 20 20:00:44 CET 2003 - sh@suse.de + +- Package manager enhancements: + - Enhanced feedback while checking dependencies + - Changed default to "off" for auto dependency check + - Save/load ignored dependency conflicts to/from + /var/adm/YaST/ignored-conflicts +- Bumped version to 2.7.4 + +------------------------------------------------------------------- +Tue Jan 14 19:05:09 CET 2003 - sh@suse.de + +- Package manager enhancements: + - Added menu bar + - Added bubble help for all kinds of lists + - Rearranged pkg list columns (moved summary left) + - Re-enabled source RPM handling + - Added currently installed version to "versions" view + (non-editable) + - Status change actions for "all in current list" + - Show disk space for all available partitions + - Added "installation summary" filter view + - Dependency checking now for selections, too + - Added symbols help + - Added special keys help + - Auto check is now "off" by default +- Bumped version to 2.7.3 + +------------------------------------------------------------------- +Tue Dec 03 16:37:31 CET 2002 - arvin@suse.de + +- added curl-devel and openssl-devel to neededforbuild + +------------------------------------------------------------------- +Mon Nov 11 17:58:23 CET 2002 - sh@suse.de + +- Support for buttons with icons and text + +------------------------------------------------------------------- +Fri Nov 8 16:18:33 CET 2002 - sh@suse.de + +- Fixed bug #20326: [Cancel] doesn't abandon changes in package mgr + +------------------------------------------------------------------- +Thu Nov 7 20:04:33 CET 2002 - sh@suse.de + +- Fixed bug #16339: [Space] doesn't trigger UserInput() in YTable + +------------------------------------------------------------------- +Thu Nov 7 19:46:18 CET 2002 - sh@suse.de + +- Fixed bug #20539: Screen shot function causes unnecessary exits +- Fixed bug #8362: File selection box for screen shots +- Fixed possible security hole: Screen shots in /tmp by default + +------------------------------------------------------------------- +Thu Nov 7 13:31:42 CET 2002 - sh@suse.de + +- Fixed bug #19389: Frame widget shows keyboard shortcuts, but + can't handle any + +------------------------------------------------------------------- +Fri Sep 20 16:23:32 CEST 2002 - msvec@suse.cz + +- added missing textdomain +- added missing files to POTFILES +- 2.6.23 + +------------------------------------------------------------------- +Fri Sep 13 14:56:41 CEST 2002 - sh@suse.de + +- V 2.6.22 +- Disabled selecting source RPMs until it works further down + +------------------------------------------------------------------- +Thu Sep 12 14:24:47 CEST 2002 - sh@suse.de + +- V 2.6.21 +- Show DelNotify popup even if pkg not installed yet +- Fixed bug #19333: Can't get out of pkg dialog with "Accept" + +------------------------------------------------------------------- +Wed Sep 11 17:48:32 CEST 2002 - sh@suse.de + +- Fixed bug #19419: Y2Pkg hangs on middle mouse click + This is really a Qt bug. Introduced workaround for that. + +------------------------------------------------------------------- +Wed Sep 11 14:07:50 CEST 2002 - sh@suse.de + +- Fixed bug #19390: Sometimes no keyboard focus without a mouse + +------------------------------------------------------------------- +Tue Sep 10 22:21:48 CEST 2002 - sh@suse.de + +- V 2.6.19 + +------------------------------------------------------------------- +Tue Sep 10 21:31:55 CEST 2002 - sh@suse.de + +- Fixed sort by source RPM status in pkg list + +------------------------------------------------------------------- +Tue Sep 10 21:01:37 CEST 2002 - sh@suse.de + +- Change packager priorities: Prefer candidateObj over installedObj + so the user gets to see his native language more often in pkg + descriptions (RPM DB is English only) + +------------------------------------------------------------------- +Tue Sep 10 20:06:11 CEST 2002 - sh@suse.de + +- V 2.6.18 +- New details view: Dependencies +- Bugfix: No initial dependency check in YOU mode +- Show patch sizes in YOU mode + +------------------------------------------------------------------- +Tue Sep 10 18:55:25 CEST 2002 - sh@suse.de + +- V 2.6.17 +- Fixed 'Accept doesn't leave pkg selection' bug +- New view for selecting different versions to install + +------------------------------------------------------------------- +Mon Sep 9 20:01:22 CEST 2002 - sh@suse.de + +- V 2.6.16 +- Prepared disk usage display (still disabled for internal reasons) +- Lots of small fixes + +------------------------------------------------------------------- +Mon Sep 9 18:46:35 CEST 2002 - sh@suse.de + +- Fixed minimumSize() hints for YQPkg* - works now in 640x480 +- Special icon for delete pkg conflict (tackat) +- Brighter colors for over-long conflict lists ("999 more...") + +------------------------------------------------------------------- +Mon Sep 9 02:20:37 CEST 2002 - sh@suse.de + +- V 2.6.15 + +Package manager changes: + +- Really ignore conflicts when user chooses so +- Auto dependency check on startup +- "Ignore All" button in dependency conflict dialog +- Show InsNotify / DelNotify +- Search for provides / requires +- Search immediately upon [Return] +- Show pkgs without any RPM group in "zzz All" +- Ignore WM_CLOSE for package selection +- Prepared translation stuff + +------------------------------------------------------------------- +Fri Sep 6 17:13:10 CEST 2002 - sh@suse.de + +- V 2.6.14 +- Search view +- Update problem list view +- Misc minor stuff + +------------------------------------------------------------------- +Thu Sep 5 21:04:18 CEST 2002 - sh@suse.de + +- V 2.6.13 +- Dependency resolving works - including conflicts + +------------------------------------------------------------------- +Mon Sep 2 19:58:07 CEST 2002 - sh@suse.de + +- V 2.6.12 +- Fixed crash with inconsistent YOU data + +------------------------------------------------------------------- +Mon Sep 2 18:55:01 CEST 2002 - sh@suse.de + +- V 2.6.11 +- Fixed confusing selection status handling + +------------------------------------------------------------------- +Mon Sep 2 18:15:01 CEST 2002 - sh@suse.de + +- V 2.6.10 +- Generalized internal pkg classes +- YOU UI now usable +- colorized lists +- context menus +- lots of small stuff + +------------------------------------------------------------------- +Tue Aug 27 19:15:23 CEST 2002 - sh@suse.de + +- V 2.6.9 +- Pkg selection now usable (no dependency checking/solving yet) + +------------------------------------------------------------------- +Wed Aug 21 17:51:27 CEST 2002 - kkaempf@suse.de + +- fix "make dist" +- V 2.6.8 + +------------------------------------------------------------------- +Mon Aug 19 19:03:14 CEST 2002 - sh@suse.de + +- V 2.6.7 +- New package management + +------------------------------------------------------------------- +Fri Aug 9 18:51:05 CEST 2002 - sh@suse.de + +- V 2.6.6 +- Fixed table sorting with `opt(`keepSorting) + +------------------------------------------------------------------- +Sat Aug 03 15:17:56 CEST 2002 - arvin@suse.de + +- write qt warnings to y2log (bug #17161) + +------------------------------------------------------------------- +Mon Jul 15 18:21:50 CEST 2002 - arvin@suse.de + +- workaround for timing problem + +------------------------------------------------------------------- +Mon Jul 8 16:54:24 CEST 2002 - mvidner@suse.cz + +- Provides/Obsoletes also the devel subpackage + +------------------------------------------------------------------- +Wed Jul 03 12:26:33 CEST 2002 - msvec@suse.cz + +- devel sub-package not neeeded + +------------------------------------------------------------------- +Mon Jun 24 13:40:16 CEST 2002 - arvin@suse.de + +- renamed from yast2-ui-qt to yast2-qt + +------------------------------------------------------------------- +Thu Jun 06 14:55:22 CEST 2002 - arvin@suse.de + +- don't link -lstdc++ explicitly + +------------------------------------------------------------------- +Fri May 24 17:24:23 CEST 2002 - arvin@suse.de + +- fixed locking so we can use multi threaded version of qt + +------------------------------------------------------------------- +Mon Apr 08 17:19:43 CEST 2002 - arvin@suse.de + +- fixes for gcc 3.1 + +------------------------------------------------------------------- +Fri Mar 22 17:11:40 CET 2002 - kkaempf@suse.de + +- pass callback information from component stub to interpreter + (#15311). + +------------------------------------------------------------------- +Mon Feb 25 18:18:36 CET 2002 - sh@suse.de + +- V 2.5.16 +- Applied Michal Svec's security patch + +------------------------------------------------------------------- +Mon Feb 25 16:28:54 CET 2002 - sh@suse.de + +- V 2.5.15 +- Fixed wish #13876: Host name in window title bar + +------------------------------------------------------------------- +Wed Feb 20 13:47:27 CET 2002 - sh@suse.de + +- V 2.5.14 +- Fixed bug #13604: Change fallback title image to new design + +------------------------------------------------------------------- +Mon Feb 18 18:22:55 CET 2002 - sh@suse.de + +- V 2.5.13 +- Fixed bug #13131: SetFocus on a TextEntry should select its contents + +------------------------------------------------------------------- +Thu Feb 14 12:19:19 CET 2002 - sh@suse.de + +- V 2.5.12 +- Fixed changed Qt-3 behaviour: Correct handling for tristate + checkbox + +------------------------------------------------------------------- +Wed Feb 13 17:56:05 CET 2002 - sh@suse.de + +- V 2.5.11 +- Fixed ColoredLabel alignment: Left and vertically centered + +------------------------------------------------------------------- +Fri Feb 8 17:06:46 CET 2002 - sh@suse.de + +- V 2.5.10 +- New YQImage constructor: Load images locally from within the UI +- Support YQImage `opt(`tiled, `scaleToFit) +- Load images in background pixmap + +------------------------------------------------------------------- +Thu Feb 7 17:18:10 CET 2002 - sh@suse.de + +- V 2.5.9 +- Better check for YaST2 special keys (Ctrl-Shift-Alt) + +------------------------------------------------------------------- +Fri Jan 25 17:48:15 CET 2002 - sh@suse.de + +- V 2.5.8 +- Added MNG support for Image widget + +------------------------------------------------------------------- +Thu Jan 24 21:29:48 CET 2002 - sh@suse.de + +- V 2.5.6 +- New optional widget: ColoredLabel + +------------------------------------------------------------------- +Tue Jan 22 18:33:52 CET 2002 - sh@suse.de + +- V 2.5.6 +- Support new `opt(`keepSorting) for YTable widget + +------------------------------------------------------------------- +Tue Jan 22 17:39:10 CET 2002 - sh@suse.de + +- Show initial selection (first item) + +------------------------------------------------------------------- +Tue Jan 22 16:42:26 CET 2002 - sh@suse.de + +- Fixed bug #12833: Arbitrary table sorting with Qt3 + +------------------------------------------------------------------- +Tue Jan 8 15:58:58 CET 2002 - sh@suse.de + +- V 2.5.5 +- Added qt3-non-mt to neededforbuild + +------------------------------------------------------------------- +Fri Dec 14 15:12:52 CET 2001 - sh@suse.de + +- V 2.5.4 +- Ported to Qt 3.x + +------------------------------------------------------------------- +Tue Dec 11 14:59:32 CET 2001 - sh@suse.de + +- V 2.5.3 +- Added hyperlink support to RichText widget + +------------------------------------------------------------------- +Thu Nov 15 13:30:47 CET 2001 - sh@suse.de + +- V 2.5.2 +- added proper #include for tolower() + +------------------------------------------------------------------- +Fri Nov 9 01:41:55 CET 2001 - ro@suse.de + +- use qt-devel-packages in neededforbuild + +------------------------------------------------------------------- +Tue Nov 6 18:22:15 CET 2001 - sh@suse.de + +- V 2.5.1 +- Fixed YQPushButton for automatic shortcut check / resolving + +------------------------------------------------------------------- +Thu Sep 27 17:38:26 CEST 2001 - sh@suse.de + +- Fixed bug #11350: WM close button closes win, but keeps app alive + +------------------------------------------------------------------- +Mon Sep 24 17:42:42 CEST 2001 - sh@suse.de + +- Don't set root window cursor to busy cursor +- V 2.4.17 + +------------------------------------------------------------------- +Fri Sep 21 18:16:34 CEST 2001 - sh@suse.de + +- Fixed bug #11073: busy cursor unreliable + The Qt UI now makes its own busy cursors rather than Qt's. +- V 2.4.16 + +------------------------------------------------------------------- +Tue Sep 18 14:11:41 CEST 2001 - sh@suse.de + +- Fixed bug #8534: Spurious in SuSEconfig protocoll +- V 2.4.15 + +------------------------------------------------------------------- +Mon Sep 17 18:33:09 CEST 2001 - sh@suse.de + +- Fixed bug #10754: Large popup windows partially invisible +- V 2.4.14 + +------------------------------------------------------------------- +Fri Sep 14 15:28:34 CEST 2001 - sh@suse.de + +- Fixed bug #10614: Ikea mode triggered on Alt-W +- Consistent default button handling even in selbox +- V 2.4.13 + +------------------------------------------------------------------- +Wed Sep 12 16:42:19 CEST 2001 - sh@suse.de + +- Only one window for all `opt(`defaultsize) dialogs +- Fixed bug #9915: Default button keyboard focus unreliable +- V 2.4.12 + +------------------------------------------------------------------- +Thu Sep 6 18:22:38 CEST 2001 - sh@suse.de + +- V 2.4.11 + Implemented new UI builtin: GetDisplayInfo() + +------------------------------------------------------------------- +Wed Sep 5 11:50:12 CEST 2001 - sh@suse.de + +- V 2.4.10 + All headers "ydoc" compliant - fixed build problems + +------------------------------------------------------------------- +Tue Sep 4 18:29:18 CEST 2001 - sh@suse.de + +- V 2.4.9 + improved focus handling - (possible) fix for bug #9915 + +------------------------------------------------------------------- +Wed Jul 11 15:31:05 CEST 2001 - sh@suse.de + +- V 2.4.8 + added glyph support (for new UI builtin Glyph() ) + +------------------------------------------------------------------- +Sat Jul 07 16:48:47 CEST 2001 - arvin@suse.de + +- neededforbuild += freetype2 + +------------------------------------------------------------------- +Thu Jul 5 11:07:33 CEST 2001 - kkaempf@suse.de + +- drop yast2-core-translator from neededforbuild + +------------------------------------------------------------------- +Wed Jun 27 18:06:42 CEST 2001 - sh@suse.de + +- V 2.4.5 + New widget: MultiSelectionBox + +------------------------------------------------------------------- +Tue Jun 26 19:25:39 CEST 2001 - sh@suse.de + +- V 2.4.4 + New widget: MenuButton + +------------------------------------------------------------------- +Tue Jun 19 16:17:33 CEST 2001 - sh@suse.de + +- Implemented wish #8357: Restrict input characters + new widget property `ValidChars for TextEntry, ComboBox + +------------------------------------------------------------------- +Tue Jun 19 14:58:31 CEST 2001 - kkaempf@suse.de + +- implemented callback mechanism + +------------------------------------------------------------------- +Tue Jun 12 14:50:45 CEST 2001 - sh@suse.de + +- V 2.4.2 + Changed BarGraph variable substitution from "%d" to "%1" + to become sformat() compatible + +------------------------------------------------------------------- +Fri Jun 8 15:58:39 CEST 2001 - sh@suse.de + +- V 2.4.1 +- Implemented wish #7259: Automatically set `opt(`decorated) + for non-defaultsize dialogs +- Implemented wish #8363: UserInput() returns special ID + 'debugHotkey when Ctrl-Alt-Shift-D is pressed + +------------------------------------------------------------------- +Fri Jun 8 14:47:22 CEST 2001 - sh@suse.de + +- V 2.4.0 + Macro recorder + +------------------------------------------------------------------- +Mon May 14 17:21:21 CEST 2001 - sh@suse.de + +- V 2.3.14: Fixed bug #8254, 2nd part: Bad czech charset in resizer + Work around QString::sprintf() limitations (Latin1 compatible + only), use QString::arg() instead + +------------------------------------------------------------------- +Mon May 14 14:20:44 CEST 2001 - sh@suse.de + +- V 2.3.13: Fixed bug #8254: Bad czech charset in resizer + Added fromUTF8() call for explicit string conversion + +------------------------------------------------------------------- +Tue May 8 12:10:05 CEST 2001 - kkaempf@suse.de + +- provide split-alias entries for older versions + +------------------------------------------------------------------- +Mon Apr 30 16:17:05 CEST 2001 - kkaempf@suse.de + +- provide "YaST2-UI" + +------------------------------------------------------------------- +Mon Apr 30 15:21:03 CEST 2001 - sh@suse.de + +- V 2.3.10 + (partial) fix for bug #7004: + Top-left align image in YImage widgets + +------------------------------------------------------------------- +Thu Apr 19 19:14:02 CEST 2001 - sh@suse.de + +- V 2.3.9 + Fixed bugs in RadioBox behaviour: + - second click on the same button will no longer deactivate it + - accept only one active RadioButton on RadioBox creation + (all but the last will be deactivated) + +------------------------------------------------------------------- +Thu Apr 12 13:03:47 CEST 2001 - sh@suse.de + +- V 2.3.8 + Improved RadioBox keyboard navigation: + No longer rely on QButtonGroup, own implementation of RadioBox + behaviour -> no longer strange key mappings (cursor keys rather + than tab as everybody expects) + +------------------------------------------------------------------- +Thu Apr 5 19:52:11 CEST 2001 - sh@suse.de + +- new options zeroWidth, zeroHeight for image widget + to avoid complaints about title graphics not getting their + "nice size" of 2000 pixels wide +- V 2.3.7 + +------------------------------------------------------------------- +Thu Mar 29 14:33:53 CEST 2001 - sh@suse.de + +- moved shared libs from /usr/lib/YaST2/lib to /usr/lib +- V 2.3.5 + +------------------------------------------------------------------- +Thu Mar 29 09:25:54 CEST 2001 - kkaempf@suse.de + +- dont install lib, only plugin is needed + +------------------------------------------------------------------- +Tue Mar 27 15:56:27 CEST 2001 - kkaempf@suse.de + +- minimize file list for yast2-ui-qt package + +------------------------------------------------------------------- +Fri Mar 23 12:44:29 CET 2001 - arvin@suse.de + +- moved documentation to packages/yast2-ui-qt + +------------------------------------------------------------------- +Sun Mar 18 23:24:19 CET 2001 - ro@suse.de + +- fixed neededforbuild + +------------------------------------------------------------------- +Mon Mar 12 13:15:05 CET 2001 - arvin@suse.de + +- Strip plugin in package. + +------------------------------------------------------------------- +Thu Mar 8 18:11:07 CET 2001 - arvin@suse.de + +- Added unicode fonts (previously in y2base). + +------------------------------------------------------------------- +Sat Jan 27 21:19:35 CET 2001 - arvin@suse.de + +- package split y2qt / y2qt-devel + +------------------------------------------------------------------- +Tue Jan 23 11:12:09 CET 2001 - sh@suse.de + +- prevent crash upon window manager close + +------------------------------------------------------------------- +Mon Jan 22 13:31:18 CET 2001 - sh@suse.de + +- V2.2.10 +- New default title graphics from that are + no longer cut off at the right at 640x480 +- Renamed suseheader.xpm to yast2.xpm +- Use yast2.xpm for both `Image(`suseheader) and `Image(`yast2) +- Removed obsolete XPM images that were never used anyway + +------------------------------------------------------------------- +Tue Jan 16 11:54:04 CET 2001 - sh@suse.de + +- V2.2.9 +- New default image for Image(`suseheader): 2000 pixels wide + +------------------------------------------------------------------- +Fri Jan 12 21:57:42 CET 2001 - sh@suse.de + +- V2.2.8 +- Added module QXEmbed from Qt/KDE2 (TrollTech / LGPL) + to enable reliable KDE2 control center integration: + keyboard focus now works when running embedded in kcmshell + (fix for bug #5475) + +------------------------------------------------------------------- +Thu Jan 11 16:10:28 CET 2001 - sh@suse.de + +- V2.2.7 +- Hide YQTextEntry label if empty label specified + -> no empty space above TextEntry widgets without label + +------------------------------------------------------------------- +Tue Dec 19 14:58:33 CET 2000 - ma@suse.de + +- V2.2.6 +- pass YCPstrings to ui specific widgets + +------------------------------------------------------------------- +Mon Dec 18 19:35:30 CET 2000 - sh@suse.de + +- New optional widget: DownloadProgress +- V2.2.5 + +------------------------------------------------------------------- +Fri Dec 8 15:54:12 CET 2000 - sh@suse.de + +- More reliable nicesize() and setSize() behaviour for + SelectionBox and TextEntry + -> no more cut-off pixel lines at the bottom +- V2.2.4 + +------------------------------------------------------------------- +Tue Dec 5 16:51:05 CET 2000 - sh@suse.de + +- New widget: MultiLineEdit +- Dialogs can no longer exceed screen dimensions +- V2.2.3 + +------------------------------------------------------------------- +Tue Nov 28 17:23:30 CET 2000 - arvin@suse.de + +- Fixed ComboBox layout errors on resize. + +------------------------------------------------------------------- +Tue Nov 28 15:43:07 CET 2000 - kkaempf@suse.de + +- add libmng-devel to neededforbuild + +------------------------------------------------------------------- +Thu Nov 16 17:18:52 CET 2000 - kkaempf@suse.de + +- split library and plugin + +------------------------------------------------------------------- +Mon Nov 13 11:21:34 CET 2000 - sh@suse.de + +- Removed glx, glx-devel, mesa from .spec.in - Qt no longer needs it +- V2.1.8 + +------------------------------------------------------------------- +Thu Nov 9 12:46:05 CET 2000 - kkaempf@suse.de + +- static plugin only + +------------------------------------------------------------------- +Tue Nov 7 18:43:30 CET 2000 - sh@suse.de + +- re-enabled static libs + new widgets: LogView, IntField + moved completely to new logging + version 2.1.6 + +------------------------------------------------------------------- +Fri Nov 3 08:54:17 CET 2000 - kkaempf@suse.de + +- adapt neededforbuild for new qt + +------------------------------------------------------------------- +Thu Nov 2 11:43:34 CET 2000 - kkaempf@suse.de + +- fix runqt include file + +------------------------------------------------------------------- +Tue Oct 31 14:33:38 CET 2000 - sh@suse.de + +- Increased gcc warning level + resolved minor warnings + disabled static libs (speed up compilation) + version 2.1.4 + +------------------------------------------------------------------- +Fri Oct 27 12:47:55 CEST 2000 - kkaempf@suse.de + +- provide correct library + +------------------------------------------------------------------- +Wed Oct 25 18:33:58 CEST 2000 - kkaempf@suse.de + +- Group provided + +------------------------------------------------------------------- +Wed Oct 25 13:58:34 CEST 2000 - sh@suse.de + +- New widgets: BarGraph, Slider, PartitionSplitter + version 2.1.2 + +------------------------------------------------------------------- +Thu Aug 31 13:34:27 CEST 2000 - sh@suse.de + +- Added mesa and mesasoft to spec file + (Qt 2.2+ now requires OpenGL) + version 2.1.1 + +------------------------------------------------------------------- +Thu Jul 13 18:58:23 CEST 2000 - sh@suse.de + +- Resize behaviour + version 2.0.11 + +------------------------------------------------------------------- +Fri Jul 7 16:41:06 CEST 2000 - sh@suse.de + +- Change table widget sorting for the umpteenth time: + Maintain insertion order but allow for user sort-by-click + version 2.0.10 + +------------------------------------------------------------------- +Thu Jul 6 15:48:28 CEST 2000 - sh@suse.de + +- proper window close button handling (-> `cancel) + version 2.0.9 + +------------------------------------------------------------------- +Tue Jul 4 14:11:43 CEST 2000 - kkaempf@suse.de + +- check argument in returnNow + version 2.0.8 + +------------------------------------------------------------------- +Mon Jun 26 16:03:32 CEST 2000 - sh@suse.de + +- Changed default title image for SuSE 7.0 +- increased version number to 2.0.7 + +------------------------------------------------------------------- +Mon Jun 19 17:41:54 CEST 2000 - kkaempf@suse.de + +- use xmset from new saxtools package + version 2.0.6 + +------------------------------------------------------------------- +Mon Jun 19 16:51:27 CEST 2000 - schwab@suse.de + +- Add %suse_update_config. +- Lower opt level on ia64. + +------------------------------------------------------------------- +Mon Jun 19 10:24:39 CEST 2000 - kkaempf@suse.de + +- add xmset from SaX2 + version 2.0.5 + +------------------------------------------------------------------- +Thu Jun 8 11:22:40 CEST 2000 - sh@suse.de + +- Disabled X Input Method hack - this doesn't seem to work with + XFree86 4.0 + +------------------------------------------------------------------- +Mon Jun 5 18:46:25 CEST 2000 - sh@suse.de + +- Added correct QTDIR and dependencies to qtlib2 to spec file + +------------------------------------------------------------------- +Thu May 18 13:11:54 CEST 2000 - kkaempf@suse.de + +- pass includes to dist + add tools to specfile + +------------------------------------------------------------------- +Mon May 15 16:07:09 CEST 2000 - sh@suse.de + +- New widget: ComboBox + +------------------------------------------------------------------- +Wed Apr 26 16:25:39 CEST 2000 - kkaempf@suse.de + +- Initial version based on yast2 from SuSE 6.4 + diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..a7bd469 --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,11 @@ +Makefile +Makefile.in +*.lo +.deps +*.moc +.libs +y2qt.kdoc +*.la +qt +*.bak +*.auto diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..3ff68d2 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,279 @@ +# +# Makefile.am for qt/src +# + +SUBDIRS = pkg + +AM_CXXFLAGS = -DY2LOG=\"ui-qt\" \ + -DQT_THREAD_SUPPORT \ + -DLOCALEDIR=\"${localedir}\" \ + -DQT_LOCALEDIR=\"$(QTDIR)/translations\" \ + -DICONDIR=\"${themedir}/current\" \ + -DTHEMEDIR=\"${themedir}/current\" \ + -DHELPIMAGEDIR=\"${imagedir}\" \ + -DLANG_FONTS_FILE=\"${lang_fontsdir}/lang_fonts\" \ + -DQTLIBDIR=\"$(QTLIBDIR)\" \ + -fmessage-length=0 + + +MOC = $(QTDIR)/bin/moc + +serversdir = $(execcompdir)/servers + +lang_fontsdir=$(ydatadir) +lang_fonts_DATA = lang_fonts + +EXTRA_DIST = $(lang_fonts_DATA) + +# plugin, libtool forces 'lib' prefix +plugin_LTLIBRARIES = libpy2qt.la +libpy2qt_la_LDFLAGS = -version-info 2:0 + +libpy2qt_la_LIBADD = \ + -L$(plugindir) -lpy2UI \ + -L$(QTLIBDIR) -lqt-mt \ + -lX11 -lXext -lSM -lICE + +# libpy2qt_la_LIBADD = \ +# -Lpkg -ly2qt_pkg \ +# -L$(plugindir) -lpy2UI \ +# -L$(QTLIBDIR) -lqt-mt \ +# -lX11 -lXext -lSM -lICE + +# noinst_LTLIBRARIES = liby2qt.la +# liby2qt_la_LDFLAGS = -version-info 2:0 +# liby2qt_la_LIBADD = $(libpy2qt_la_LIBADD) + + +noinst_HEADERS = $(wildcard *.h) + +libpy2qt_la_SOURCES = \ + Y2CCQt.cc \ + \ + YQUI_core.cc \ + YQUI_widgets.cc \ + YQUI_builtins.cc \ + YQUI_x11.cc \ + YQApplication.cc \ + YQWidgetFactory.cc \ + YQOptionalWidgetFactory.cc \ + YQPackageSelectorPlugin.cc \ + YQSignalBlocker.cc \ + YQIconPool.cc \ + YQWidgetCaption.cc \ + \ + YQAlignment.cc \ + YQBarGraph.cc \ + YQCheckBox.cc \ + YQCheckBoxFrame.cc \ + YQComboBox.cc \ + YQDateField.cc \ + YQDialog.cc \ + YQDownloadProgress.cc \ + YQDumbTab.cc \ + YQEBunny.cc \ + YQEmpty.cc \ + YQFrame.cc \ + YQGenericButton.cc \ + YQImage.cc \ + YQInputField.cc \ + YQIntField.cc \ + YQLabel.cc \ + YQLayoutBox.cc \ + YQLogView.cc \ + YQMenuButton.cc \ + YQMultiLineEdit.cc \ + YQMultiProgressMeter.cc \ + YQMultiSelectionBox.cc \ + YQPartitionSplitter.cc \ + YQProgressBar.cc \ + YQPushButton.cc \ + YQRadioButton.cc \ + YQRadioButtonGroup.cc \ + YQReplacePoint.cc \ + YQRichText.cc \ + YQSelectionBox.cc \ + YQSlider.cc \ + YQSpacing.cc \ + YQSquash.cc \ + YQTable.cc \ + YQTimeField.cc \ + YQTree.cc \ + YQWizard.cc \ + YQWizardButton.cc \ + \ + YFrameBuffer.cc \ + QY2ComboTabWidget.cc \ + QY2DiskUsageList.cc \ + QY2CharValidator.cc \ + QY2ListView.cc \ + QY2Settings.cc \ + QY2LayoutUtils.cc + + + + +# Note: QY2LayoutUtils and QY2Settings don't need any .moc file: No QObjects + + +# the plugin adds the liby2 component interface +# +# libpy2qt_la_SOURCES = \ +# $(liby2qt_la_SOURCES) \ +# Y2CCQt.cc + + +BUILT_SOURCES = \ + YQUI.moc \ + YQApplication.moc \ + YQWidgetCaption.cc \ + \ + YQAlignment.moc \ + YQBarGraph.moc \ + YQCheckBox.moc \ + YQCheckBoxFrame.moc \ + YQComboBox.moc \ + YQDialog.moc \ + YQDownloadProgress.moc \ + YQDumbTab.moc \ + YQEmpty.moc \ + YQFrame.moc \ + YQGenericButton.moc \ + YQImage.moc \ + YQInputField.moc \ + YQIntField.moc \ + YQLabel.moc \ + YQLayoutBox.moc \ + YQLogView.moc \ + YQMenuButton.moc \ + YQMultiLineEdit.moc \ + YQMultiProgressMeter.moc \ + YQMultiSelectionBox.moc \ + YQPartitionSplitter.moc \ + YQProgressBar.moc \ + YQPushButton.moc \ + YQRadioButton.moc \ + YQRadioButtonGroup.moc \ + YQReplacePoint.moc \ + YQRichText.moc \ + YQSelectionBox.moc \ + YQSlider.moc \ + YQSpacing.moc \ + YQSquash.moc \ + YQTable.moc \ + YQTree.moc \ + YQWizard.moc \ + YQWizardButton.moc \ + \ + QY2ComboTabWidget.moc \ + QY2DiskUsageList.moc \ + QY2CharValidator.moc \ + QY2ListView.moc + + +YQUI_core.o YQUI_core.lo: YQUI.moc +YQUI_widgets.o YQUI_widgets.lo: YQUI.moc +YQUI_builtins.o YQUI_builtins.lo: YQUI.moc +YQUI_x11.o YQUI_x11.lo: YQUI.moc +YQApplication.o YQApplication.lo: YQApplication.moc +YQWidgetCaption.o YQWidgetCaption.lo: YQWidgetCaption.moc + +YQAlignment.o YQAlignment.lo: YQAlignment.moc +YQBarGraph.o YQBarGraph.lo: YQBarGraph.moc +YQCheckBox.o YQCheckBox.lo: YQCheckBox.moc +YQCheckBoxFrame.o YQCheckBoxFrame.lo: YQCheckBoxFrame.moc +YQComboBox.o YQComboBox.lo: YQComboBox.moc +YQDateField.o YQDateField.lo: YQDateField.moc +YQDialog.o YQDialog.lo: YQDialog.moc +YQDownloadProgress.o YQDownloadProgress.lo: YQDownloadProgress.moc +YQDumbTab.o YQDumbTab.lo: YQDumbTab.moc +YQEmpty.o YQEmpty.lo: YQEmpty.moc +YQFrame.o YQFrame.lo: YQFrame.moc +YQGenericButton.o YQGenericButton.lo: YQGenericButton.moc +YQImage.o YQImage.lo: YQImage.moc +YQInputField.o YQInputField.lo: YQInputField.moc +YQIntField.o YQIntField.lo: YQIntField.moc +YQLabel.o YQLabel.lo: YQLabel.moc +YQLayoutBox.o YQLayoutBox.lo: YQLayoutBox.moc +YQLogView.o YQLogView.lo: YQLogView.moc +YQMenuButton.o YQMenuButton.lo: YQMenuButton.moc +YQMultiLineEdit.o YQMultiLineEdit.lo: YQMultiLineEdit.moc +YQMultiProgressMeter.o YQMultiProgressMeter.lo: YQMultiProgressMeter.moc +YQMultiSelectionBox.o YQMultiSelectionBox.lo: YQMultiSelectionBox.moc +YQPartitionSplitter.o YQPartitionSplitter.lo: YQPartitionSplitter.moc +YQProgressBar.o YQProgressBar.lo: YQProgressBar.moc +YQPushButton.o YQPushButton.lo: YQPushButton.moc +YQRadioButton.o YQRadioButton.lo: YQRadioButton.moc +YQRadioButtonGroup.o YQRadioButtonGroup.lo: YQRadioButtonGroup.moc +YQReplacePoint.o YQReplacePoint.lo: YQReplacePoint.moc +YQRichText.o YQRichText.lo: YQRichText.moc +YQSelectionBox.o YQSelectionBox.lo: YQSelectionBox.moc +YQSlider.o YQSlider.lo: YQSlider.moc +YQSpacing.o YQSpacing.lo: YQSpacing.moc +YQSquash.o YQSquash.lo: YQSquash.moc +YQTable.o YQTable.lo: YQTable.moc +YQTimeField.o YQTimeField.lo: YQTimeField.moc +YQTree.o YQTree.lo: YQTree.moc +YQWizard.o YQWizard.lo: YQWizard.moc +YQWizardButton.o YQWizardButton.lo: YQWizardButton.moc + +QY2ComboTabWidget.o QY2ComboTabWidget.lo: QY2ComboTabWidget.cc +QY2DiskUsageList.o QY2DiskUsageList.lo: QY2DiskUsageList.cc +QY2CharValidator.o QY2CharValidator.lo: QY2CharValidator.moc +QY2ListView.o QY2ListView.lo: QY2ListView.moc + + + +YQUI.moc: YQUI.h +YQApplication.moc: YQApplication.h +YQWidgetCaption.moc: YQWidgetCaption.h + +YQAlignment.moc: YQAlignment.h +YQBarGraph.moc: YQBarGraph.h +YQCheckBox.moc: YQCheckBox.h +YQCheckBoxFrame.moc: YQCheckBoxFrame.h +YQComboBox.moc: YQComboBox.h +YQDialog.moc: YQDialog.h +YQDownloadProgress.moc: YQDownloadProgress.h +YQDumbTab.moc: YQDumbTab.h +YQEmpty.moc: YQEmpty.h +YQFrame.moc: YQFrame.h +YQGenericButton.moc: YQGenericButton.h +YQImage.moc: YQImage.h +YQInputField.moc: YQInputField.h +YQIntField.moc: YQIntField.h +YQLabel.moc: YQLabel.h +YQLayoutBox.moc: YQLayoutBox.h +YQLogView.moc: YQLogView.h +YQMenuButton.moc: YQMenuButton.h +YQMultiLineEdit.moc: YQMultiLineEdit.h +YQMultiProgressMeter.moc: YQMultiProgressMeter.h +YQMultiSelectionBox.moc: YQMultiSelectionBox.h +YQPartitionSplitter.moc: YQPartitionSplitter.h +YQProgressBar.moc: YQProgressBar.h +YQPushButton.moc: YQPushButton.h +YQRadioButton.moc: YQRadioButton.h +YQRadioButtonGroup.moc: YQRadioButtonGroup.h +YQReplacePoint.moc: YQReplacePoint.h +YQRichText.moc: YQRichText.h +YQSelectionBox.moc: YQSelectionBox.h +YQSlider.moc: YQSlider.h +YQSpacing.moc: YQSpacing.h +YQSquash.moc: YQSquash.h +YQTable.moc: YQTable.h +YQTree.moc: YQTree.h +YQWizard.moc: YQWizard.h +YQWizardButton.moc: YQWizardButton.h + +QY2ComboTabWidget.moc: QY2ComboTabWidget.h +QY2DiskUsageList.moc: QY2DiskUsageList.h +QY2CharValidator.moc: QY2CharValidator.h +QY2ListView.moc: QY2ListView.h + + +%.moc: %.h + $(MOC) $< -o $@ + +CLEANFILES = *.moc + +INCLUDES = -I$(srcdir)/pkg -I$(QTDIR)/include -I$(includedir) -I$(includedir)/yui diff --git a/src/QY2CharValidator.cc b/src/QY2CharValidator.cc new file mode 100644 index 0000000..9e06130 --- /dev/null +++ b/src/QY2CharValidator.cc @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt objects | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2CharValidator.cc + + Author: Stefan Hundhammer + + This is a pure Qt object - it can be used independently of YaST2. + +/-*/ + + +#include +#include +#include "QY2CharValidator.h" + + + +QY2CharValidator::QY2CharValidator( const QString & initialValidChars, + QObject * parent, + const char * name ) + : QValidator( parent, name ) + , _validChars( initialValidChars ) +{ +} + + +QY2CharValidator::~QY2CharValidator() +{ + // NOP +} + + +QValidator::State +QY2CharValidator::validate( QString & fieldContents, int & pos ) const +{ + if ( validChars().isEmpty() || fieldContents.isEmpty() ) + return QValidator::Acceptable; + + + // Check the entire field contents. + // + // There might be more than one new character - the user might have copied + // some longer text via the X clipboard. + + for ( unsigned i=0; i < fieldContents.length(); i++ ) + { + if ( ! validChars().contains( fieldContents[i] ) ) + return QValidator::Invalid; + } + + return QValidator::Acceptable; +} + + +#include "QY2CharValidator.moc" diff --git a/src/QY2CharValidator.h b/src/QY2CharValidator.h new file mode 100644 index 0000000..c350905 --- /dev/null +++ b/src/QY2CharValidator.h @@ -0,0 +1,73 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt objects | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2CharValidator.h + + Author: Stefan Hundhammer + + This is a pure Qt object - it can be used independently of YaST2. + +/-*/ + + +#ifndef QY2CharValidator_h +#define QY2CharValidator_h + +#include + + +class QY2CharValidator : public QValidator +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * Create a validator object that checks for input characters being any one + * of 'validChars'. If this is empty, any input is accepted. + **/ + QY2CharValidator( const QString & initialValidChars, + QObject * parent = 0, + const char * name = 0 ); + + /** + * Destructor. + **/ + ~QY2CharValidator(); + + /** + * Check user input. + * + * Reimplemented from @ref QValidator. + **/ + virtual State validate( QString & input, int & pos ) const; + + /** + * Set the valid input characters. + * If 'newValidChars' is empty, any input is accepted. + **/ + void setValidChars( const QString & newValidChars ) + { _validChars = newValidChars; } + + /** + * Retrieve the valid input characters. + **/ + QString validChars() const { return _validChars; } + +protected: + + QString _validChars; +}; + +#endif // QY2CharValidator_h diff --git a/src/QY2ComboTabWidget.cc b/src/QY2ComboTabWidget.cc new file mode 100644 index 0000000..1c1708b --- /dev/null +++ b/src/QY2ComboTabWidget.cc @@ -0,0 +1,146 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt widgets | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2ComboTabWidget.cc + + Author: Stefan Hundhammer + + This is a pure Qt widget - it can be used independently of YaST2. + +/-*/ + + +#include +#include +#include +#include + +#define y2log_component "qt-pkg" +#include + +#include "QY2ComboTabWidget.h" + + +#define SPACING 6 // between subwidgets +#define MARGIN 4 // around the widget + + + +QY2ComboTabWidget::QY2ComboTabWidget( const QString & label, + QWidget * parent, + const char * name ) + : QVBox( parent, name ) +{ + setFrameStyle( QFrame::Panel | QFrame::Raised ); + setLineWidth(2); + setMidLineWidth(2); + setSpacing( SPACING ); + setMargin ( MARGIN ); + + + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + hbox->setSpacing( SPACING ); + hbox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); // hor/vert + + + combo_label = new QLabel( label, hbox ); + CHECK_PTR( combo_label ); + + combo_box = new QComboBox( hbox ); + CHECK_PTR( combo_box ); + + combo_label->setBuddy( combo_box ); + combo_box->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); // hor/vert + connect( combo_box, SIGNAL( activated( int ) ), + this, SLOT ( showPage ( int ) ) ); + + widget_stack = new QWidgetStack( this ); + CHECK_PTR( widget_stack ); +} + + + +QY2ComboTabWidget::~QY2ComboTabWidget() +{ + +} + + +void +QY2ComboTabWidget::addPage( const QString & page_label, QWidget * new_page ) +{ + pages.insert( combo_box->count(), new_page ); + combo_box->insertItem( page_label ); + widget_stack->addWidget( new_page ); + + if ( ! widget_stack->visibleWidget() ) + widget_stack->raiseWidget( new_page ); +} + + +void +QY2ComboTabWidget::showPage( int index ) +{ + QWidget * page = pages[ index ]; + + if ( page ) + { + widget_stack->raiseWidget( page ); + // y2debug( "Changing current page" ); + emit currentChanged( page ); + } + else + { + qWarning( "QY2ComboTabWidget: Page #%d not found", index ); + return; + } +} + + +void +QY2ComboTabWidget::showPage( QWidget * page ) +{ + widget_stack->raiseWidget( page ); + + if ( page == pages[ combo_box->currentItem() ] ) + { + // Shortcut: If the requested page is the one that belongs to the item + // currently selected in the combo box, don't bother searching the + // correct combo box item. + return; + } + + + // Search the dict for this page + + QIntDictIterator it( pages ); + + while ( it.current() ) + { + if ( page == it.current() ) + { + combo_box->setCurrentItem( it.currentKey() ); + return; + } + + ++it; + } + + // If we come this far, that page isn't present in the dict. + + qWarning( "QY2ComboTabWidget: Page not found" ); +} + + + +#include "QY2ComboTabWidget.moc" diff --git a/src/QY2ComboTabWidget.h b/src/QY2ComboTabWidget.h new file mode 100644 index 0000000..c89488c --- /dev/null +++ b/src/QY2ComboTabWidget.h @@ -0,0 +1,102 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt widgets | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2ComboTabWidget.h + + Author: Stefan Hundhammer + + This is a pure Qt widget - it can be used independently of YaST2. + +/-*/ + + +#ifndef QY2ComboTabWidget_h +#define QY2ComboTabWidget_h + +#include +#include +#include + +class QComboBox; +class QLabel; +class QWidgetStack; +class QWidget; + + +/** + * This widget is very much like a QTabWidget, but it uses a combo box above + * the tab pages rather than a ( scrolled ) one-line row of tabs. + **/ +class QY2ComboTabWidget : public QVBox +{ + Q_OBJECT + +public: + + /** + * Constructor. 'combo_box_label' is the user-visible label of the combo + * box that is used to switch between the different tab pages. + **/ + QY2ComboTabWidget( const QString & combo_box_label, + QWidget * parent = 0, + const char * name = 0 ); + + /** + * Destructor. + **/ + virtual ~QY2ComboTabWidget(); + + /** + * Add a page. 'page_label' will be the user-visible combo box entry for + * that page. + **/ + void addPage( const QString & page_label, QWidget * page ); + + +signals: + + /** + * Emitted when the current page changes. + * NOT emitted initially for the very first page that is shown. + **/ + void currentChanged( QWidget * newCurrentPage ); + + +public slots: + + /** + * Show a page. Updates the combo box contents accordingly. + * This is an expensive operation: All combo box items are searched for the + * item that corresponds to this page. + **/ + void showPage( QWidget * page ); + + + +protected slots: + + /** + * Show a page identified by its index. Does NOT update the combo box + * contents. + **/ + void showPage( int index ); + + +protected: + + QComboBox * combo_box; + QLabel * combo_label; + QWidgetStack * widget_stack; + QIntDict pages; +}; + +#endif // QY2ComboTabWidget_h diff --git a/src/QY2DiskUsageList.cc b/src/QY2DiskUsageList.cc new file mode 100644 index 0000000..7e8f5f7 --- /dev/null +++ b/src/QY2DiskUsageList.cc @@ -0,0 +1,418 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2DiskUsageList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + + This is a pure Qt widget - it can be used independently of YaST2. + + +/-*/ + + +#include "QY2DiskUsageList.h" +#include "YQi18n.h" +#include "qpainter.h" + + +QY2DiskUsageList::QY2DiskUsageList( QWidget * parent, bool addStdColumns ) + : QY2ListView( parent ) +{ + _nameCol = -42; + _percentageBarCol = -42; + _percentageCol = -42; + _usedSizeCol = -42; + _freeSizeCol = -42; + _totalSizeCol = -42; + _deviceNameCol = -42; + + if ( addStdColumns ) + { + int numCol = 0; + addColumn( _( "Name" ) ); _nameCol = numCol++; + + // Translators: Please keep this short! + addColumn( _( "Disk Usage" ) ); _percentageBarCol = numCol++; + addColumn( "" ); _percentageCol = numCol++; + addColumn( _( "Used" ) ); _usedSizeCol = numCol++; + addColumn( _( "Free" ) ); _freeSizeCol = numCol++; + addColumn( _( "Total" ) ); _totalSizeCol = numCol++; +#if 0 + addColumn( _( "Device" ) ); _deviceNameCol = numCol++; +#endif + + setColumnAlignment( percentageCol(), Qt::AlignRight ); + setColumnAlignment( usedSizeCol(), Qt::AlignRight ); + setColumnAlignment( freeSizeCol(), Qt::AlignRight ); + setColumnAlignment( totalSizeCol(), Qt::AlignRight ); + + setSorting( percentageBarCol() ); + } + + saveColumnWidths(); + setSelectionMode( QListView::NoSelection ); +} + + +QY2DiskUsageList::~QY2DiskUsageList() +{ +} + + + + + + +QY2DiskUsageListItem::QY2DiskUsageListItem( QY2DiskUsageList * parent ) + : QY2ListViewItem( parent ) + , _diskUsageList( parent ) +{ +} + + + + +QY2DiskUsageListItem::~QY2DiskUsageListItem() +{ + // NOP +} + + + + +void +QY2DiskUsageListItem::init( bool allFields ) +{ + if ( percentageCol() >= 0 ) + { + QString percentageText; + percentageText.sprintf( "%d%%", usedPercent() ); + setText( percentageCol(), percentageText ); + } + + if ( usedSizeCol() >= 0 ) setText( usedSizeCol(), usedSize() ); + if ( freeSizeCol() >= 0 ) setText( freeSizeCol(), freeSize() ); + + if ( allFields ) + { + if ( totalSizeCol() >= 0 ) setText( totalSizeCol(), totalSize() ); + if ( nameCol() >= 0 ) setText( nameCol(), " " + name() ); + if ( deviceNameCol() >= 0 ) setText( deviceNameCol(), deviceName() ); + } +} + + +void +QY2DiskUsageListItem::setText( int column, const FSize & size ) +{ + QString sizeText = size.form( 0, 1, true ).c_str(); + sizeText += " "; + setText( column, sizeText ); +} + + +FSize +QY2DiskUsageListItem::freeSize() const +{ + return totalSize() - usedSize(); +} + + +int +QY2DiskUsageListItem::usedPercent() const +{ + int percent = 0; + + if ( totalSize() != 0 ) + percent = ( 100 * usedSize() ) / totalSize(); + + return percent; +} + + +void +QY2DiskUsageListItem::updateStatus() +{ + init( false ); +} + + +void +QY2DiskUsageListItem::updateData() +{ + init( true ); +} + + + + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +QY2DiskUsageListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + QY2DiskUsageListItem * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + if ( col == percentageCol() || + col == percentageBarCol() ) + { + // Intentionally reverting sort order: Fullest first + + if ( this->usedPercent() < other->usedPercent() ) return 1; + if ( this->usedPercent() > other->usedPercent() ) return -1; + return 0; + } + else if ( col == usedSizeCol() ) + { + if ( this->usedSize() < other->usedSize() ) return -1; + if ( this->usedSize() > other->usedSize() ) return 1; + return 0; + } + else if ( col == freeSizeCol() ) + { + if ( this->freeSize() < other->freeSize() ) return -1; + if ( this->freeSize() > other->freeSize() ) return 1; + return 0; + } + else if ( col == totalSizeCol() ) + { + if ( this->totalSize() < other->totalSize() ) return -1; + if ( this->totalSize() > other->totalSize() ) return 1; + return 0; + } + } + + return QY2ListViewItem::compare( otherListViewItem, col, ascending ); +} + + +void +QY2DiskUsageListItem::paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ) +{ + if ( column == percentageBarCol() ) + { + QColor background = colorGroup.base(); + painter->setBackgroundColor( background ); + + paintPercentageBar( usedPercent(), + painter, + _diskUsageList->treeStepSize() * depth(), + width, + interpolateColor( usedPercent(), + 60, 95, + QColor( 0, 0x80, 0 ), // Medium dark green + QColor( 0xFF, 0, 0 ) ), // Bright red + background.dark( 115 ) ); + + } + else + { + QColorGroup cg( colorGroup ); + + if ( usedSize() > totalSize() ) + cg.setColor( QColorGroup::Text, Qt::red ); // Set red text foreground + + // Intentionally bypassing the direct parent class method, use the grandparent's: + // Don't let QY2ListViewItem::_textColor / _backgroundColor interfere with our colors. + + QListViewItem::paintCell( painter, cg, column, width, alignment ); + } +} + + +/** + * Stolen from KDirStat::KDirTreeView with the author's permission. + **/ +void +QY2DiskUsageListItem::paintPercentageBar( float percent, + QPainter * painter, + int indent, + int width, + const QColor & fillColor, + const QColor & barBackground ) +{ + if ( percent > 100.0 ) percent = 100.0; + if ( percent < 0.0 ) percent = 0.0; + int penWidth = 2; + int extraMargin = 3; + int x = _diskUsageList->itemMargin(); + int y = extraMargin; + int w = width - 2 * _diskUsageList->itemMargin(); + int h = height() - 2 * extraMargin; + int fillWidth; + + painter->eraseRect( 0, 0, width, height() ); + w -= indent; + x += indent; + + if ( w > 0 ) + { + QPen pen( painter->pen() ); + pen.setWidth(0); + painter->setPen( pen ); + painter->setBrush( NoBrush ); + fillWidth = (int) ( ( w - 2 * penWidth ) * percent / 100.0 ); + + + // Fill bar background. + + painter->fillRect( x + penWidth, y + penWidth, + w - 2 * penWidth + 1, h - 2 * penWidth + 1, + barBackground ); + /* + * Notice: The Xlib XDrawRectangle() function always fills one + * pixel less than specified. Altough this is very likely just a + * plain old bug, it is documented that way. Obviously, Qt just + * maps the fillRect() call directly to XDrawRectangle() so they + * inherited that bug ( although the Qt doc stays silent about + * it ). So it is really necessary to compensate for that missing + * pixel in each dimension. + * + * If you don't believe it, see for yourself. + * Hint: Try the xmag program to zoom into the drawn pixels. + **/ + + // Fill the desired percentage. + + painter->fillRect( x + penWidth, y + penWidth, + fillWidth+1, h - 2 * penWidth+1, + fillColor ); + + + // Draw 3D shadows. + + pen.setColor( contrastingColor ( Qt::black, + painter->backgroundColor() ) ); + painter->setPen( pen ); + painter->drawLine( x, y, x+w, y ); + painter->drawLine( x, y, x, y+h ); + + pen.setColor( contrastingColor( barBackground.dark(), + painter->backgroundColor() ) ); + painter->setPen( pen ); + painter->drawLine( x+1, y+1, x+w-1, y+1 ); + painter->drawLine( x+1, y+1, x+1, y+h-1 ); + + pen.setColor( contrastingColor( barBackground.light(), + painter->backgroundColor() ) ); + painter->setPen( pen ); + painter->drawLine( x+1, y+h, x+w, y+h ); + painter->drawLine( x+w, y, x+w, y+h ); + + pen.setColor( contrastingColor( Qt::white, + painter->backgroundColor() ) ); + painter->setPen( pen ); + painter->drawLine( x+2, y+h-1, x+w-1, y+h-1 ); + painter->drawLine( x+w-1, y+1, x+w-1, y+h-1 ); + } +} + + +/** + * Stolen from KDirStat::KDirTreeView with the author's permission. + **/ +QColor +QY2DiskUsageListItem::contrastingColor( const QColor & desiredColor, + const QColor & contrastColor ) +{ + if ( desiredColor != contrastColor ) + { + return desiredColor; + } + + if ( contrastColor != contrastColor.light() ) + { + // try a little lighter + return contrastColor.light(); + } + else + { + // try a little darker + return contrastColor.dark(); + } +} + + +QColor +QY2DiskUsageListItem::interpolateColor( int val, + int minVal, + int maxVal, + const QColor & minColor, + const QColor & maxColor ) +{ + int minH, maxH; + int minS, maxS; + int minV, maxV; + + minColor.hsv( &minH, &minS, &minV ); + maxColor.hsv( &maxH, &maxS, &maxV ); + + return QColor( interpolate( val, minVal, maxVal, minH, maxH ), + interpolate( val, minVal, maxVal, minS, maxS ), + interpolate( val, minVal, maxVal, minV, maxV ), + QColor::Hsv ); +} + + +int +QY2DiskUsageListItem::interpolate( int from, + int minFrom, int maxFrom, + int minTo, int maxTo ) +{ + if ( minFrom > maxFrom ) + { + // Swap min/max values + + int tmp = maxFrom; + maxFrom = minFrom; + minFrom = tmp; + } + + long x = from - minFrom; + x *= maxTo - minTo; + x /= maxFrom - minFrom; + x += minTo; + + if ( minTo < maxTo ) + { + if ( x < minTo ) x = minTo; + if ( x > maxTo ) x = maxTo; + } + else + { + if ( x < maxTo ) x = maxTo; + if ( x > minTo ) x = minTo; + } + + return (int) x; +} + + + +#include "QY2DiskUsageList.moc" diff --git a/src/QY2DiskUsageList.h b/src/QY2DiskUsageList.h new file mode 100644 index 0000000..f4249bd --- /dev/null +++ b/src/QY2DiskUsageList.h @@ -0,0 +1,284 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt widgets | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2DiskUsageList.h + + Author: Stefan Hundhammer + + This is a pure Qt widget - it can be used independently of YaST2. + +/-*/ + + +#ifndef QY2DiskUsageList_h +#define QY2DiskUsageList_h + +#include +#include +#include + + +class QY2DiskUsageListItem; + + +/** + * Generic scrollable list of disk usage for any number of partitions. + **/ +class QY2DiskUsageList : public QY2ListView +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * Adds a standard set of list columns if 'addStdColumns' is + *'true'. Otherwise the caller is responsible for adding any columns. + **/ + QY2DiskUsageList( QWidget * parent, bool addStdColumns = true ); + + /** + * Destructor + **/ + virtual ~QY2DiskUsageList(); + + + // Column numbers + + int nameCol() const { return _nameCol; } + int percentageBarCol() const { return _percentageBarCol; } + int percentageCol() const { return _percentageCol; } + int usedSizeCol() const { return _usedSizeCol; } + int freeSizeCol() const { return _freeSizeCol; } + int totalSizeCol() const { return _totalSizeCol; } + int deviceNameCol() const { return _deviceNameCol; } + + +protected: + + int _nameCol; + int _percentageBarCol; + int _percentageCol; + int _usedSizeCol; + int _freeSizeCol; + int _totalSizeCol; + int _deviceNameCol; +}; + + + +/** + * Abstract base class for one partition ( mount point ) to display in a + * QY2DiskUsageList. + * + * This class contains pure virtuals, so it cannot be used directly. + **/ +class QY2DiskUsageListItem: public QY2ListViewItem +{ +protected: + /** + * Constructor. + * + * Call updateData() after the constructor for the initial display + * update. Unfortunately, this cannot be done automatically in the + * constructor since it uses virtual methods that are not available yet at + * this point. + **/ + QY2DiskUsageListItem( QY2DiskUsageList * parent ); + + + /** + * Destructor. + **/ + virtual ~QY2DiskUsageListItem(); + + +public: + + /** + * The currently used size of this partition. + * + * Derived classes need to implement this method. + **/ + + virtual FSize usedSize() const = 0; + + /** + * The total size of this partition. + * + * Derived classes need to implement this method. + **/ + virtual FSize totalSize() const = 0; + + /** + * The current free size of this partition. + * + * Derived classes can choose reimpmenent this if it is less expensive than + * calculating this value each time from usedSize() and totalSize() which + * is the default implementation. + **/ + virtual FSize freeSize() const; + + /** + * The currently used percentage ( 0..100 ) of this partition. + * + * Derived classes can choose reimpmenent this if it is less expensive than + * calculating this value each time from usedSize() and totalSize() which + * is the default implementation. + **/ + virtual int usedPercent() const; + + /** + * The name to display for this partition. + * It makes most sense to use the mount point here ( but this is not a + * requirement ). This is what will be displayed in the "Name" column. + * + * Derived classes need to implement this method. + **/ + virtual QString name() const = 0; + + /** + * The device name of this partition. + * + * Derived classes may choose to reimplement this method. + * This default implementation returns an empty string. + **/ + virtual QString deviceName() const { return ""; } + + + /** + * Update this item's status ( here: the numeric fields ). + * Triggered by QY2ListView::updateAllItemStates(). + * + * Reimplemented from QY2ListViewItem. + **/ + virtual void updateStatus(); + + /** + * Update this item's data completely. + * Triggered by QY2ListView::updateAllItemData(). + * + * Reimplemented from QY2ListViewItem. + **/ + virtual void updateData(); + + /** + * Re-declare ordinary setText() method so the compiler doesn't get + * confused which one to use. + **/ + void setText( int column, const QString & text ) + { QListViewItem::setText( column, text ); } + + /** + * Set a column text via FSize. + **/ + void setText( int column, const FSize & size ); + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QY2ListViewItem. + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + // Columns + + int nameCol() const { return _diskUsageList->nameCol(); } + int percentageBarCol() const { return _diskUsageList->percentageBarCol(); } + int percentageCol() const { return _diskUsageList->percentageCol(); } + int usedSizeCol() const { return _diskUsageList->usedSizeCol(); } + int freeSizeCol() const { return _diskUsageList->freeSizeCol(); } + int totalSizeCol() const { return _diskUsageList->totalSizeCol(); } + int deviceNameCol() const { return _diskUsageList->deviceNameCol(); } + + +protected: + + /** + * ( Re- ) initialize fields - all displayed fields ( if 'allFields' is + * 'true' ) or only the varying fields ( used, free, percentage ). + **/ + void init( bool allFields ); + + /** + * Paint method. + * + * Reimplemented from QY2ListViewItem. + **/ + virtual void paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + /** + * Paint a percentage bar into a @ref QListViewItem cell. + * 'width' is the width of the entire cell. + * 'indent' is the number of pixels to indent the bar. + * + * Stolen from KDirStat::KDirTreeView with the author's permission. + **/ + void paintPercentageBar( float percent, + QPainter * painter, + int indent, + int width, + const QColor & fillColor, + const QColor & barBackground ); + + /** + * Return a color that contrasts to 'contrastColor'. + * + * Stolen from KDirStat::KDirTreeView with the author's permission. + **/ + QColor contrastingColor ( const QColor & desiredColor, + const QColor & contrastColor ); + + /** + * Interpolate ( in the HSV color space ) a color between 'minColor' and + * 'maxColor' for a current value 'val' so that 'minVal' corresponds to + * 'minColor' and 'maxVal' to 'maxColor'. + * + * Returns the interpolated color. + **/ + virtual QColor interpolateColor( int val, + int minVal, + int maxVal, + const QColor & minColor, + const QColor & maxColor ); + + /** + * Interpolate ( translate ) a value 'from' in the range between 'minFrom' + * and 'maxFrom' to a range between 'minTo' and 'maxTo'. + **/ + int interpolate( int from, + int minFrom, int maxFrom, + int minTo, int maxTo ); + + + // + // Data members + // + + QY2DiskUsageList * _diskUsageList; +}; + + + + +#endif // ifndef QY2DiskUsageList_h diff --git a/src/QY2LayoutUtils.cc b/src/QY2LayoutUtils.cc new file mode 100644 index 0000000..3fc0839 --- /dev/null +++ b/src/QY2LayoutUtils.cc @@ -0,0 +1,86 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2LayoutUtils.cc + + Author: Stefan Hundhammer + + These are pure Qt functions - they can be used independently of YaST2. + +/-*/ + + +#include +#include +#include "QY2LayoutUtils.h" + + +QWidget * addVStretch( QWidget * parent ) +{ + QWidget * spacer = new QWidget( parent ); + spacer->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) ); // hor/vert + + return spacer; +} + + +QWidget * addHStretch( QWidget * parent ) +{ + QWidget * spacer = new QWidget( parent ); + spacer->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); // hor/vert + + return spacer; +} + + +QWidget * addVSpacing( QWidget * parent, int height ) +{ + QWidget * spacer = new QWidget( parent ); + CHECK_PTR( spacer ); + spacer->setFixedHeight( height ); + + return spacer; +} + + +QWidget * addHSpacing( QWidget * parent, int width ) +{ + QWidget * spacer = new QWidget( parent ); + CHECK_PTR( spacer ); + spacer->setFixedWidth( width ); + + return spacer; +} + + +QSize +limitToScreenSize( const QWidget * widget, int width, int height ) +{ + return limitToScreenSize( widget, QSize( width, height ) ); +} + + +QSize +limitToScreenSize( const QWidget * widget, const QSize & desiredSize ) +{ + QSize availableSize = qApp->desktop()->availableGeometry( const_cast (widget) ).size(); + + // Subtract WM decorations. There seems to be no reliable way to tell if + // this is necessary at all (even fvwm2 claims it is a NETWM compliant + // window manager) or how large the WM decorations are. + // For the purpose of this function, let's assume we have to subtract the + // common fvwm2 decoration size. This is simplistic and should be improved. + availableSize -= QSize( 10, 35 ); + + return desiredSize.boundedTo( availableSize ); +} + diff --git a/src/QY2LayoutUtils.h b/src/QY2LayoutUtils.h new file mode 100644 index 0000000..6357679 --- /dev/null +++ b/src/QY2LayoutUtils.h @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt widgets | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2LayoutUtils.h + + Author: Stefan Hundhammer + + These are pure Qt functions - they can be used independently of YaST2. + +/-*/ + + +#ifndef QY2LayoutUtils_h +#define QY2LayoutUtils_h + +class QWidget; + + +/** + * Add vertical stretchable space. + **/ +QWidget * addVStretch( QWidget * parent ); + +/** + * Add horizontal stretchable space. + **/ +QWidget * addHStretch( QWidget * parent ); + +/** + * Add a fixed height vertical space + **/ +QWidget * addVSpacing( QWidget * parent, int height = 8 ); + +/** + * Add a fixed height horizontal space + **/ +QWidget * addHSpacing( QWidget * parent, int width = 8 ); + +/** + * Limit a QSize to what is available on the same screen as 'widget'. + **/ +QSize limitToScreenSize( const QWidget * widget, const QSize & desiredSize ); +QSize limitToScreenSize( const QWidget * widget, int width, int height ); + +#endif // ifndef QY2LayoutUtils_h diff --git a/src/QY2ListView.cc b/src/QY2ListView.cc new file mode 100644 index 0000000..8f38a92 --- /dev/null +++ b/src/QY2ListView.cc @@ -0,0 +1,569 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2ListView.cc + + Author: Stefan Hundhammer + + This is a pure Qt widget - it can be used independently of YaST2. + +/-*/ + + +#include +#include + +#include "QY2ListView.h" + + +QY2ListView::QY2ListView( QWidget * parent ) + : QListView( parent ) + , _mousePressedItem(0) + , _mousePressedCol( -1 ) + , _mousePressedButton( NoButton ) + , _sortByInsertionSequence( false ) + , _nextSerial(0) + , _mouseButton1PressedInHeader( false ) + , _finalSizeChangeExpected( false ) +{ + QListView::setShowToolTips( false ); + _toolTip = new QY2ListViewToolTip( this ); + + if ( header() ) + header()->installEventFilter( this ); + + connect( header(), SIGNAL( sizeChange ( int, int, int ) ), + this, SLOT ( columnWidthChanged( int, int, int ) ) ); +} + + +QY2ListView::~QY2ListView() +{ + if ( _toolTip ) + delete _toolTip; +} + + +void +QY2ListView::selectSomething() +{ + QListViewItemIterator it( this ); + + while ( *it ) + { + QY2ListViewItem * item = dynamic_cast (*it); + + if ( item && item->isSelectable() ) + { + setSelected( item, true ); // emits signal, too + return; + } + + ++it; + } +} + + +void +QY2ListView::clear() +{ + QListView::clear(); + restoreColumnWidths(); +} + + +void +QY2ListView::updateItemStates() +{ + QListViewItemIterator it( this ); + + while ( *it ) + { + QY2ListViewItem * item = dynamic_cast (*it); + + if ( item ) + item->updateStatus(); + + ++it; + } +} + + +void +QY2ListView::updateItemData() +{ + QListViewItemIterator it( this ); + + while ( *it ) + { + QY2ListViewItem * item = dynamic_cast (*it); + + if ( item ) + item->updateData(); + + ++it; + } +} + + +QString +QY2ListView::toolTip( QListViewItem * listViewItem, int column ) +{ + if ( ! listViewItem ) + return QString::null; + + QString text; + +#if 0 + text.sprintf( "Column %d:\n%s", column, (const char *) listViewItem->text( column ) ); +#endif + + // Try known item classes + + QY2ListViewItem * item = dynamic_cast (listViewItem); + + if ( item ) + return item->toolTip( column ); + + QY2CheckListItem * checkListItem = dynamic_cast (listViewItem); + + if ( checkListItem ) + return checkListItem->toolTip( column ); + + return QString::null; +} + + +void +QY2ListView::saveColumnWidths() +{ + _savedColumnWidth.clear(); + _savedColumnWidth.reserve( columns() ); + + for ( int i = 0; i < columns(); i++ ) + { + _savedColumnWidth.push_back( columnWidth(i) ); + } +} + + +void +QY2ListView::restoreColumnWidths() +{ + if ( _savedColumnWidth.size() != (unsigned) columns() ) // never manually resized + { + for ( int i = 0; i < columns(); i++ ) // use optimized column width + adjustColumn( i ); + } + else // stored settings after manual resizing + { + for ( int i = 0; i < columns(); i++ ) + { + setColumnWidth( i, _savedColumnWidth[ i ] ); // restore saved column width + } + } +} + + +void +QY2ListView::contentsMousePressEvent( QMouseEvent * ev ) +{ + QListViewItem * item = itemAt( contentsToViewport( ev->pos() ) ); + + if ( item && item->isEnabled() ) + { + _mousePressedItem = item; + _mousePressedCol = header()->sectionAt( ev->pos().x() ); + _mousePressedButton = ev->button(); + } + else // invalidate last click data + { + _mousePressedItem = 0; + _mousePressedCol = -1; + _mousePressedButton = -1; + } + + // Call base class method + QListView::contentsMousePressEvent( ev ); +} + + +void +QY2ListView::contentsMouseReleaseEvent( QMouseEvent * ev ) +{ + QListViewItem * item = itemAt( contentsToViewport( ev->pos() ) ); + + if ( item && item->isEnabled() && item == _mousePressedItem ) + { + int col = header()->sectionAt( ev->pos().x() ); + + if ( item == _mousePressedItem && + col == _mousePressedCol && + ev->button() == _mousePressedButton ) + { + emit( columnClicked( ev->button(), item, col, ev->globalPos() ) ); + } + + } + + // invalidate last click data + + _mousePressedItem = 0; + _mousePressedCol = -1; + _mousePressedButton = NoButton; + + // Call base class method + QListView::contentsMouseReleaseEvent( ev ); +} + + +void +QY2ListView::contentsMouseDoubleClickEvent( QMouseEvent * ev ) +{ + QListViewItem * item = itemAt( contentsToViewport( ev->pos() ) ); + + if ( item && item->isEnabled() ) + { + int col = header()->sectionAt( ev->pos().x() ); + emit( columnDoubleClicked( ev->button(), (QY2ListViewItem *) item, col, ev->globalPos() ) ); + } + + // invalidate last click data + + _mousePressedItem = 0; + _mousePressedCol = -1; + _mousePressedButton = NoButton; + + // Call base class method + QListView::contentsMouseDoubleClickEvent( ev ); +} + + +void +QY2ListView::columnWidthChanged( int, int, int ) +{ + // Workaround for Qt bug: + // + // QHeader sends a sizeChange() signal for every size change, not only (as + // documented) when the user resizes a header column manually. But we only + // want to record the column widths if the user explicitly did that, so + // ignore those signals if the mouse isn't pressed. There is also one final + // sizeChange() signal immediately after the user releases the mouse button. + + if ( _mouseButton1PressedInHeader || _finalSizeChangeExpected ) + { + saveColumnWidths(); + + // Consume that one sizeChange() signal that is sent immediately after + // the mouse button is released, but make sure to reset that flag only + // when appropriate. + + if ( ! _mouseButton1PressedInHeader ) + _finalSizeChangeExpected = false; + } +} + + +bool +QY2ListView::eventFilter( QObject * obj, QEvent * event ) +{ + if ( event && obj && obj == header() ) + { + if ( event->type() == QEvent::MouseButtonPress ) + { + QMouseEvent * mouseEvent = (QMouseEvent *) event; + + if ( mouseEvent->button() == 1 ) + { + _mouseButton1PressedInHeader = true; + _finalSizeChangeExpected = false; + } + } + else if ( event->type() == QEvent::MouseButtonRelease ) + { + QMouseEvent * mouseEvent = (QMouseEvent *) event; + + if ( mouseEvent->button() == 1 ) + { + _finalSizeChangeExpected = true; + _mouseButton1PressedInHeader = false; + } + } + } + + return QListView::eventFilter( obj, event ); +} + + +QSize +QY2ListView::minimumSizeHint() const +{ + return QSize( 0, 0 ); +} + + +void +QY2ListView::setSortByInsertionSequence( bool sortByInsertionSequence ) +{ + _sortByInsertionSequence = sortByInsertionSequence; + sort(); +} + + + + + + +QY2ListViewItem::QY2ListViewItem( QY2ListView * parentListView, + const QString & text ) + : QListViewItem( parentListView, text ) +{ + _serial = parentListView->nextSerial(); +} + + +QY2ListViewItem::QY2ListViewItem( QListViewItem * parentItem, + const QString & text ) + : QListViewItem( parentItem, text ) +{ + _serial = 0; + + QY2ListView * parentListView = dynamic_cast ( listView() ); + + if ( parentListView ) + _serial = parentListView->nextSerial(); +} + + +QY2ListViewItem::~QY2ListViewItem() +{ + // NOP +} + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +QY2ListViewItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + bool sortByInsertionSequence = false; + QY2ListView * parentListView = dynamic_cast (listView()); + + if ( parentListView ) + sortByInsertionSequence = parentListView->sortByInsertionSequence(); + + if ( sortByInsertionSequence ) + { + QY2ListViewItem * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + if ( this->serial() < other->serial() ) return -1; + if ( this->serial() > other->serial() ) return 1; + return 0; + } + + // Still here? Try the other version: QY2CheckListItem. + + QY2CheckListItem * otherCheckListItem = dynamic_cast (otherListViewItem); + + if ( otherCheckListItem ) + { + if ( this->serial() < otherCheckListItem->serial() ) return -1; + if ( this->serial() > otherCheckListItem->serial() ) return 1; + return 0; + } + + } + + return QListViewItem::compare( otherListViewItem, col, ascending ); +} + + +void +QY2ListViewItem::paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ) +{ + QColorGroup cg = colorGroup; + + if ( _textColor.isValid() ) cg.setColor( QColorGroup::Text, _textColor ); + if ( _backgroundColor.isValid() ) cg.setColor( QColorGroup::Base, _backgroundColor ); + + QListViewItem::paintCell( painter, cg, column, width, alignment ); +} + + + + + + +QY2CheckListItem::QY2CheckListItem( QY2ListView * parentListView, + const QString & text, + QCheckListItem::Type type ) + : QCheckListItem( parentListView, text, type ) +{ + _serial = parentListView->nextSerial(); +} + + +QY2CheckListItem::QY2CheckListItem( QListViewItem * parentItem, + const QString & text, + QCheckListItem::Type type ) + : QCheckListItem( parentItem, text, type ) +{ + _serial = 0; + QY2ListView * parentListView = dynamic_cast ( listView() ); + + if ( parentListView ) + _serial = parentListView->nextSerial(); +} + + +QY2CheckListItem::QY2CheckListItem( QCheckListItem * parentItem, + const QString & text, + QCheckListItem::Type type ) + : QCheckListItem( parentItem, text, type ) +{ + _serial = 0; + QY2ListView * parentListView = dynamic_cast ( listView() ); + + if ( parentListView ) + _serial = parentListView->nextSerial(); +} + + +QY2CheckListItem::~QY2CheckListItem() +{ + // NOP +} + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +QY2CheckListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + bool sortByInsertionSequence = false; + QY2ListView * parentListView = dynamic_cast (listView()); + + if ( parentListView ) + sortByInsertionSequence = parentListView->sortByInsertionSequence(); + + if ( sortByInsertionSequence ) + { + QY2CheckListItem * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + if ( this->serial() < other->serial() ) return -1; + if ( this->serial() > other->serial() ) return 1; + return 0; + } + + + // Still here? Try the other version: QY2ListViewItem. + + QY2ListViewItem * otherCheckListItem = dynamic_cast (otherListViewItem); + + if ( otherCheckListItem ) + { + if ( this->serial() < otherCheckListItem->serial() ) return -1; + if ( this->serial() > otherCheckListItem->serial() ) return 1; + return 0; + } + + } + + return QListViewItem::compare( otherListViewItem, col, ascending ); +} + + +void +QY2CheckListItem::paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ) +{ + QColorGroup cg = colorGroup; + + if ( _textColor.isValid() ) cg.setColor( QColorGroup::Text, _textColor ); + if ( _backgroundColor.isValid() ) cg.setColor( QColorGroup::Base, _backgroundColor ); + + QCheckListItem::paintCell( painter, cg, column, width, alignment ); +} + + +void +QY2ListViewToolTip::maybeTip( const QPoint & pos ) +{ + QHeader * header = _listView->header(); + QListViewItem * item = _listView->itemAt( pos ); + + if ( ! item ) + return; + + int x = _listView->viewportToContents( pos ).x(); + int column = header->sectionAt(x); + int indent = 0; + + if ( column == 0 ) + { + indent = item->depth() + ( _listView->rootIsDecorated() ? 1 : 0 ); + indent *= _listView->treeStepSize(); + + if ( pos.x() < indent ) + column = -1; + } + + QString text = _listView->toolTip( item, column ); + + if ( ! text.isEmpty() ) + { + QRect rect( _listView->itemRect( item ) ); + + if ( column < 0 ) + { + rect.setX(0); + rect.setWidth( indent ); + } + else + { + QPoint topLeft( header->sectionPos( column ), 0 ); + topLeft = _listView->contentsToViewport( topLeft ); + rect.setX( topLeft.x() ); + rect.setWidth( header->sectionSize( column ) ); + } + + tip( rect, text ); + } +} + + +#include "QY2ListView.moc" diff --git a/src/QY2ListView.h b/src/QY2ListView.h new file mode 100644 index 0000000..a2ebb8f --- /dev/null +++ b/src/QY2ListView.h @@ -0,0 +1,475 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt widgets | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: QY2ListView.h + + Author: Stefan Hundhammer + + This is a pure Qt widget - it can be used independently of YaST2. + +/-*/ + + +#ifndef QY2ListView_h +#define QY2ListView_h + +#include +#include +#include +#include +#include + + +class QY2ListViewItem; +class QY2ListViewToolTip; + + +/** + * @short Enhanced QListView + **/ +class QY2ListView : public QListView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + QY2ListView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~QY2ListView(); + + +public slots: + + /** + * Select a list entry (if there is any). + * Usually this will be the first list entry, but don't rely on that - this + * might change without notice. Emits signal selectionChanged(). + **/ + virtual void selectSomething(); + + /** + * Reimplemented from QListView: + * Adjust header sizes after clearing contents. + **/ + virtual void clear(); + + /** + * Update the status display of all list entries: + * Call QY2ListViewItem::updateStatus() for each item. + * This is an expensive operation. + **/ + void updateItemStates(); + + /** + * Update the status display of all list entries: + * Call QY2ListViewItem::updateData() for each item. + * This is an expensive operation. + **/ + void updateItemData(); + + /** + * Save the current column widths. + **/ + void saveColumnWidths(); + + /** + * Restore the column widths to what was saved previously with + * saveColumnWidths(). + **/ + void restoreColumnWidths(); + + +signals: + + /** + * Emitted for mouse clicks on an item + **/ + void columnClicked ( int button, + QListViewItem * item, + int col, + const QPoint & pos ); + + /** + * Emitted for mouse double clicks on an item + **/ + void columnDoubleClicked ( int button, + QListViewItem * item, + int col, + const QPoint & pos ); + +public: + + /** + * Returns a tool tip text for a specific column of a list item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * This default implementation tries to call + * QY2ListViewItem::toolTip( column ) or + * QY2CheckListItem::toolTip( column ), respectively + * if 'item' is a subclass of either. + * + * Derived classes may handle this differently. + **/ + virtual QString toolTip( QListViewItem * item, int column ); + + /** + * Returns 'true' if the sort order should always be the item insertion + * order, 'false' if the user can change the sort order by clicking on a + * column header. + **/ + bool sortByInsertionSequence() const { return _sortByInsertionSequence; } + + /** + * Enforce sorting by item insertion order (true) or let user change + * sorting by clicking on a column header (false). + **/ + virtual void setSortByInsertionSequence( bool sortByInsertionSequence ); + + /** + * Returns the next free serial number for items that want to be ordered in + * insertion sequence. + **/ + int nextSerial() { return _nextSerial++; } + + /** + * Returns the minimum size required for this widget. + * Inherited from QWidget. + **/ + virtual QSize minimumSizeHint() const; + + /** + * Event filter - inherited from QWidget + **/ + virtual bool eventFilter( QObject * obj, QEvent * event ); + + +protected slots: + + /** + * Internal: Handle manual column resize. + * Save the user's preferred sizes so they don't get overwritten each time + * the list is cleared and filled with new contents. + **/ + void columnWidthChanged( int col, int oldSize, int newSize ); + +protected: + + /** + * Handle mouse clicks. + * Reimplemented from QScrollView. + **/ + virtual void contentsMousePressEvent( QMouseEvent * e ); + + /** + * Handle mouse clicks. + * Reimplemented from QScrollView. + **/ + virtual void contentsMouseReleaseEvent( QMouseEvent * ); + + /** + * Handle mouse clicks. + * Reimplemented from QScrollView. + **/ + virtual void contentsMouseDoubleClickEvent( QMouseEvent * ); + + + // + // Data members + // + + QListViewItem * _mousePressedItem; + int _mousePressedCol; + int _mousePressedButton; + + std::vector _savedColumnWidth; + bool _sortByInsertionSequence; + int _nextSerial; + + QY2ListViewToolTip * _toolTip; + bool _mouseButton1PressedInHeader; + bool _finalSizeChangeExpected; +}; + + + +/** + * Enhanced QListViewItem + **/ +class QY2ListViewItem: public QListViewItem +{ +public: + + /** + * Constructor for toplevel items. + **/ + QY2ListViewItem( QY2ListView * parentListView, + const QString & text = QString::null ); + + + /** + * Constructor for deeper level items. + **/ + QY2ListViewItem( QListViewItem * parentItem, + const QString & text = QString::null ); + + /** + * Destructor + **/ + virtual ~QY2ListViewItem(); + + /** + * Update this item's status. + * Triggered by QY2ListView::updateAllItemStates(). + * Derived classes should overwrite this. + * This default implementation does nothing. + **/ + virtual void updateStatus() {} + + /** + * Update this item's data completely. + * Triggered by QY2ListView::updateAllItemData(). + * Derived classes should overwrite this. + * This default implementation does nothing. + **/ + virtual void updateData() {} + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + /** + * Return this item's serial number. + * Useful for comparison functions that order by insertion sequence. + **/ + int serial() const { return _serial; } + + /** + * Set the text foreground color for all columns. + * For more specific purposes reimiplement paintCell(). + **/ + void setTextColor( const QColor & col ) + { _textColor = col; } + + /** + * Set the text background color for all columns. + * For more specific purposes reimiplement paintCell(). + **/ + void setBackgroundColor( const QColor & col ) + { _backgroundColor = col; } + + /** + * Returns a tool tip text for a specific column of this item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * This default implementation does nothing. + **/ + virtual QString toolTip( int column ) { return QString::null; } + + +protected: + + /** + * Paint method. Reimplemented from @ref QListViewItem so different + * colors can be used. + * + * Reimplemented from QListViewItem. + **/ + virtual void paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + // + // Data members + // + + int _serial; + + QColor _textColor; + QColor _backgroundColor; +}; + + + +/** + * Enhanced QCheckListItem + **/ +class QY2CheckListItem: public QCheckListItem +{ +public: + + /** + * Constructor for toplevel items. + **/ + QY2CheckListItem( QY2ListView * parentListView, + const QString & text, + QCheckListItem::Type type ); + + + /** + * Constructor for deeper level items. + **/ + QY2CheckListItem( QListViewItem * parentItem, + const QString & text, + QCheckListItem::Type type ); + + + /** + * Constructor for deeper level items for QCheckListItem parents. + **/ + QY2CheckListItem( QCheckListItem * parentItem, + const QString & text, + QCheckListItem::Type type ); + + /** + * Destructor + **/ + virtual ~QY2CheckListItem(); + + /** + * Update this item's status. + * Triggered by QY2ListView::updateAllItemStates(). + * Derived classes should overwrite this. + * This default implementation does nothing. + **/ + virtual void updateStatus() {} + + /** + * Update this item's data completely. + * Triggered by QY2ListView::updateAllItemData(). + * Derived classes should overwrite this. + * This default implementation does nothing. + **/ + virtual void updateData() {} + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + /** + * Return this item's serial number. + * Useful for comparison functions that order by insertion sequence. + **/ + int serial() const { return _serial; } + + /** + * Set the text foreground color for all columns. + * For more specific purposes reimiplement paintCell(). + **/ + void setTextColor( const QColor & col ) + { _textColor = col; } + + /** + * Set the text background color for all columns. + * For more specific purposes reimiplement paintCell(). + **/ + void setBackgroundColor( const QColor & col ) + { _backgroundColor = col; } + + /** + * Returns a tool tip text for a specific column of this item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * This default implementation does nothing. + **/ + virtual QString toolTip( int column ) { return QString(); } + + +protected: + + /** + * Paint method. Reimplemented from @ref QListViewItem so different + * colors can be used. + * + * Reimplemented from QListViewItem. + **/ + virtual void paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + // + // Data members + // + + int _serial; + + QColor _textColor; + QColor _backgroundColor; +}; + + +/** + * Tool tip for a QY2ListView widget: Enables individual tool tips specific to + * each list item and each column. Overwrite QY2ListViewItem::toolTip() to use + * this. + **/ +class QY2ListViewToolTip : public QToolTip +{ +public: + + /** + * Constructor. + **/ + QY2ListViewToolTip( QY2ListView * parent ) + : QToolTip( parent->viewport() ), _listView( parent ) {} + + /** + * Destructor (to make gcc 4.x happy) + **/ + virtual ~QY2ListViewToolTip() {} + + +protected: + + /** + * Decide if there is a tool tip text at 'p' and display it if there is one. + * + * Reimplemented from QToolTip. + **/ + virtual void maybeTip( const QPoint & p ); + + + // + // Data members + // + + QY2ListView * _listView; +}; + +#endif // ifndef QY2ListView_h diff --git a/src/QY2Settings.cc b/src/QY2Settings.cc new file mode 100644 index 0000000..73c77bf --- /dev/null +++ b/src/QY2Settings.cc @@ -0,0 +1,315 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt classes | +| (C) SuSE Linux AG | +\----------------------------------------------------------------------/ + + File: QY2Settings.cpp + + Author: Stefan Hundhammer + + This is a pure Qt class - it can be used independently of YaST2. + +/-*/ + + + +#include "QY2Settings.h" + +#include +#include + +#include + +using std::cout; +using std::cerr; +using std::endl; + + +QY2Settings::QY2Settings( const QString & fileName, AccessMode accessMode ) + : _fileName( fileName ) + , _accessMode( accessMode ) +{ + _sections.setAutoDelete( true ); + + if ( _accessMode == ReadOnly || _accessMode == ReadWrite ) + load(); + else + initSections(); +} + +void QY2Settings::initSections() +{ + _defaultSection = new Section( "" ); + CHECK_PTR( _defaultSection ); + + _currentSection = _defaultSection; + _sections.insert( "", _defaultSection ); +} + + + +QY2Settings::~QY2Settings() +{ + if ( _dirty && _accessMode != ReadOnly ) + save(); +} + + +bool QY2Settings::selectSection( const QString & sectionName ) +{ + _currentSection = _sections[ sectionName ]; + + if ( _currentSection ) + { + return true; + } + else + { + _currentSection = _defaultSection; + return false; + } +} + + +void QY2Settings::selectDefaultSection() +{ + _currentSection = _defaultSection; +} + + +QStringList QY2Settings::sections( bool includeUnnamed ) const +{ + QStringList sectionList; + SectionIterator it( _sections ); + + while ( *it ) + { + QString sectionName = (*it)->name(); + + if ( includeUnnamed || ! sectionName.isEmpty() ) + sectionList.append( sectionName ); + + ++it; + } + + return sectionList; +} + + +QString QY2Settings::get( const QString & key, const QString & fallback ) const +{ + // Can't use operator[] here since we have a pointer + + Section::const_iterator it = _currentSection->find( key ); + + if ( it == _currentSection->constEnd() ) + return fallback; + + return it.data(); +} + + +QString QY2Settings::operator[] ( const QString & key ) +{ + return get( key ); +} + + +bool QY2Settings::hasKey( const QString & key ) +{ + return _currentSection->contains( key ); +} + + +QStringList QY2Settings::keys() const +{ + QStringList keyList; + + for ( Section::const_iterator it = _currentSection->constBegin(); + it != _currentSection->constEnd(); + ++it ) + { + keyList.append( it.key() ); + } + + return keyList; +} + + +bool QY2Settings::load() +{ + initSections(); + _readError = false; + + if ( _accessMode == WriteOnly ) + return false; + + + QFile file( _fileName ); + + if ( ! file.open( IO_ReadOnly ) ) + { + cerr << "Can't load settings from " << _fileName + << ": " << file.errorString() + << endl; + + _readError = true; + + return false; + } + + QTextStream str( &file ); + str.setEncoding( QTextStream::UnicodeUTF8 ); + QString line; + int lineCount = 0; + + while ( ! file.atEnd() ) + { + line = str.readLine().stripWhiteSpace(); + lineCount++; + + + // Skip empty lines + + if ( line.isEmpty() ) continue; + + + // Skip comment lines + + if ( line.startsWith( "#" ) ) continue; + if ( line.startsWith( ";" ) ) continue; + if ( line.startsWith( "//" ) ) continue; + + + if ( line.startsWith( "[" ) ) + { + // New section + + line.replace( QRegExp( "^\\[\\s*" ), "" ); + line.replace( QRegExp( "\\s*\\].*$" ), "" ); + addSection( line ); + } + else if ( line.contains( "=" ) ) + { + // key=value pair + + QString key = line.section( "=", 0, 0 ).stripWhiteSpace(); + QString value = line.section( "=", 1, 1 ).stripWhiteSpace(); + + value.replace( QRegExp( "^\"" ), "" ); // strip leading " + value.replace( QRegExp( "\"$" ), "" ); // strip trailing " + value.replace( "\\\"", "\"" ); // un-escape " + + // qDebug( "Read %s=%s", (const char *) key, (const char *) value ); + set( key, value ); + } + else + { + qWarning( "%s:%d: Syntax error: %s", + (const char *) _fileName, lineCount, (const char *) line ); + } + } + + _dirty = false; + + return true; +} + + +bool QY2Settings::save() +{ + if ( _accessMode == ReadOnly ) + return false; + + QFile file( _fileName ); + + if ( ! file.open( IO_WriteOnly ) ) + { + cerr << "Can't save settings to " << _fileName + << ": " << file.errorString() + << endl; + + return false; + } + + QTextStream str( &file ); + str.setEncoding( QTextStream::UnicodeUTF8 ); + + // The default section must be saved first since it doesn't have a section + // name that could be used for a headline + saveSection( str, _defaultSection ); + + SectionIterator sectIt( _sections ); + + while ( *sectIt ) + { + if ( *sectIt != _defaultSection ) + saveSection( str, *sectIt ); + ++sectIt; + } + + _dirty = false; + + return true; +} + + +void QY2Settings::saveSection( QTextStream & str, Section * sect ) +{ + // Section header + + if ( ! sect->name().isEmpty() ) + str << "[" << sect->name() << "]" << endl; + + // value=key pairs for this section + + for ( Section::iterator it = sect->begin(); + it != sect->end(); + ++it ) + { + QString value = it.data(); + value.replace( "\"", "\\\"" ); // Escape embedded " with \" + + str << it.key() << "= \"" << value << "\"" << endl; + } + + str << endl; +} + + +void QY2Settings::set( const QString & key, const QString & value ) +{ + _currentSection->insert( key, value ); + _dirty = true; +} + + +void QY2Settings::addSection( const QString & sectionName ) +{ + _currentSection = _sections[ sectionName ]; // already there? + + if ( _currentSection ) // -> use it + return; + + _currentSection = new Section( sectionName ); + CHECK_PTR( _currentSection ); + + _sections.insert( sectionName, _currentSection ); + _dirty = true; +} + + +void QY2Settings::clearSection() +{ + _currentSection->clear(); + _dirty = true; +} + + diff --git a/src/QY2Settings.h b/src/QY2Settings.h new file mode 100644 index 0000000..6af312d --- /dev/null +++ b/src/QY2Settings.h @@ -0,0 +1,255 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| contributed Qt classes | +| (C) SuSE Linux AG | +\----------------------------------------------------------------------/ + + File: QY2Settings.h + + Author: Stefan Hundhammer + + This is a pure Qt class - it can be used independently of YaST2. + +/-*/ + + +#ifndef QY2Settings_h +#define QY2Settings_h + +#include +#include +#include +#include +#include + +/** + * Utility class that handles program settings in .ini file format: + * + * key="value" + * key2 = value + * ; comment + * # comment + * + * [section-title] + * key = "value" + * ; comment + * key2="value" + * key3 = _( "message that needs to be translated" ) + * + * [section-title2] + * key="value" + * key2="value" + * + * key=value pairs appear one on a line each. Leading and trailing whitespace + * is disregarded around both key and value. Value should be quoted (but + * doesn't need to). Quotes in value are escaped with \". + **/ +class QY2Settings +{ +public: + + enum AccessMode + { + ReadOnly, + ReadWrite, + WriteOnly + }; + + /** + * Constructor. Reads settings from the specified file. + * + * Use readError() or readOk() afterwards to check for read errors. + **/ + QY2Settings( const QString & fileName, AccessMode accessMode=ReadOnly ); + + /** + * Destructor. + * + * Writes any pending changes back to the file if there are any left + * if accessMode() is ReadWrite or WriteOnly. + **/ + ~QY2Settings(); + + /** + * Returns 'true' if the settings couldn't be read from the file specified + * in the constructor. + **/ + bool readError() const { return _readError; } + + /** + * Returns 'true' if the settings were read without problems from the file + * specified in the constructor. This is simply the opposite of + * readError(). + **/ + bool readOk() const { return ! _readError; } + + /** + * Select the specified section in the settings for subsequent get() + * calls. Until is used, the unnamed default section is used. + * + * In the settings file, a section is marked with + * + * [section-title] + * + * Using a null string (QString::null) switches back to the unnamed default + * section. + * + * Returns 'true' upon success, 'false' if there is no such section (in + * which case the unnamed default section will be selected). + **/ + bool selectSection( const QString & section ); + + /** + * Select the default (unnamed) section for subsequent get() calls. + * This is the default unless selectSection() was called. + **/ + void selectDefaultSection(); + + /** + * Returns the name of the current section or QString::null if the default + * section is used. + **/ + QString currentSection() const { return _currentSectionName; } + + /** + * Returns a list of all sections. + * 'includeUnnamed' specifies if the unnamed default section should be + * included in the list. + * The list sort order is undefined. + **/ + QStringList sections( bool includeUnnamed = false ) const; + + /** + * Returns the value for the specified key in the current section. + * If there is no such key, the specified fallback value is returned. + **/ + QString get( const QString & key, + const QString & fallback = "") const; + + /** + * Same as get() with fallback always an empty string + **/ + QString operator[] ( const QString & key ); + + /** + * Checks if the current section has the specified key. + **/ + bool hasKey( const QString & key ); + + /** + * Returns a list of all keys in the current section. + * The list sort order is undefined. + **/ + QStringList keys() const; + + // + // Write access + // + // All write access functions will fail if the current access mode is not + // one of ReadWrite / WriteOnly. + // + + /** + * Set the specified key to the specified value. Overwrites any existing + * key-value pair or adds a new one if there is no such key yet. + **/ + void set( const QString & key, const QString & value ); + + /** + * Add a section with the specified name. If a section with that name + * already exists, it will only be selected and its old contents will + * remain untouched. + * In any case, this section becomes the current section. + **/ + void addSection( const QString & section ); + + /** + * Clear all key=value pairs from the current section. + **/ + void clearSection(); + + /** + * Writes changed settings back to the file specified in the constructor if + * accessMode() is ReadWrite or WriteOnly. + * + * Returns 'true' on success. + **/ + bool save(); + + /** + * Returns 'true' if there are any changes that need to be written. + * + * Always returns 'false' if accessMode() is ReadOnly. + **/ + bool pendingChanges() const { return _dirty; } + + /** + * Returns the file name. + **/ + QString fileName() const { return _fileName; } + + /** + * Returns the access mode - one of ReadOnly, ReadWrite, WriteOnly. + **/ + AccessMode accessMode() const { return _accessMode; } + + +protected: + + class Section: public QMap + { + public: + Section( const QString & name ) + : QMap() + , _name( name ) + {} + QString name() const { return _name; } + + protected: + + QString _name; + }; + + + + /** + * Initialize the section data + **/ + void initSections(); + + /** + * Read the settings file. Sets _readError depending on success or failure. + * Returns 'true' upon success. + **/ + bool load(); + + /** + * Save one section to a stream + **/ + void saveSection( QTextStream & stream, Section * section ); + + + // + // Data members + // + + QString _fileName; + AccessMode _accessMode; + bool _readError; + QString _currentSectionName; + Section * _currentSection; + bool _dirty; + + Section * _defaultSection; + QDict

    _sections; + + typedef QDictIterator
    SectionIterator; +}; + +#endif // QY2Settings_h diff --git a/src/Y2CCQt.cc b/src/Y2CCQt.cc new file mode 100644 index 0000000..036dfa8 --- /dev/null +++ b/src/Y2CCQt.cc @@ -0,0 +1,29 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: Y2CCQt.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include "Y2CCQt.h" + +// This is very important: We create one global variable of +// Y2CCQt. Its constructor will register it automatically to +// the Y2ComponentBroker, so that will be able to find it. +// This all happens before main() is called! + +Y2CCQt g_y2ccqt; + + diff --git a/src/Y2CCQt.h b/src/Y2CCQt.h new file mode 100644 index 0000000..4aad419 --- /dev/null +++ b/src/Y2CCQt.h @@ -0,0 +1,71 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: Y2CCQt.h + + Author: Mathias Kettner + Maintainer: Stefan Hundhammer + +/-*/ + + + +#ifndef _Y2CCQt_h +#define _Y2CCQt_h + +#include "YQUIComponent.h" +#include + +/** + * @short Y2ComponentCreator that can create Qt user interfaces + * A Y2ComponentCreator is an object, that can create components. + * It is given a component name and - if it knows how to create + * such a component - returns a newly created component of this + * type. The Y2CCQt can create components with the name "qt". + */ +class Y2CCQt : public Y2CCUI +{ +public: + /** + * Creates a Qt component creator + */ + Y2CCQt() : Y2CCUI() { }; + + /** + * Returns true, since the qt component is a + * YaST2 server. + */ + bool isServerCreator() const { return true; }; + + /** + * Creates a new Qt UI component. + */ + Y2Component *create(const char * name) const + { + if (!strcmp(name, "qt") ) + { + Y2Component* ret = YUIComponent::uiComponent (); + if (!ret || ret->name () != name) + { + ret = new YQUIComponent(); + } + return ret; + } + else + return 0; + } +}; + +#endif // ifndef _Y2CCQt_h + + +// EOF diff --git a/src/YFrameBuffer.cc b/src/YFrameBuffer.cc new file mode 100644 index 0000000..68aa0f2 --- /dev/null +++ b/src/YFrameBuffer.cc @@ -0,0 +1,164 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YFrameBuffer.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "framebuffer" +#include + +#include +#include +#include +#include +#include +#include + +#include "YFrameBuffer.h" + + +YFrameBuffer::YFrameBuffer( int width, int height, int depth ) +{ + _width = width; + _height = height; + _depth = depth; + + _fb = 0; + _fb_fd = -1; + _fb_len = 0; + + switch ( _depth ) + { + case 15: + case 16: _bytesPerPixel = 2; + break; + + case 24: + case 32: _bytesPerPixel = 4; + break; + + default: + y2warning( "Pixel depth %d not supported", _depth ); + _bytesPerPixel = 0; + break; + } + + if ( _bytesPerPixel > 0 ) + mmapFB(); +} + + +YFrameBuffer::~YFrameBuffer() +{ + munmapFB(); +} + + +void YFrameBuffer::mmapFB() +{ + if ( _fb ) + { + y2error( "Framebuffer already mmap()'ed" ); + return; + } + + _fb_fd = open( "/dev/fb0", O_RDWR ); + + if ( _fb_fd < 0 ) + { + y2error( "Can't open /dev/fb0 - errno %d: %s", errno, strerror( errno ) ); + return; + } + + _fb_len = _width * _height * _bytesPerPixel; + _fb = mmap( 0, // start + _fb_len, // length + PROT_READ | PROT_WRITE, // prot + MAP_SHARED, // flags + _fb_fd, // file descriptor + 0 ); // offset + + if ( _fb == MAP_FAILED ) + { + y2error( "mmap() failed for /dev/fb0 - errno %d: %s", errno, strerror( errno ) ); + _fb = 0; + close( _fb_fd ); + } + + _fb16 = (UINT16 *) _fb; + _fb32 = (UINT32 *) _fb; +} + + +void YFrameBuffer::munmapFB() +{ + if ( ! _fb ) + return; + + munmap( _fb, _fb_len ); + close( _fb_fd ); + + _fb = 0; + _fb16 = 0; + _fb32 = 0; + _fb_fd = -1; +} + + +void YFrameBuffer::setPixel( int x, int y, FBPixel pixel ) +{ + if ( ! _fb ) + return; + + if ( x < _width && y < _height ) + { + if ( _bytesPerPixel == 2 ) + { + pixel &= 0xFFFF; + _fb16[ y * _width + x ] = (UINT16) pixel; + } + else if ( _bytesPerPixel == 4 ) + { + _fb32[ y * _width + x ] = (UINT32) pixel; + } + } +} + + +YFrameBuffer::FBPixel +YFrameBuffer::pixel( int x, int y ) +{ + if ( ! _fb ) + return 0; + + if ( x < _width && y < _height ) + { + if ( _bytesPerPixel == 2 ) + { + return (FBPixel) _fb16[ y * _width + x ]; + } + else if ( _bytesPerPixel == 4 ) + { + return (FBPixel) _fb32[ y * _width + x ]; + } + } + + return 0; +} + + + + diff --git a/src/YFrameBuffer.h b/src/YFrameBuffer.h new file mode 100644 index 0000000..3e9099e --- /dev/null +++ b/src/YFrameBuffer.h @@ -0,0 +1,92 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQFrameBuffer.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YFrameBuffer_h +#define YFrameBuffer_h + +class YFrameBuffer +{ +public: + + typedef unsigned short UINT16; + typedef unsigned long UINT32; + typedef UINT32 FBPixel; + + /** + * Constructor + **/ + YFrameBuffer( int screenWidth, int screenHeight, int bitDepth ); + + /** + * Destructor + **/ + virtual ~YFrameBuffer(); + + /** + * Set the framebuffer pixel at (x, y) + **/ + void setPixel( int x, int y, FBPixel pixel ); + + /** + * Get the framebuffer pixel value at (x, y) + **/ + FBPixel pixel( int x, int y ); + + /** + * Returns 'true' if the framebuffer is valid, i.e. can be used. + **/ + bool valid() const { return _fb != 0; } + + int width() const { return _width; } + int height() const { return _height; } + int depth() const { return _depth; } + int bytesPerPixel() const { return _bytesPerPixel; } + + +protected: + + /** + * mmap() the framebuffer device + **/ + void mmapFB(); + + /** + * release the mmaped framebuffer + **/ + void munmapFB(); + + + // + // Data members + // + + int _width; + int _height; + int _depth; + + void * _fb; + int _fb_fd; + UINT32 * _fb32; + UINT16 * _fb16; + size_t _fb_len; + int _bytesPerPixel; +}; + + +#endif // ifndef YFrameBuffer_h diff --git a/src/YQAlignment.cc b/src/YQAlignment.cc new file mode 100644 index 0000000..504b353 --- /dev/null +++ b/src/YQAlignment.cc @@ -0,0 +1,96 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQAlignment.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include +#include +#include "YQAlignment.h" + +using std::string; + + +YQAlignment::YQAlignment( YWidget * parent, + YAlignmentType horAlign, + YAlignmentType vertAlign ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YAlignment( parent, horAlign, vertAlign ) +{ + setWidgetRep( this ); +} + + +YQAlignment::YQAlignment( YWidget * yParent, + QWidget * qParent, + YAlignmentType horAlign, + YAlignmentType vertAlign ) + : QWidget( qParent ) + , YAlignment( yParent, horAlign, vertAlign ) +{ + setWidgetRep( this ); +} + + +void YQAlignment::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void YQAlignment::moveChild( YWidget * child, int newX, int newY ) +{ + QWidget * qw = (QWidget *) ( child->widgetRep() ); + qw->move( newX, newY ); +} + + +void YQAlignment::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + YAlignment::setSize( newWidth, newHeight ); +} + + +void YQAlignment::setBackgroundPixmap( const string & pixmapFileName ) +{ + string pixmapName = pixmapFileName; + + YAlignment::setBackgroundPixmap( pixmapName ); // Prepend path etc. + pixmapName = YAlignment::backgroundPixmap(); + + if ( pixmapName.empty() ) // Delete any old background pixmap + { + unsetPalette(); + } + else // Set a new background pixmap + { + QPixmap pixmap( pixmapName.c_str() ); + + if ( pixmap.isNull() ) + { + y2error( "Can't load background pixmap %s", pixmapName.c_str() ); + } + else + { + setPaletteBackgroundPixmap( pixmap ); + } + } +} + +#include "YQAlignment.moc" diff --git a/src/YQAlignment.h b/src/YQAlignment.h new file mode 100644 index 0000000..715ca7a --- /dev/null +++ b/src/YQAlignment.h @@ -0,0 +1,86 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQAlignment.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQAlignment_h +#define YQAlignment_h + +#include + +#include "YAlignment.h" + +class QWidget; + +class YQAlignment : public QWidget, public YAlignment +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQAlignment( YWidget * parent, + YAlignmentType horAlign, + YAlignmentType vertAlign ); + + /** + * Constructor for cases where the YWidget parent's widgetRep() isn't the + * QWidget parent, for example in compound widgets like YQWizard where it + * makes sense to pass a child of the YQWizard (the client area) as the + * QWidget parent. + * + * Use this only if you know very well what you are doing. + **/ + YQAlignment( YWidget * yParent, + QWidget * qParent, + YAlignmentType horAlign, + YAlignmentType vertAlign ); + + /** + * Move the child widget to a new position. + * + * Implemented from YAlignment. + **/ + virtual void moveChild( YWidget * child, int newX, int newY ); + + /** + * Enable or disable this widget and its child. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Set the background pixmap. + * + * Reimplemented from YAlignment. + **/ + virtual void setBackgroundPixmap( const string & pixmapFileName ); + +}; + + +#endif // YQAlignment_h diff --git a/src/YQApplication.cc b/src/YQApplication.cc new file mode 100644 index 0000000..4e30e5a --- /dev/null +++ b/src/YQApplication.cc @@ -0,0 +1,374 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQApplication.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include + +#define y2log_component "qt-ui" +#include + +#include "YQApplication.h" + + +YQApplication::YQApplication() + : YApplication() + , _currentFont( 0 ) + , _headingFont( 0 ) + , _boldFont( 0 ) + , _fontFamily( "Sans Serif" ) + , _langFonts( 0 ) + , _qtTranslations( 0 ) + , _autoFonts( false ) + , _autoNormalFontSize( -1 ) + , _autoHeadingFontSize( -1 ) +{ + y2debug( "YQApplication constructor start" ); + + setIconBasePath( ICONDIR "/icons/22x22/apps/" ); + loadPredefinedQtTranslations(); + + y2debug( "YQApplication constructor end" ); +} + + +YQApplication::~YQApplication() +{ + if ( _langFonts ) + delete _langFonts; + + if ( _qtTranslations ) + delete _qtTranslations; + + deleteFonts(); +} + + +void +YQApplication::setLanguage( const string & language, + const string & encoding ) +{ + YApplication::setLanguage( language, encoding ); + loadPredefinedQtTranslations(); + setLangFonts( language, encoding ); +} + + + +void +YQApplication::loadPredefinedQtTranslations() +{ + QString path = QT_LOCALEDIR; + QString language = QLocale::system().name(); + + QString transFile = QString( "qt_%1.qm") + .arg( language.lower().replace('_','-') ); + + if ( path.isEmpty() ) + { + y2warning( "Qt locale directory not set - " + "no translations for predefined Qt dialogs" ); + return; + } + + if ( ! _qtTranslations ) + _qtTranslations = new QTranslator(); + + _qtTranslations->load( transFile, path ); + + if ( _qtTranslations->isEmpty() ) + { + // try fallback + transFile = QString( "qt_%1.qm").arg( language.lower().left(2) ); + _qtTranslations->load( transFile, path ); + } + + if ( _qtTranslations->isEmpty() ) + { + y2warning( "Can't load translations for predefined Qt dialogs from %s/%s", + (const char *) path, (const char *) transFile ); + } + else + { + y2milestone( "Loaded translations for predefined Qt dialogs from %s/%s", + (const char *) path, (const char *) transFile ); + + qApp->installTranslator( _qtTranslations ); + } + + + // Force reverse layout for Arabic and Hebrew + + if ( ( language.startsWith( "ar" ) || // Arabic + language.startsWith( "he" ) ) // Hebrew + && ! qApp->reverseLayout() ) + { + y2warning( "Using fallback rule for reverse layout for language '%s'", + (const char *) language ); + + qApp->setReverseLayout( true ); + } +} + + +void +YQApplication::setLangFonts( const string & language, const string & encoding ) +{ + QString oldFontFamily = _fontFamily; + + if ( ! _langFonts ) + { + _langFonts = new QY2Settings( LANG_FONTS_FILE ); + CHECK_PTR( _langFonts ); + + if ( _langFonts->readError() ) + y2error( "Error reading %s", (const char *) _langFonts->fileName() ); + else + y2milestone( "%s read OK", (const char *) _langFonts->fileName() ); + } + + QString lang = language.c_str(); + + if ( ! encoding.empty() ) + lang += QString( "." ) + encoding.c_str(); + + QString key; + + if ( ! _langFonts->hasKey( fontKey( lang ) ) ) // Try with encoding ("zh_CN.UTF8" etc.) + { + lang = language.c_str(); // Try without encoding ("zh_CN") + + if ( ! _langFonts->hasKey( fontKey( lang ) ) ) + lang.replace( QRegExp( "_.*$" ), "" ); // Cut off trailing country ("_CN") + } + + if ( _langFonts->hasKey( fontKey( lang ) ) ) + { + _fontFamily = _langFonts->get( fontKey( lang ), "Sans Serif" ); + y2milestone( "%s = \"%s\"", (const char *) fontKey( lang ), (const char *) _fontFamily ); + } + else + { + _fontFamily = _langFonts->get( fontKey( "" ), "Sans Serif" ); + y2milestone( "Using fallback for %s: font = \"%s\"", + (const char *) lang, (const char *) _fontFamily ); + } + + if ( _fontFamily != oldFontFamily && ! _fontFamily.isEmpty() ) + { + y2milestone( "New font family: %s", _fontFamily.latin1() ); + deleteFonts(); + int size = qApp->font().pointSize(); + QFont font( _fontFamily ); + font.setPointSize( size ); + qApp->setFont( font, true ); // font, informWidgets + y2milestone( "Reloading fonts - now using \"%s\"", + (const char *) font.toString() ); + } + else + { + y2debug( "No font change" ); + } +} + + +QString +YQApplication::fontKey( const QString & lang ) +{ + if ( lang.isEmpty() ) + return "font"; + else + return QString( "font[%1]").arg( lang ); +} + + +const QFont & +YQApplication::currentFont() +{ + /** + * Brute force approach to make sure we'll really get a complete Unicode font: + * Explicitly load the one font that we made sure to contain all required + * characters, including Latin1, Latin2, Japanese, Korean, and the + * characters used for glyphs. + * + * There are many fonts that claim to be Unicode, but most of them contain + * just a sorry excuse for a complete Unicode character set. Qt can't know + * how complete a font is, so it chooses one that might be better in otherf + * aspects, but lacks necessary characters. + **/ + + if ( ! _currentFont ) + { + if ( autoFonts() ) + { + pickAutoFonts(); + + _currentFont = new QFont( _fontFamily ); + _currentFont->setPixelSize( _autoNormalFontSize ); + _currentFont->setWeight( QFont::Normal ); + + y2milestone( "Loaded %d pixel font: %s", _autoNormalFontSize, + (const char *) _currentFont->toString() ); + + qApp->setFont( * _currentFont, true ); // font, informWidgets + } + else + { + // y2debug( "Copying QApplication::font()" ); + _currentFont = new QFont( qApp->font() ); + } + } + + return * _currentFont; +} + + +const QFont & +YQApplication::boldFont() +{ + if ( ! _boldFont ) + { + _boldFont = new QFont( currentFont() ); + _boldFont->setBold( true ); + } + + return * _boldFont; +} + + +const QFont & +YQApplication::headingFont() +{ + /** + * Brute force load the heading font - see currentFont() above for more. + **/ + + if ( ! _headingFont ) + { + if ( autoFonts() ) + { + pickAutoFonts(); + + _headingFont = new QFont( _fontFamily ); + _headingFont->setPixelSize( _autoHeadingFontSize ); + _headingFont->setWeight( QFont::Bold ); + + y2milestone( "Loaded %d pixel bold font: %s", _autoHeadingFontSize, + (const char *) _headingFont->toString() ); + } + else + { + _headingFont = new QFont( _fontFamily, 14, QFont::Bold ); + } + } + + return * _headingFont; +} + + +void +YQApplication::deleteFonts() +{ + if ( _currentFont ) + delete _currentFont; + + if ( _headingFont ) + delete _headingFont; + + if ( _boldFont ) + delete _boldFont; + + _currentFont = 0; + _headingFont = 0; + _boldFont = 0; +} + + +void +YQApplication::setAutoFonts( bool useAutoFonts ) +{ + _autoFonts = useAutoFonts; +} + + +void +YQApplication::pickAutoFonts() +{ + if ( _autoNormalFontSize >= 0 ) // Use cached values + return; + +#warning FIXME: defaultSize +#if 0 + int x = _default_size.width(); + int y = _default_size.height(); +#endif + int x = 800; + int y = 600; + + + int normal = 10; + int heading = 12; + + if ( x >= 800 && y >= 600 ) + { + normal = 10; + heading = 12; + } + + if ( x >= 1024 && y >= 768 ) + { + normal = 12; + heading = 14; + } + + if ( x >= 1280 && y >= 1024 ) + { + normal = 14; + heading = 18; + } + + if ( x >= 1400 ) + { + normal = 16; + heading = 20; + } + + if ( x >= 1600 ) + { + normal = 18; + heading = 24; + } + + if ( x >= 2048 ) // Sounds futuristic? Just wait one or two years... + { + normal = 20; + heading = 28; + } + + _autoNormalFontSize = normal; + _autoHeadingFontSize = heading; + + y2milestone( "Selecting auto fonts - normal: %d, heading: %d (bold)", + _autoNormalFontSize, _autoHeadingFontSize ); +} + + + + +#include "YQApplication.moc" diff --git a/src/YQApplication.h b/src/YQApplication.h new file mode 100644 index 0000000..aa640f1 --- /dev/null +++ b/src/YQApplication.h @@ -0,0 +1,178 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQApplication.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQApplication_h +#define YQApplication_h + +#include +#include +#include + +#include "QY2Settings.h" +#include "YApplication.h" + + +class YQApplication: public QObject, public YApplication +{ + Q_OBJECT + +protected: + + friend class YQUI; + + /** + * Constructor. + * + * Use YUI::app() to get the singleton for this class. + **/ + YQApplication(); + + /** + * Destructor. + **/ + virtual ~YQApplication(); + + +public: + + /** + * Set language and encoding for the locale environment ($LANG). + * + * Load UI-internal translations (e.g. for predefined dialogs like + * file selection) and fonts. + * + * 'language' is the ISO short code ("de_DE", "en_US", ...). + * + * 'encoding' an (optional) encoding ("utf8", ...) that will be appended if + * present. + * + * Reimplemented from YApplication. + **/ + virtual void setLanguage( const string & language, + const string & encoding = string() ); + + /** + * Load translations for Qt's predefined dialogs like file selection box + * etc. + **/ + void loadPredefinedQtTranslations(); + + /** + * Set fonts according to the specified language and encoding. + * + * This is most important for some Asian languages that have overlaps in + * the Unicode table, like Japanese vs. Chinese. + **/ + void setLangFonts( const string & language, + const string & encoding = string() ); + + /** + * Returns the application's default font. + **/ + const QFont & currentFont(); + + /** + * Returns the application's default bold font. + **/ + const QFont & boldFont(); + + /** + * Returns the application's heading font. + **/ + const QFont & headingFont(); + + /** + * Delete the fonts so they will be reloaded upon their next usage. + **/ + void deleteFonts(); + + /** + * Determine good fonts based on defaultsize geometry and set + * _auto_normal_font_size and _auto_heading_font_size accordingly. + * Caches the values, so it's safe to call this repeatedly. + **/ + void pickAutoFonts(); + + /** + * Returns 'true' if the UI automatically picks fonts, disregarding Qt + * standard settings. + * + * This makes sense during system installation system where the display DPI + * cannot reliably be retrieved and thus Qt uses random font sizes based on + * that random DPI. + **/ + bool autoFonts() const { return _autoFonts; } + + /** + * Set whether or not fonts should automatically be picked. + **/ + void setAutoFonts( bool useAutoFonts ); + + +protected: + + /** + * Constructs a key for the language specific font file: + * "font[lang]" + * for + * font[de_DE] = "Sans Serif" + * font[zh] = "ChineseSpecial, something" + * font[ja_JP] = "JapaneseSpecial, something" + * font = "Sans Serif" + **/ + QString fontKey( const QString & lang ); + + + // + // Data members + // + + // Fonts + + QFont * _currentFont; + QFont * _headingFont; + QFont * _boldFont; + + /** + * Font family or list of font families to use ("Sans Serif" etc.) + **/ + QString _fontFamily; + + /** + * Language-specific font settings + **/ + QY2Settings * _langFonts; + + /** + * Translator for the predefined Qt dialogs + **/ + QTranslator * _qtTranslations; + + /** + * For auto fonts + **/ + bool _autoFonts; + int _autoNormalFontSize; + int _autoHeadingFontSize; + + +}; + + +#endif // YQApplication_h diff --git a/src/YQBarGraph.cc b/src/YQBarGraph.cc new file mode 100644 index 0000000..ec08532 --- /dev/null +++ b/src/YQBarGraph.cc @@ -0,0 +1,249 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQBarGraph.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include +#include +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQBarGraph.h" + + +#define YQBarGraphOuterMargin YQWidgetMargin +#define YQBarGraphLabelHorizontalMargin 1 +#define YQBarGraphLabelVerticalMargin 2 +#define YQBarGraphMinWidth 80 +#define YQBarGraphMinHeight 30 + + + +YQBarGraph::YQBarGraph( YWidget * parent ) + : QFrame( (QWidget *) parent->widgetRep() ) + , YBarGraph( parent ) +{ + setWidgetRep( this ); +} + + +YQBarGraph::~YQBarGraph() +{ + // NOP +} + + +void +YQBarGraph::doUpdate() +{ + QFrame::update(); // triggers drawContents() +} + + +void +YQBarGraph::drawContents( QPainter * painter ) +{ + unsigned nextDefaultColor = 0; + int totalWidth = contentsRect().width() - 2*YQBarGraphOuterMargin; + int segHeight = contentsRect().height() - 2*YQBarGraphOuterMargin; + int x_off = YQBarGraphOuterMargin; + int y_off = YQBarGraphOuterMargin; + int valueTotal = 0; + + for ( int i=0; i < segments(); i++ ) + valueTotal += segment(i).value(); + + if ( valueTotal == 0 ) // Avoid division by zero + return; + + for ( int i=0; i < segments(); i++ ) + { + const YBarGraphSegment & seg = segment(i); + int segWidth = ( (long) totalWidth * seg.value() ) / valueTotal; + + if ( i == segments()-1 ) + { + // Compensate for rounding errors: + // The last segment gets all leftover pixels from the previous ones. + + segWidth = totalWidth - x_off + YQBarGraphOuterMargin; + } + + + // + // Fill the segment + // + + YColor segmentColor = seg.segmentColor(); + YColor textColor = seg.textColor(); + + if ( segmentColor.isUndefined() || textColor.isUndefined() ) + { + // If any of the colors is undefined, use the next default color + // for both so some contrast is ensured. + + segmentColor = defaultSegmentColor( nextDefaultColor ); + textColor = defaultTextColor ( nextDefaultColor++ ); + } + + painter->setBrush( QColor( segmentColor.red(), + segmentColor.green(), + segmentColor.blue() ) ); + painter->setPen( Qt::NoPen ); + painter->drawRect( x_off, y_off, segWidth+2, segHeight+2 ); + + + // + // Draw the label + // + + painter->setPen( Qt::SolidLine ); + painter->setPen( QColor( textColor.red(), + textColor.green(), + textColor.blue() ) ); + QString txt = seg.label(); + + if ( txt.contains( "%1" ) ) + txt = txt.arg( seg.value() ); // substitute variable + + painter->drawText( x_off + YQBarGraphLabelHorizontalMargin, + y_off + YQBarGraphLabelVerticalMargin, + segWidth - 2 * YQBarGraphLabelHorizontalMargin + 1, + segHeight - 2 * YQBarGraphLabelVerticalMargin + 1, + AlignCenter, txt ); + + // Prepare for the next segment + + x_off += segWidth; + } +} + + +YColor +YQBarGraph::defaultSegmentColor( unsigned index ) +{ + switch( index % 8 ) + { + case 0: return YColor( 0, 0, 128 ); // dark blue + case 1: return YColor( 64, 200, 255 ); // medium blue + case 2: return YColor( 255, 255, 255 ); // white + case 3: return YColor( 0, 153, 153 ); // cadet blue + case 4: return YColor( 150, 255, 255 ); // cyan + case 5: return YColor( 100, 100, 100 ); // medium grey + case 6: return YColor( 0, 200, 100 ); // medium green + case 7: return YColor( 0, 100, 76 ); // dark green + } + + return YColor( 255, 255, 255 ); // just to make gcc happy +} + + +YColor +YQBarGraph::defaultTextColor( unsigned index ) +{ + YColor black = YColor( 0, 0, 0 ); + YColor white = YColor( 255, 255, 255 ); + + switch( index % 8 ) + { + case 0: return white; + case 1: return black; + case 2: return black; + case 3: return black; + case 4: return black; + case 5: return white; + case 6: return black; + case 7: return white; + } + + return black; // just to make gcc happy +} + + +void +YQBarGraph::setEnabled( bool enabled ) +{ + QFrame::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int +YQBarGraph::preferredWidth() +{ + int width = 0; + QFontMetrics metrics = fontMetrics(); + + for ( int i=0; i < segments(); i++ ) + { + QString txt = segment(i).label(); + + if ( txt.contains( "%1" ) ) + txt = txt.arg( segment(i).value() ); + + QSize segSize = metrics.size( 0, txt ); + width += segSize.width(); + } + + width += 2 * YQBarGraphLabelHorizontalMargin; + width += frameWidth(); + width += 2 * YQBarGraphOuterMargin; + width = max( width, YQBarGraphMinWidth ); + + return width; +} + + +int +YQBarGraph::preferredHeight() +{ + int height = YQBarGraphMinHeight; + QFontMetrics metrics = fontMetrics(); + + for ( int i=0; i < segments(); i++ ) + { + QString txt = segment(i).label(); + + if ( txt.contains( "%1" ) ) + txt = txt.arg( segment(i).value() ); + + QSize segSize = metrics.size( 0, txt ); + height = max( height, segSize.height() ); + } + + height += 2 * YQBarGraphLabelVerticalMargin; + height += frameWidth(); + height += 2 * YQBarGraphOuterMargin; + height = max( height, YQBarGraphMinHeight ); + + return height; +} + + +void +YQBarGraph::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + + +#include "YQBarGraph.moc" diff --git a/src/YQBarGraph.h b/src/YQBarGraph.h new file mode 100644 index 0000000..91b52ac --- /dev/null +++ b/src/YQBarGraph.h @@ -0,0 +1,103 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQBarGraph.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQBarGraph_h +#define YQBarGraph_h + +#include "qframe.h" +#include "YBarGraph.h" + +class QPainter; + + +class YQBarGraph : public QFrame, public YBarGraph +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQBarGraph( YWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQBarGraph(); + + /** + * Perform a visual update on the screen. + * + * Implemented from YBarGraph. + **/ + virtual void doUpdate(); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + +protected: + + /** + * Draw the contents. + * + * Reimplemented from QFrame. + **/ + virtual void drawContents( QPainter * painter ); + + /** + * Return one from a set of default segment background colors. + **/ + YColor defaultSegmentColor( unsigned index ); + + /** + * Return one from a set of default text colors. This text color is + * guaranteed to contrast with the defaultSegmentColor with the same index. + **/ + YColor defaultTextColor( unsigned index ); +}; + + +#endif // YQBarGraph_h diff --git a/src/YQCheckBox.cc b/src/YQCheckBox.cc new file mode 100644 index 0000000..7ee2084 --- /dev/null +++ b/src/YQCheckBox.cc @@ -0,0 +1,163 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQCheckBox.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQApplication.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQCheckBox.h" + + +#define SPACING 8 + + +YQCheckBox::YQCheckBox( YWidget * parent, + const string & label, + bool checked ) + : QGroupBox( (QWidget *) parent->widgetRep() ) + , YCheckBox( parent, label ) +{ + setWidgetRep( this ); + setFrameStyle( NoFrame ); + + QBoxLayout * layout = new QBoxLayout( this, QBoxLayout::LeftToRight ); + + _qt_checkBox = new QCheckBox( fromUTF8( label ), this ); + YUI_CHECK_NEW( _qt_checkBox ); + + layout->addSpacing( SPACING ); + layout->addWidget( _qt_checkBox ); + layout->addSpacing( SPACING ); + + _qt_checkBox->setChecked( checked ); + + connect( _qt_checkBox, SIGNAL( stateChanged( int ) ), + this, SLOT ( stateChanged( int ) ) ); +} + + +YQCheckBox::~YQCheckBox() +{ + // NOP +} + + +YCheckBoxState +YQCheckBox::value() +{ + switch ( _qt_checkBox->state() ) + { + case QButton::On: return YCheckBox_on; + case QButton::Off: return YCheckBox_off; + case QButton::NoChange: return YCheckBox_dont_care; + } + + return YCheckBox_off; +} + + +void +YQCheckBox::setValue( YCheckBoxState newValue ) +{ + switch ( newValue ) + { + case YCheckBox_on: + _qt_checkBox->setChecked( true ); + _qt_checkBox->setTristate( false ); + break; + + case YCheckBox_off: + _qt_checkBox->setChecked( false ); + _qt_checkBox->setTristate( false ); + break; + + case YCheckBox_dont_care: + _qt_checkBox->setTristate( true ); + _qt_checkBox->setNoChange(); + break; + } +} + + +void YQCheckBox::setLabel( const string & label ) +{ + _qt_checkBox->setText( fromUTF8( label ) ); + YCheckBox::setLabel( label ); +} + + +void YQCheckBox::setUseBoldFont( bool useBold ) +{ + _qt_checkBox->setFont( useBold ? + YQUI::yqApp()->boldFont() : + YQUI::yqApp()->currentFont() ); + + YCheckBox::setUseBoldFont( useBold ); +} + + +void YQCheckBox::setEnabled( bool enabled ) +{ + _qt_checkBox->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQCheckBox::preferredWidth() +{ + return 2*SPACING + _qt_checkBox->sizeHint().width(); +} + + +int YQCheckBox::preferredHeight() +{ + return _qt_checkBox->sizeHint().height(); +} + + +void YQCheckBox::setSize( int newWidth, int newHeight ) +{ + _qt_checkBox->resize( newWidth - 2*SPACING, newHeight ); + resize( newWidth, newHeight ); +} + + +bool YQCheckBox::setKeyboardFocus() +{ + _qt_checkBox->setFocus(); + + return true; +} + + +void YQCheckBox::stateChanged( int newState ) +{ + // y2milestone( "new state: %d", newState ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +#include "YQCheckBox.moc" diff --git a/src/YQCheckBox.h b/src/YQCheckBox.h new file mode 100644 index 0000000..9b939dc --- /dev/null +++ b/src/YQCheckBox.h @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQCheckBox.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQCheckBox_h +#define YQCheckBox_h + +#include +#include "YCheckBox.h" + + +class QCheckBox; + +class YQCheckBox : public QGroupBox, public YCheckBox +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQCheckBox( YWidget * parent, + const string & label, + bool checked ); + + /** + * Destructor. + **/ + virtual ~YQCheckBox(); + + /** + * Get the current value: + * + * YCheckBox_on CheckBox is checked + * YCheckBox_off CheckBox is unchecked + * + * YCheckBox_dont_care tri-state: CheckBox is greyed out, + * neither checked nor unchecked + * + * Reimplemented from YCheckBox. + **/ + virtual YCheckBoxState value(); + + /** + * Set the CheckBox value (on/off/don't care). + * + * Reimplemented from YCheckBox. + **/ + virtual void setValue( YCheckBoxState state ); + + /** + * Change the label (the text) on the RadioButton. + * + * Reimplemented from YRadioButton. + **/ + virtual void setLabel( const string & label ); + + /** + * Use a bold font. + * + * Reimplemented from YRadioButton. + **/ + virtual void setUseBoldFont( bool bold = true ); + + /** + * Set enabled / disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +private slots: + + /** + * Triggered when the on/off status is changed + **/ + void stateChanged ( int newState ); + + +protected: + + QCheckBox * _qt_checkBox; +}; + +#endif // YQCheckBox_h diff --git a/src/YQCheckBoxFrame.cc b/src/YQCheckBoxFrame.cc new file mode 100644 index 0000000..c13c350 --- /dev/null +++ b/src/YQCheckBoxFrame.cc @@ -0,0 +1,204 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQCheckBoxFrame.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include +#include +#include "YQUI.h" +#include "YEvent.h" +#include "utf8.h" + +using std::max; + +#include "YQCheckBoxFrame.h" + +#define TOP_MARGIN 6 + + +YQCheckBoxFrame::YQCheckBoxFrame( YWidget * parent, + const string & label, + bool checked ) + : QGroupBox( (QWidget *) parent->widgetRep() ) + , YCheckBoxFrame( parent, label, checked) +{ + setWidgetRep ( this ); + QGroupBox::setTitle( fromUTF8( label ) ); + QGroupBox::setCheckable( true ); + preventQGroupBoxAutoEnablement(); + + setValue( checked ); +} + + +void YQCheckBoxFrame::setLabel( const string & newLabel ) +{ + YCheckBoxFrame::setLabel( newLabel ); + QGroupBox::setTitle( fromUTF8( label() ) ); +} + + +bool YQCheckBoxFrame::value() +{ + return _checkBox ? _checkBox->isChecked() : QGroupBox::isChecked(); +} + + +void YQCheckBoxFrame::setValue( bool newValue ) +{ + if ( _checkBox ) + _checkBox->setChecked( newValue ); + else + setChecked( newValue ); +} + + +void YQCheckBoxFrame::setEnabled( bool enabled ) +{ + if ( enabled ) + { + QFrame::setEnabled( true ); + handleChildrenEnablement( value() ); + } + else + { + QFrame::setEnabled( true ); + YWidget::setChildrenEnabled( false ); + } + + YWidget::setEnabled( enabled ); +} + + +void YQCheckBoxFrame::preventQGroupBoxAutoEnablement() +{ + /* + * This is a nasty hack. But it is necessary because QGroupBox handles its + * internal check box too nearsightedly: It forces all children to be + * enabled or disabled depending on the status of the check box. The + * behaviour cannot be inverted or suppressed. + * + * In some cases, however, it makes sense to let the application decide to + * handle that differently. Since the YaST2 UI is a toolkit, we leave this + * decision up to the application rather than forcing any specific behaviour. + */ + + // Find the check box in the child hierarchy (as a direct child) + + _checkBox = dynamic_cast( QObject::child( 0, // objName + "QCheckBox", // inheritsClass + false ) ); // recursive + + if ( ! _checkBox ) + { + y2warning( "Can't find QCheckBox child" ); + + connect( this, SIGNAL( toggled ( bool ) ), + this, SLOT ( stateChanged( bool ) ) ); + + return; + } + + // Disconnect all signals to this object. + // + // In particular, disconnect the connection from the check box's + // 'toggled()' signal to this object's parent class's (private) + // setChildrenEnabled() method. + + disconnect( _checkBox, // sender + 0, // signal + this, // receiver + 0 ); // slot (private method in parent class) + + // Connect the check box directly to this class. + + connect( _checkBox, SIGNAL( toggled ( bool ) ), + this, SLOT ( stateChanged( bool ) ) ); +} + + +void YQCheckBoxFrame::stateChanged( bool newState ) +{ + y2debug( "new state: %d", newState ); + handleChildrenEnablement( newState ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +void YQCheckBoxFrame::childEvent( QChildEvent * ) +{ + // Reimplemented to prevent the parent class disabling child widgets + // according to its default policy. + + // y2debug( "ChildEvent" ); +} + + +void +YQCheckBoxFrame::setSize( int newWidth, int newHeight ) +{ + resize ( newWidth, newHeight ); + + if ( hasChildren() ) + { + int newChildWidth = max ( 0, newWidth - 2 * frameWidth() - 1 ); + int newChildHeight = max ( 0, newHeight - frameWidth() - fontMetrics().height() - TOP_MARGIN - 1 ); + + firstChild()->setSize( newChildWidth, newChildHeight ); + + QWidget * qChild = (QWidget *) firstChild()->widgetRep(); + qChild->move( frameWidth(), fontMetrics().height() + TOP_MARGIN ); + } +} + + +int YQCheckBoxFrame::preferredWidth() +{ + int preferredWidth; + int childPreferredWidth = hasChildren() ? firstChild()->preferredWidth() : 0; + + preferredWidth = max( childPreferredWidth, + (10 + fontMetrics().width( title() ) ) ); + preferredWidth += 2*frameWidth() + 1; + + return preferredWidth; +} + + +int YQCheckBoxFrame::preferredHeight() +{ + int preferredHeight = hasChildren() ? firstChild()->preferredHeight() : 0; + preferredHeight += frameWidth() + fontMetrics().height() + TOP_MARGIN + 1; + + return preferredHeight; +} + + +bool YQCheckBoxFrame::setKeyboardFocus() +{ + QGroupBox::setFocus(); + + return true; +} + + + + +#include "YQCheckBoxFrame.moc" diff --git a/src/YQCheckBoxFrame.h b/src/YQCheckBoxFrame.h new file mode 100644 index 0000000..2442ddf --- /dev/null +++ b/src/YQCheckBoxFrame.h @@ -0,0 +1,136 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQCheckBoxFrame.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQCheckBoxFrame_h +#define YQCheckBoxFrame_h + +#include +#include "YCheckBoxFrame.h" + + +class QWidget; +class QCheckBox; + +class YQCheckBoxFrame : public QGroupBox, public YCheckBoxFrame +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQCheckBoxFrame( YWidget * parent, + const string & label, + bool checked ); + + /** + * Change the label text on the CheckBoxFrame. + * + * Reimplemented from YCheckBoxFrame. + **/ + virtual void setLabel( const string & label ); + + /** + * Check or uncheck the CheckBoxFrame's check box. + * + * Reimplemented from YCheckBoxFrame. + **/ + virtual void setValue( bool isChecked ); + + /** + * Get the status of the CheckBoxFrame's check box. + * + * Reimplemented from YCheckBoxFrame. + **/ + virtual bool value(); + + /** + * Set enabled / disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +private slots: + + /** + * Triggered when the on/off status is changed + **/ + void stateChanged( bool newState ); + + +protected: + + /** + * Prevent standard QGroupBox behaviour to always enable or disable all + * children according to its check box's status (can't be inverted or left + * to the application). + * + * This is a nasty hack, but it prevents oversights from the Qt designers. + * Their view on how that check box should affect the frame content appears + * to be somewhat limiting. + **/ + void preventQGroupBoxAutoEnablement(); + + /** + * Reimplemented from QGroupBox to prevent QGroupBox from disabling + * children according to the check box status as the children are inserted. + **/ + virtual void childEvent( QChildEvent * ); + + + // + // Data members + // + + QCheckBox * _checkBox; +}; + + +#endif // YQCheckBoxFrame_h diff --git a/src/YQComboBox.cc b/src/YQComboBox.cc new file mode 100644 index 0000000..14f0b9a --- /dev/null +++ b/src/YQComboBox.cc @@ -0,0 +1,253 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQComboBox.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define SEND_SELECTION_CHANGED_EVENT 0 + +#include +#include +#include +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "QY2CharValidator.h" +#include "YQComboBox.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + + + +YQComboBox::YQComboBox( YWidget * parent, + const string & label, + bool editable ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YComboBox( parent, label, editable ) + , _validator(0) +{ + setWidgetRep( this ); + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_comboBox = new QComboBox( editable, this ); + YUI_CHECK_NEW( _caption ); + + _caption->setBuddy( _qt_comboBox ); + +#if SEND_SELECTION_CHANGED_EVENT + connect( _qt_comboBox, SIGNAL( highlighted (int) ), + this, SLOT ( slotSelected(int) ) ); +#endif + + connect( _qt_comboBox, SIGNAL( activated ( const QString & ) ), + this, SLOT ( textChanged( const QString & ) ) ); + + connect( _qt_comboBox, SIGNAL( textChanged( const QString & ) ), + this, SLOT ( textChanged( const QString & ) ) ); +} + + +YQComboBox::~YQComboBox() +{ + // NOP +} + + +string YQComboBox::text() +{ + return toUTF8( _qt_comboBox->currentText() ); +} + + +void YQComboBox::setText( const string & newValue ) +{ + QString text = fromUTF8( newValue ); + + if ( isValidText( text ) ) + { + YQSignalBlocker sigBlocker( _qt_comboBox ); + _qt_comboBox->setCurrentText( text ); + } + else + { + y2error( "%s \"%s\": Rejecting invalid value \"%s\"", + widgetClass(), debugLabel().c_str(), newValue.c_str() ); + } +} + + +void YQComboBox::addItem( YItem * item ) +{ + YComboBox::addItem( item ); + QPixmap icon; + + if ( item->hasIconName() ) + { + string iconName = iconFullPath( item ); + icon = QPixmap( iconName.c_str() ); + + if ( icon.isNull() ) + y2warning( "Can't load icon %s", iconName.c_str() ); + } + + if ( icon.isNull() ) + _qt_comboBox->insertItem( fromUTF8( item->label() ) ); + else + _qt_comboBox->insertItem( icon, fromUTF8( item->label() ) ); + + if ( item->selected() ) + { + YQSignalBlocker sigBlocker( _qt_comboBox ); + setText( item->label() ); + } +} + + +void YQComboBox::deleteAllItems() +{ + YQSignalBlocker sigBlocker( _qt_comboBox ); + + _qt_comboBox->clear(); + YComboBox::deleteAllItems(); +} + + +void YQComboBox::setLabel( const string & label ) +{ + _caption->setText( label ); + YComboBox::setLabel( label ); +} + + +void YQComboBox::setValidChars( const string & newValidChars ) +{ + if ( ! _qt_comboBox->editable() ) + { + y2warning( "Setting ValidChars is useless on a combo box that isn't editable! (%s)", + debugLabel().c_str() ); + return; + } + + if ( _validator ) + { + _validator->setValidChars( fromUTF8( newValidChars ) ); + } + else + { + _validator = new QY2CharValidator( fromUTF8( newValidChars ), this ); + _qt_comboBox->setValidator( _validator ); + + // No need to delete the validator in the destructor - Qt will take + // care of that since it's a QObject with a parent! + } + + if ( ! isValidText( _qt_comboBox->currentText() ) ) + { + y2error( "Old value \"%s\" of %s \"%s\" invalid according to ValidChars \"%s\" - deleting", + (const char *) _qt_comboBox->currentText(), + widgetClass(), debugLabel().c_str(), + newValidChars.c_str() ); + _qt_comboBox->setCurrentText( "" ); + } + + YComboBox::setValidChars( newValidChars ); +} + + +bool YQComboBox::isValidText( const QString & txt ) const +{ + if ( ! _validator ) + return true; + + int pos = 0; + QString text( txt ); // need a non-const QString & + + return _validator->validate( text, pos ) == QValidator::Acceptable; +} + + +void YQComboBox::slotSelected( int i ) +{ + if ( notify() ) + { + if ( ! YQUI::ui()->eventPendingFor( this ) ) + { + // Avoid overwriting a (more important) ValueChanged event with a SelectionChanged event + + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) ); + } + } +} + + +void YQComboBox::textChanged( const QString & new_text ) +{ + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +void YQComboBox::setInputMaxLength( int len ) +{ + _qt_comboBox->lineEdit()->setMaxLength( len ); + YComboBox::setInputMaxLength( len ); +} + + +int YQComboBox::preferredWidth() +{ + return sizeHint().width(); +} + + +int YQComboBox::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQComboBox::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void YQComboBox::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_comboBox->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +bool YQComboBox::setKeyboardFocus() +{ + _qt_comboBox->setFocus(); + + return true; +} + + +#include "YQComboBox.moc" diff --git a/src/YQComboBox.h b/src/YQComboBox.h new file mode 100644 index 0000000..3c50bfd --- /dev/null +++ b/src/YQComboBox.h @@ -0,0 +1,171 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQComboBox.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQComboBox_h +#define YQComboBox_h + +#include +#include "YComboBox.h" + +class YQWidgetCaption; +class QComboBox; +class QY2CharValidator; + + +class YQComboBox : public QVBox, public YComboBox +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQComboBox( YWidget * parent, const string & label, bool editable ); + + /** + * Destructor. + **/ + ~YQComboBox(); + + /** + * Add one item. This widget assumes ownership of the item object and will + * delete it in its destructor. + * + * Reimplemented from YComboBox. + **/ + virtual void addItem( YItem * item ); + + /** + * Delete all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deleteAllItems(); + + /** + * Change the label text. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void setLabel( const string & label ); + + /** + * Change the valid input characters. + * + * Reimplemented from YComboBox. + **/ + virtual void setValidChars( const string & validChars ); + + /** + * Specify the amount of characters which can be inserted. + * + * Reimplemented from YComboBox. + **/ + virtual void setInputMaxLength( int numberOfChars ); + + /** + * Returns 'true' if the given text is valid according to the current + * setting of ValidChars. + **/ + bool isValidText( const QString & txt ) const; + + /** + * Set enabled / disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +protected slots: + + /** + * Tells the ui that an item has been selected. This is only + * interesting if the `notify option is set. + **/ + void slotSelected( int i ); + + /** + * Tells the ui that the user has edited the text ( if the + * 'editable' option is set ). + * This is only interesting if the `notify option is set. + **/ + void textChanged( const QString &new_text ); + + +protected: + + /** + * Return this ComboBox's current value as text. + * + * Called internally from value(), selectedItem() and related. + * + * Implemented from YComboBox. + **/ + virtual string text(); + + /** + * + * Set this ComboBox's current value as text. + * + * Called internally whenever the content is to change + * programmatically. Don't call setValue() or selectItem() from here. + * + * Implemented from YComboBox. + **/ + virtual void setText( const string & newText ); + + + // + // Data members + // + + YQWidgetCaption * _caption; + QComboBox * _qt_comboBox; + QY2CharValidator * _validator; +}; + + +#endif // YQLabel_h diff --git a/src/YQDateField.cc b/src/YQDateField.cc new file mode 100644 index 0000000..e392dac --- /dev/null +++ b/src/YQDateField.cc @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDateField.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQDateField.h" +#include "YQWidgetCaption.h" + + +YQDateField::YQDateField( YWidget * parent, const string & label ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YDateField( parent, label ) +{ + setWidgetRep( this ); + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, fromUTF8( label ) ); + YUI_CHECK_NEW( _caption ); + + _qt_dateEdit = new QDateEdit( this ); + YUI_CHECK_NEW( _qt_dateEdit ); + + _qt_dateEdit->setAutoAdvance( true ); + _qt_dateEdit->setOrder( QDateEdit::DMY ); + _caption->setBuddy( _qt_dateEdit ); +} + + +YQDateField::~YQDateField() +{ + // NOP +} + + +string YQDateField::value() +{ + return toUTF8( _qt_dateEdit->date().toString( Qt::ISODate ) ); +} + + +void YQDateField::setValue( const string & newValue ) +{ + _qt_dateEdit->setDate( QDate::fromString( fromUTF8( newValue ), Qt::ISODate ) ); + +} + + +void YQDateField::setLabel( const string & newLabel ) +{ + _caption->setText( fromUTF8( newLabel ) ); + YDateField::setLabel( newLabel ); +} + + +void YQDateField::setEnabled( bool enabled ) +{ + QVBox::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQDateField::preferredWidth() +{ + return sizeHint().width(); +} + + +int YQDateField::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQDateField::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool YQDateField::setKeyboardFocus() +{ + _qt_dateEdit->setFocus(); + + return true; +} + + + +#include "YQDateField.moc" diff --git a/src/YQDateField.h b/src/YQDateField.h new file mode 100644 index 0000000..ebaabf5 --- /dev/null +++ b/src/YQDateField.h @@ -0,0 +1,113 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDateField.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQDateField_h +#define YQDateField_h + +#include +#include "YDateField.h" + +class QDateEdit; +class YQWidgetCaption; + + +class YQDateField : public QVBox, public YDateField +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQDateField( YWidget * parent, + const string & label ); + + /** + * Destructor. + **/ + virtual ~YQDateField(); + + /** + * Get the current value (the text entered by the user or set from the + * outside) of this input field. + * + * Implemented from YSimpleInputField. + **/ + virtual string value(); + + /** + * Set the current value (the text entered by the user or set from the + * outside) of this input field. + * + * Implemented from YSimpleInputField. + **/ + virtual void setValue( const string & newValue ); + + /** + * Set the label (the caption above the input field). + * + * Reimplemented from YSimpleInputField. + **/ + virtual void setLabel( const string & label ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +protected: + + YQWidgetCaption * _caption; + QDateEdit * _qt_dateEdit; +}; + + +#endif // YQDateField_h diff --git a/src/YQDialog.cc b/src/YQDialog.cc new file mode 100644 index 0000000..6e51bca --- /dev/null +++ b/src/YQDialog.cc @@ -0,0 +1,690 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-ui" +#include +#include +#include +#include + +#include "YQUI.h" +#include "YQi18n.h" +#include "YEvent.h" +#include "YQDialog.h" +#include "YQGenericButton.h" +#include "YQWizardButton.h" +#include "YQWizard.h" + +// Include low-level X headers AFTER Qt headers: +// X.h pollutes the global namespace (!!!) with pretty useless #defines +// like "Above", "Below" etc. that clash with some Qt headers. +#include + + +YQDialog::YQDialog( const YWidgetOpt & opt, + QWidget * qt_parent, + bool default_size ) + : QWidget( qt_parent, + 0, // name + default_size ? 0 : WStyle_Customize | WStyle_DialogBorder | WType_Modal | WStyle_Dialog ) // WFlags + , YDialog( opt ) +{ + _userResized = false; + _focusButton = 0; + _defaultButton = 0; + + + setWidgetRep( this ); + setCaption( hasDefaultSize() ? "YaST2" : "" ); + setFocusPolicy( QWidget::StrongFocus ); + + if ( hasWarnColor() || hasInfoColor() ) + { + QColor normalBackground ( 0, 128, 0 ); + QColor inputFieldBackground ( 0, 96, 0 ); + QColor text = white; + + if ( hasInfoColor() ) + { + normalBackground = QColor ( 238, 232, 170 ); // PaleGoldenrod + } + + QPalette warnPalette( normalBackground ); + QColorGroup normalColors = warnPalette.normal(); + normalColors.setColor( QColorGroup::Text, text ); + normalColors.setColor( QColorGroup::Base, inputFieldBackground ); + warnPalette.setNormal( normalColors ); + setPalette( warnPalette ); + } + + _qFrame = new QFrame ( this ); + bool decorate = ! hasDefaultSize() && ! YQUI::ui()->haveWM(); + +#if 0 + if ( hasSmallDecorations() ) + { + // None of this works (yet). :-(( + + clearWFlags( getWFlags() ); + setWFlags( WStyle_Customize | WStyle_DialogBorder | WStyle_StaysOnTop ); + // decorate = true; + } +#endif + + if ( decorate ) + { + _qFrame->setFrameStyle ( QFrame::Box | QFrame::Raised ); + _qFrame->setLineWidth(2); + _qFrame->setMidLineWidth(3); + } + else + { + _qFrame->setFrameStyle ( QFrame::NoFrame ); + } +} + + +YQDialog::~YQDialog() +{ +} + + +int YQDialog::preferredWidth() +{ + int preferredWidth; + + if ( hasDefaultSize() ) + { + if ( userResized() ) + preferredWidth = _userSize.width(); + else + preferredWidth = YQUI::ui()->defaultSize( YD_HORIZ ); + } + else + { + preferredWidth = YDialog::preferredWidth() + 2 * decorationWidth(); + } + + int screenWidth = qApp->desktop()->width(); + + if ( preferredWidth > screenWidth ) + { + y2warning( "Limiting dialog width to screen width (%d) instead of %d - check the layout!", + screenWidth, preferredWidth ); + } + + return preferredWidth; +} + + +int YQDialog::preferredHeight() +{ + int preferredHeight; + + if ( hasDefaultSize() ) + { + if ( userResized() ) + preferredHeight = _userSize.height(); + else + preferredHeight = YQUI::ui()->defaultSize( YD_VERT ); + } + else + { + preferredHeight = YDialog::preferredHeight() + 2 * decorationWidth(); + } + + int screenHeight = qApp->desktop()->height(); + + if ( preferredHeight > screenHeight ) + { + y2warning( "Limiting dialog height to screen height (%d) instead of %d - check the layout!", + screenHeight, preferredHeight ); + } + + return preferredHeight; +} + + +int YQDialog::decorationWidth() +{ + if ( ! hasDefaultSize() && _qFrame ) + return _qFrame->frameWidth(); + else + return 0; +} + + +void YQDialog::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void YQDialog::setSize( int newWidth, int newHeight ) +{ + if ( newWidth > qApp->desktop()->width() ) + newWidth = qApp->desktop()->width(); + + if ( newHeight > qApp->desktop()->height() ) + newHeight = qApp->desktop()->height(); + + if ( hasChildren() ) + { + firstChild()->setSize( newWidth - 2 * decorationWidth(), + newHeight - 2 * decorationWidth() ); + + QWidget * qChild = (QWidget *) firstChild()->widgetRep(); + qChild->move( decorationWidth(), decorationWidth() ); + } + + if ( _qFrame ) + _qFrame->resize( newWidth, newHeight ); + + resize( newWidth, newHeight ); +} + + + +void YQDialog::activate( bool active ) +{ + if ( active ) + { + if ( ! YQUI::ui()->haveWM() ) + { + if ( YQUI::ui()->autoActivateDialogs() ) + setActiveWindow(); + else + y2milestone( "Auto-activating dialog window turned off" ); + } + + ensureOnlyOneDefaultButton(); + } +} + + +void +YQDialog::resizeEvent( QResizeEvent * event ) +{ + if ( event ) + { + setSize ( event->size().width(), event->size().height() ); + _userSize = event->size(); + _userResized = true; + } +} + + +YQGenericButton * +YQDialog::findDefaultButton() +{ + if ( _defaultButton ) + return _defaultButton; + + _defaultButton = findDefaultButton( childrenBegin(), childrenEnd() ); + + return _defaultButton; +} + + +YQGenericButton * +YQDialog::findDefaultButton( YWidgetListConstIterator begin, + YWidgetListConstIterator end ) const + +{ + for ( YWidgetListConstIterator it = begin; it != end; ++it ) + { + YWidget * widget = *it; + + // + // Check this widget + // + + YQGenericButton * button = dynamic_cast (widget); + + if ( button && button->isDefaultButton() ) + { + return button; + } + + + // + // Recurse over the children of this widget + // + + if ( widget->hasChildren() ) + { + button = findDefaultButton( widget->childrenBegin(), + widget->childrenEnd() ); + if ( button ) + return button; + } + } + + return 0; +} + + +YQWizard * +YQDialog::ensureOnlyOneDefaultButton( YWidgetListConstIterator begin, + YWidgetListConstIterator end ) +{ + YQGenericButton * def = _focusButton ? _focusButton : _defaultButton; + YQWizard * wizard = 0; + + for ( YWidgetListConstIterator it = begin; it != end; ++it ) + { + YQGenericButton * button = dynamic_cast (*it); + YQWizardButton * wizardButton = dynamic_cast (*it); + + if ( ! wizard ) + wizard = dynamic_cast (*it); + + if ( wizardButton ) + { + wizardButton->showAsDefault( false ); + } + else if ( button ) + { + if ( button->isDefaultButton() ) + { + if ( _defaultButton && button != _defaultButton ) + { + y2error( "Too many default buttons: [%s]", + (const char *) button->text() ); + y2error( "Using old default button: [%s]", + (const char *) _defaultButton->text() ); + } + else + { + _defaultButton = button; + } + } + + if ( button->isShownAsDefault() && button != def ) + button->showAsDefault( false ); + } + + if ( (*it)->hasChildren() ) + { + YQWizard * wiz = ensureOnlyOneDefaultButton( (*it)->childrenBegin(), + (*it)->childrenEnd() ); + if ( wiz ) + wizard = wiz; + } + } + + return wizard; +} + + +void +YQDialog::ensureOnlyOneDefaultButton() +{ + _defaultButton = 0; + YQWizard * wizard = ensureOnlyOneDefaultButton( childrenBegin(), childrenEnd() ); + + if ( ! _defaultButton && wizard ) + { + _defaultButton = wizardDefaultButton( wizard ); + } + + YQGenericButton * def = _focusButton ? _focusButton : _defaultButton; + + if ( def ) + def->showAsDefault(); +} + + +YQWizard * +YQDialog::findWizard() const +{ + return findWizard( childrenBegin(), childrenEnd() ); +} + + +YQWizard * +YQDialog::findWizard( YWidgetListConstIterator begin, + YWidgetListConstIterator end ) const + +{ + for ( YWidgetListConstIterator it = begin; it != end; ++it ) + { + YWidget * widget = *it; + YQWizard * wizard = dynamic_cast (widget); + + if ( wizard ) + return wizard; + + if ( widget->hasChildren() ) + { + wizard = findWizard( widget->childrenBegin(), + widget->childrenEnd() ); + if ( wizard ) + return wizard; + } + } + + return 0; +} + + +YQGenericButton * +YQDialog::wizardDefaultButton( YQWizard * wizard ) const +{ + YQGenericButton * def = 0; + + if ( ! wizard ) + wizard = findWizard(); + + if ( wizard ) + { + // Pick one of the wizard buttons + + if ( wizard->direction() == YQWizard::Backward ) + { + if ( wizard->backButton() + && wizard->backButton()->isShown() + && wizard->backButton()->isEnabled() ) + { + def = wizard->backButton(); + } + } + + if ( ! def ) + { + if ( wizard->nextButton() + && wizard->nextButton()->isShown() + && wizard->nextButton()->isEnabled() ) + { + def = wizard->nextButton(); + } + } + } + + return def; +} + + +void +YQDialog::setDefaultButton( YQGenericButton * newDefaultButton ) +{ + if ( _defaultButton && + newDefaultButton && + newDefaultButton != _defaultButton ) + { + if ( dynamic_cast( _defaultButton ) ) + { + // Let app defined default buttons override wizard buttons + _defaultButton->setDefaultButton( false ); + } + else + { + y2error( "Too many `opt(`default) PushButtons: [%s]", + (const char *) newDefaultButton->text() ); + newDefaultButton->setDefaultButton( false ); + return; + } + } + + _defaultButton = newDefaultButton; + + if ( _defaultButton ) + { + _defaultButton->setDefaultButton( true ); + y2debug( "New default button: [%s]", (const char *) _defaultButton->text() ); + + if ( _defaultButton && ! _focusButton ) + _defaultButton->showAsDefault( true ); + } +} + + +bool +YQDialog::activateDefaultButton( bool warn ) +{ + // Try the focus button first, if there is any. + + if ( _focusButton && + _focusButton->isEnabled() && + _focusButton->isShownAsDefault() ) + { + y2debug( "Activating focus button: [%s]", (const char *) _focusButton->text() ); + _focusButton->activate(); + return true; + } + + + // No focus button - try the default button, if there is any. + + _defaultButton = findDefaultButton(); + + if ( _defaultButton && + _defaultButton->isEnabled() && + _defaultButton->isShownAsDefault() ) + { + y2debug( "Activating default button: [%s]", (const char *) _defaultButton->text() ); + _defaultButton->activate(); + return true; + } + else + { + if ( warn ) + { + y2warning( "No default button in this dialog - ignoring [Return]" ); + } + } + + return false; +} + + +void +YQDialog::losingFocus( YQGenericButton * button ) +{ + if ( button == _focusButton ) + { + if ( _focusButton && _focusButton != _defaultButton ) + _focusButton->showAsDefault( false ); + + _focusButton = 0; + } + + if ( ! _focusButton && _defaultButton ) + _defaultButton->showAsDefault( true ); +} + + +void +YQDialog::gettingFocus( YQGenericButton * button ) +{ + if ( _focusButton && _focusButton != button ) + _focusButton->showAsDefault( false ); + + if ( _defaultButton && _defaultButton != button ) + _defaultButton->showAsDefault( false ); + + _focusButton = button; + + if ( _focusButton ) + _focusButton->showAsDefault( true ); +} + + +void +YQDialog::keyPressEvent( QKeyEvent * event ) +{ + if ( event ) + { + if ( event->key() == Qt::Key_Print ) + { + YQUI::ui()->makeScreenShot( "" ); + return; + } + else if ( event->key() == Qt::Key_F5 ) // No matter if Ctrl/Alt/Shift pressed + { + YQUI::ui()->easterEgg(); + return; + } + else if ( event->key() == Qt::Key_F4 && // Shift-F4: toggle colors for vision impaired users + event->state() == Qt::ShiftButton ) + { + YQUI::ui()->toggleVisionImpairedPalette(); + + if ( YQUI::ui()->usingVisionImpairedPalette() ) + { + y2milestone( "Switched to vision impaired palette" ); + QMessageBox::information( 0, // parent + _("Color switching"), // caption + _( "Switching to color palette for vision impaired users -\n" + "press Shift-F4 again to switch back to normal colors." ), // text + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + return; + } + else if ( event->key() == Qt::Key_F7 && // Shift-F7: toggle y2debug logging + event->state() == Qt::ShiftButton ) + { + YQUI::ui()->askConfigureLogging(); + return; + } + else if ( event->key() == Qt::Key_F8 && // Shift-F8: save y2logs + event->state() == Qt::ShiftButton ) + { + YQUI::ui()->askSaveLogs(); + return; + } + else if ( event->state() == 0 ) // No Ctrl / Alt / Shift etc. pressed + { + if ( event->key() == Qt::Key_Return || + event->key() == Qt::Key_Enter ) + { + ( void ) activateDefaultButton(); + return; + } + } + else if ( event->state() == ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton ) ) + { + // Qt-UI special keys - all with Ctrl-Shift-Alt + + y2milestone( "Caught YaST2 magic key combination" ); + + if ( event->key() == Qt::Key_M ) + { + YQUI::ui()->toggleRecordMacro(); + return; + } + else if ( event->key() == Qt::Key_P ) + { + YQUI::ui()->askPlayMacro(); + return; + } + else if ( event->key() == Qt::Key_D ) + { + YQUI::ui()->sendEvent( new YDebugEvent() ); + return; + } + else if ( event->key() == Qt::Key_X ) + { + y2milestone( "Starting xterm" ); + system( "/usr/bin/xterm &" ); + return; + } + } + } + + QWidget::keyPressEvent( event ); +} + + +void YQDialog::closeEvent( QCloseEvent * event ) +{ + // The window manager "close window" button ( and menu, e.g. Alt-F4 ) will be + // handled just like the user had clicked on the `id`( `cancel ) button in + // that dialog. It's up to the YCP application to handle this ( if desired ). + + y2debug( "Ignoring window manager close button." ); + event->ignore(); + YQUI::ui()->sendEvent( new YCancelEvent() ); +} + + +void YQDialog::focusInEvent( QFocusEvent * event ) +{ + + // The dialog itself doesn't need or want the keyboard focus, but obviously + // ( since Qt 2.3? ) it needs QFocusPolicy::StrongFocus for the default + // button mechanism to work. So let's accept the focus and give it to some + // child widget. + + if ( event->reason() == QFocusEvent::Tab ) + { + focusNextPrevChild( true ); + } + else + { + if ( _defaultButton ) + _defaultButton->setKeyboardFocus(); + else + focusNextPrevChild( true ); + } +} + + +void +YQDialog::show() +{ + if ( ! hasDefaultSize() && qApp->mainWidget()->isVisible() ) + center( this, qApp->mainWidget() ); + else if ( isCentered() ) + center( this, qApp->desktop() ); + + QWidget::show(); +} + + +void +YQDialog::center( QWidget * dialog, QWidget * parent ) +{ + if ( ! dialog ) + return; + + if ( ! parent ) + { + if ( dialog == qApp->mainWidget() ) + parent = qApp->desktop(); + else + parent = qApp->mainWidget(); + } + + QPoint pos( ( parent->width() - dialog->width() ) / 2, + ( parent->height() - dialog->height() ) / 2 ); + + pos += parent->mapToGlobal( QPoint( 0, 0 ) ); + pos = dialog->mapToParent( dialog->mapFromGlobal( pos ) ); + dialog->move( pos ); +} + + + +#include "YQDialog.moc" diff --git a/src/YQDialog.h b/src/YQDialog.h new file mode 100644 index 0000000..bd0aecb --- /dev/null +++ b/src/YQDialog.h @@ -0,0 +1,242 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQDialog_h +#define YQDialog_h + +#include +#include "YDialog.h" + + +class YQGenericButton; +class YQWizard; +class QFrame; + + +class YQDialog : public QWidget, public YDialog +{ + Q_OBJECT + +public: + /** + * Constructor: Constructor. + **/ + YQDialog( const YWidgetOpt & opt, + QWidget * qt_parent = 0, + bool default_size = false ); + + /** + * Destructor: Cleans up. + **/ + ~YQDialog(); + + /** + * Makes this dialog active or inactive + **/ + void activate( bool active ); + + /** + * Interited from QDialog: The window was closed via the window + * manager close button. + **/ + void closeEvent( QCloseEvent * ev ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Returns the size of (artificial) window manager decorations, depending + * on the value of YDialog::isDecorated(). + **/ + int decorationWidth(); + + /** + * Return this dialog's (first) default button or 0 if none + **/ + YQGenericButton * findDefaultButton(); + + /** + * Returns whether or not the user has resized this dialog. + **/ + bool userResized() { return _userResized; } + + /** + * Returns the button that has the keyboard focus or 0 if no button has + * the keyboard focus. + **/ + YQGenericButton * focusButton() const { return _focusButton; } + + /** + * Returns the dialog's default button - the button that is activated with + * [Return] if no button has the keyboard focus. + **/ + YQGenericButton * defaultButton() const { return _defaultButton; } + + /** + * Notification that a button loses the keyboard focus. + * + * All pushbuttons are required to call this whenever they lose focus so + * the dialog can keep track of its focusButton. + **/ + void losingFocus( YQGenericButton * button ); + + /** + * Notification that a button gets the keyboard focus. + * + * All pushbuttons are required to call this whenever they gain focus so + * the dialog can keep track of its focusButton. + **/ + void gettingFocus( YQGenericButton * button ); + + /** + * Set the dialog's default button - the button that is activated with + * [Return] if no other button has the keyboard focus. + * 'newDefaultButton' may be 0 if the former default button is destroyed. + **/ + void setDefaultButton( YQGenericButton * newDefaultButton ); + + /** + * Ensure presence of no more than one single default button. + **/ + void ensureOnlyOneDefaultButton(); + + /** + * Activate ( i.e. click ) this dialog's default button, if there is any. + * Issue a warning to the log file if 'warn' is true. + **/ + bool activateDefaultButton( bool warn = true ); + + /** + * Find the first wizard in that dialog, if there is any. + * Returns 0 if there is none. + **/ + YQWizard * findWizard() const; + + /** + * Find a wizard button that would make sense as a default button. + * Return 0 if none can be found. + **/ + YQGenericButton * wizardDefaultButton( YQWizard * wizard ) const; + + /** + * Center a dialog relative to 'parent'. + * + * If 'parent' is 0, the dialog is centered relative to the application's + * main widget. If 'dialog' is the main widget and 'parent' is 0, the + * dialog is centered relative to the desktop. + **/ + static void center( QWidget * dialog, QWidget * parent = 0 ); + + +protected: + + /** + * Return the (first) default button between 'begin' and 'end' + * or 0 if there is none. + **/ + YQGenericButton * findDefaultButton( YWidgetListConstIterator begin, + YWidgetListConstIterator end ) const; + + /** + * Return the (first) wizard widget between 'begin' and 'end' + * or 0 if there is none. + **/ + YQWizard * findWizard( YWidgetListConstIterator begin, + YWidgetListConstIterator end ) const; + + /** + * Helper function for ensureOnlyOneDefaultButton(): + * Recursively find all normal and wizard buttons between 'begin' and 'end' + * and make sure that no more than one button is marked as default. + * Return (the first) wizard widget found on the way. + **/ + YQWizard * ensureOnlyOneDefaultButton( YWidgetListConstIterator begin, + YWidgetListConstIterator end ); + + /** + * Event handler for keyboard input. + * Only very special keys are processed here. + * + * Inherited from QWidget. + **/ + void keyPressEvent( QKeyEvent * e ); + + + /** + * Event handler for focusIn event. + * + * Inherited from QWidget. + **/ + void focusInEvent( QFocusEvent * event ); + + /** + * Event handler for window resize. + * + * Inherited from QWidget. + **/ + void resizeEvent ( QResizeEvent * ev ); + + + /** + * Inherited from QWidget: Called when the dialog is shown. + **/ + void show(); + + + // + // Data members + // + + QFrame * _qFrame; + + bool _userResized; + QSize _userSize; + + YQGenericButton * _focusButton; + YQGenericButton * _defaultButton; +}; + + +#endif // YQDialog_h + diff --git a/src/YQDownloadProgress.cc b/src/YQDownloadProgress.cc new file mode 100644 index 0000000..76105b8 --- /dev/null +++ b/src/YQDownloadProgress.cc @@ -0,0 +1,129 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLogView.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQDownloadProgress.h" +#include "YQWidgetCaption.h" + + +YQDownloadProgress::YQDownloadProgress( YWidget * parent, + const string & label, + const string & filename, + YFileSize_t expectedSize ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YDownloadProgress( parent, label, filename, expectedSize ) +{ + setWidgetRep( this ); + setMargin( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_progressBar = new QProgressBar( this ); + YUI_CHECK_NEW( _qt_progressBar ); + + _qt_progressBar->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + _qt_progressBar->setTotalSteps( 100 ); // Using percent + _qt_progressBar->setProgress( currentPercent() ); + + _timer = new QTimer( this ); + + connect( _timer, SIGNAL( timeout() ), + this, SLOT ( pollFileSize() ) ); + + _timer->start( 250, // millisec + false ); // single shot? +} + + +YQDownloadProgress::~YQDownloadProgress() +{ + // NOP +} + + +void +YQDownloadProgress::setLabel( const string & label ) +{ + _caption->setText( label ); + YDownloadProgress::setLabel( label ); +} + + +void +YQDownloadProgress::setFilename( const string & filename ) +{ + YDownloadProgress::setFilename( filename ); + _qt_progressBar->setProgress( currentPercent() ); +} + + +void +YQDownloadProgress::setExpectedSize( YFileSize_t expectedSize ) +{ + _qt_progressBar->setProgress( currentPercent() ); + YDownloadProgress::setExpectedSize( expectedSize ); +} + + +void +YQDownloadProgress::pollFileSize() +{ + _qt_progressBar->setProgress( currentPercent() ); +} + + +void +YQDownloadProgress::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_progressBar->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int +YQDownloadProgress::preferredWidth() +{ + return sizeHint().width(); +} + + +int +YQDownloadProgress::preferredHeight() +{ + return sizeHint().height(); +} + + +void +YQDownloadProgress::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +#include "YQDownloadProgress.moc" diff --git a/src/YQDownloadProgress.h b/src/YQDownloadProgress.h new file mode 100644 index 0000000..66d72cb --- /dev/null +++ b/src/YQDownloadProgress.h @@ -0,0 +1,114 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDownloadProgress.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQDownloadProgress_h +#define YQDownloadProgress_h + +#include +#include "YDownloadProgress.h" + +class YQWidgetCaption; +class QProgressBar; + + +class YQDownloadProgress : public QVBox, public YDownloadProgress +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQDownloadProgress( YWidget * parent, + const string & label, + const string & filename, + YFileSize_t expectedSize ); + + /** + * Destructor. + **/ + virtual ~YQDownloadProgress(); + + /** + * Set the label (the text above the progress bar). + * + * Reimplemented from YDownloadProgress. + **/ + virtual void setLabel( const string & label ); + + /** + * Set the name of a new file to monitor. + * + * Reimplemented from YDownloadProgress. + **/ + virtual void setFilename( const string & filename ); + + /** + * Change the expected file size. + * + * Reimplemented from YDownloadProgress. + **/ + virtual void setExpectedSize( YFileSize_t expectedSize ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + +public slots: + /** + * Slot for polling and displaying the file size. + **/ + void pollFileSize( void ); + + +protected: + + YQWidgetCaption * _caption; + QProgressBar * _qt_progressBar; + QTimer * _timer; +}; + + +#endif // YQDownloadProgress_h diff --git a/src/YQDumbTab.cc b/src/YQDumbTab.cc new file mode 100644 index 0000000..5005e98 --- /dev/null +++ b/src/YQDumbTab.cc @@ -0,0 +1,248 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDumbTab.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include +#include +#include +#include +#include +#include + +#include "YQSignalBlocker.h" +#include "QY2LayoutUtils.h" +#include "utf8.h" +#include "YQUI.h" +#include "YQDumbTab.h" +#include "YQAlignment.h" +#include "YEvent.h" + +#define YQDumbTabSpacing 2 +#define YQDumbTabFrameMargin 4 + + +YQDumbTab::YQDumbTab( YWidget * parent ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YDumbTab( parent ) +{ + setWidgetRep( this ); + addVSpacing( this, YQDumbTabSpacing ); + + // + // Tab bar + // + + _tabBar = new QTabBar( this ); + CHECK_PTR( _tabBar ); + + _tabBar->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) ); // hor/vert + setFocusProxy( _tabBar ); + setFocusPolicy( TabFocus ); + + connect( _tabBar, SIGNAL( selected ( int ) ), + this, SLOT ( slotSelected( int ) ) ); +} + + +YQDumbTab::~YQDumbTab() +{ + // NOP +} + + +void +YQDumbTab::addItem( YItem * item ) +{ + YQSignalBlocker sigBlocker( _tabBar ); + YDumbTab::addItem( item ); + + QTab * tab = new QTab( fromUTF8( item->label() ) ); + YUI_CHECK_NEW( tab ); + y2debug( "Adding tab page [%s]", item->label().c_str() ); + + tab->setIdentifier( item->index() ); + _tabBar->addTab( tab ); + item->setData( tab ); + + if ( item->selected() ) + _tabBar->setCurrentTab( tab ); +} + + +void +YQDumbTab::selectItem( YItem * item, bool selected ) +{ + if ( selected ) + { + // Don't try to suppress any signals sent here with a YQSignalBlocker, + // otherwise the application code that handles the event will never be executed. + + QTab * tab = (QTab *) item->data(); + + if ( tab ) + _tabBar->setCurrentTab( tab ); + } + + YDumbTab::selectItem( item, selected ); +} + + +void +YQDumbTab::deleteAllItems() +{ + for ( YItemConstIterator it = itemsBegin(); + it != itemsEnd(); + ++it ) + { + QTab * tab = (QTab *) (*it)->data(); + + if ( tab ) + _tabBar->removeTab( tab ); + } + + YDumbTab::deleteAllItems(); +} + + +void +YQDumbTab::deselectAllItems() +{ + YDumbTab::deselectAllItems(); +} + + +void +YQDumbTab::slotSelected( int index ) +{ + YItem * item = itemAt( index ); + YUI_CHECK_PTR( item ); + y2debug( "Tab [%s] selected", item->label().c_str() ); + + + YQUI::ui()->sendEvent( new YMenuEvent( item ) ); +} + + +void +YQDumbTab::setEnabled( bool enabled ) +{ + _tabBar->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int +YQDumbTab::preferredWidth() +{ + int tabBarWidth = _tabBar->sizeHint().width(); + int childWidth = hasChildren() ? firstChild()->preferredWidth() : 0; + + return max( tabBarWidth, childWidth ); +} + + +int +YQDumbTab::preferredHeight() +{ + int tabBarHeight = _tabBar->sizeHint().height(); + int childHeight = hasChildren() ? firstChild()->preferredHeight() : 0; + + return tabBarHeight + YQDumbTabSpacing + childHeight; +} + + +void +YQDumbTab::paintEvent( QPaintEvent * event ) +{ + QPainter painter( this ); + + int x_offset = 0; + int y_offset = _tabBar->height() + YQDumbTabSpacing; + int frameHeight = height() - y_offset; + int frameWidth = width(); + + qDrawWinPanel( &painter, + x_offset, y_offset, + frameWidth, frameHeight, + colorGroup(), + false, // sunken + (const QBrush *) 0 ); // brush - don't fill interior +} + + +void +YQDumbTab::setSize( int newWidth, int newHeight ) +{ + QWidget::resize( newWidth, newHeight ); + int remainingHeight = newHeight; + int remainingWidth = newWidth; + int x_offset = 0; + int y_offset = 0; + + // + // _tabBar (fixed height) + // + + int tabBarHeight = _tabBar->sizeHint().height(); + + if ( remainingHeight < tabBarHeight ) + tabBarHeight = remainingHeight; + + _tabBar->resize( newWidth, tabBarHeight ); + remainingHeight -= tabBarHeight; + + if ( hasChildren() ) + { + // + // Spacing between tabBar and client area + // + + remainingHeight -= YQDumbTabSpacing; + y_offset = newHeight - remainingHeight; + + // + // 3D border + // + + remainingHeight -= 2 * YQDumbTabFrameMargin; + remainingWidth -= 2 * YQDumbTabFrameMargin; + x_offset += YQDumbTabFrameMargin; + y_offset += YQDumbTabFrameMargin; + + if ( remainingHeight < 0 ) + remainingHeight = 0; + + if ( remainingWidth < 0 ) + remainingWidth = 0; + + // + // Client area + // + + + firstChild()->setSize( remainingWidth, remainingHeight ); + + QWidget * qChild = (QWidget *) firstChild()->widgetRep(); + qChild->move( x_offset, y_offset ); + } +} + + + +#include "YQDumbTab.moc" diff --git a/src/YQDumbTab.h b/src/YQDumbTab.h new file mode 100644 index 0000000..2ba1e25 --- /dev/null +++ b/src/YQDumbTab.h @@ -0,0 +1,123 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQDumbTab.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQDumbTab_h +#define YQDumbTab_h + +#include +#include "YDumbTab.h" + +class QTabBar; +class QPaintEvent; + + +class YQDumbTab : public QWidget, public YDumbTab +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQDumbTab( YWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQDumbTab(); + + /** + * Add an item (a tab page). + * + * Reimplemented from YDumbTab. + **/ + virtual void addItem( YItem * item ); + + /** + * Select or deselect an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void selectItem( YItem * item, bool selected = true ); + + /** + * Deselect all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deselectAllItems(); + + /** + * Delete all items (all tab pages). + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deleteAllItems(); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + +protected: + + /** + * Draw widget content. + * + * Reimplemented from QWidget. + **/ + virtual void paintEvent( QPaintEvent * ); + +public slots: + + /** + * Send an event that the tab with the specified index is selected. + **/ + void slotSelected( int index ); + +protected: + + QTabBar * _tabBar; +}; + +#endif // YQDumbTab_h diff --git a/src/YQEBunny.cc b/src/YQEBunny.cc new file mode 100644 index 0000000..d3e30a9 --- /dev/null +++ b/src/YQEBunny.cc @@ -0,0 +1,71 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQEBunny.cc + + Authors: Stefan Hundhammer + Juergen Weigert + + Rectangles! Rounded rectangles everywhere, ... + A horror vision of the new CI. + +/-*/ + + +#define y2log_component "qt-easter-bunny" +#include +#include +#include +#include + +#include +#include + +#include "YQEBunny.h" + + +void +YQEasterBunny::layEgg() +{ +#if 0 + const char * display = getenv( "DISPLAY" ); + + if ( ! display ) + { + y2warning( "$DISPLAY not set - no easter egg" ); + return; + } + + if ( strcmp( display, ":0" ) != 0 && + strcmp( display, ":0.0" ) != 0 ) + { + y2warning( "Not on system console - no easter egg" ); + return; + } + + QDesktopWidget * screen = QApplication::desktop(); + int width = screen->width(); + int height = screen->height(); + YFrameBuffer fb( width, height, screen->x11AppDepth() ); + + draw(&fb, width, height); +#else + y2warning( "Easter egg disabled" ); +#endif +} + + +void +YQEasterBunny::draw(YFrameBuffer *fb, int sw, int sh) +{ + // NOP +} diff --git a/src/YQEBunny.h b/src/YQEBunny.h new file mode 100644 index 0000000..fe23c9e --- /dev/null +++ b/src/YQEBunny.h @@ -0,0 +1,37 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQEBunny.h + + Author: Stefan Hundhammer + +/-*/ + + +#include "YFrameBuffer.h" + +#ifndef YQEasterBunny_h +#define YQEasterBunny_h + +class YQEasterBunny +{ +public: + + static void layEgg(); + +protected: + + static void draw(YFrameBuffer *fb, int sw, int sh); +}; + + +#endif // ifndef YQEasterBunny_h diff --git a/src/YQEmpty.cc b/src/YQEmpty.cc new file mode 100644 index 0000000..188d59b --- /dev/null +++ b/src/YQEmpty.cc @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQEmpty.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include "YQEmpty.h" + + +YQEmpty::YQEmpty( YWidget * parent ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YEmpty( parent ) +{ + setWidgetRep( this ); +} + + +YQEmpty::~YQEmpty() +{ + // NOP +} + + +void YQEmpty::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +#include "YQEmpty.moc" diff --git a/src/YQEmpty.h b/src/YQEmpty.h new file mode 100644 index 0000000..e270fd4 --- /dev/null +++ b/src/YQEmpty.h @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQEmpty.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQEmpty_h +#define YQEmpty_h + +#include +#include "YEmpty.h" + + +class YQEmpty : public QWidget, public YEmpty +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQEmpty( YWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQEmpty(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); +}; + + +#endif // YQEmpty_h diff --git a/src/YQFrame.cc b/src/YQFrame.cc new file mode 100644 index 0000000..70ecbe8 --- /dev/null +++ b/src/YQFrame.cc @@ -0,0 +1,101 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQFrame.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include +#include "YQUI.h" +#include "utf8.h" + +using std::max; + +#include "YQFrame.h" + + +YQFrame::YQFrame( YWidget * parent, + const string & initialLabel ) + : QGroupBox( (QWidget *) parent->widgetRep() ) + , YFrame( parent, initialLabel ) +{ + setWidgetRep ( this ); + QGroupBox::setTitle( fromUTF8( label() ) ); +} + + +YQFrame::~YQFrame() +{ + // NOP +} + + +void YQFrame::setEnabled( bool enabled ) +{ + QGroupBox::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void +YQFrame::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + + if ( hasChildren() ) + { + int newChildWidth = max ( 0, newWidth - 2 * frameWidth() - 1 ); + int newChildHeight = max ( 0, newHeight - frameWidth() - fontMetrics().height() - 1 ); + + firstChild()->setSize( newChildWidth, newChildHeight ); + + QWidget * qChild = (QWidget *) firstChild()->widgetRep(); + qChild->move( frameWidth(), fontMetrics().height() ); + } +} + + +void +YQFrame::setLabel( const string & newLabel ) +{ + YFrame::setLabel( newLabel ); + QGroupBox::setTitle( fromUTF8( label() ) ); +} + + +int YQFrame::preferredWidth() +{ + int preferredWidth; + int childPreferredWidth = hasChildren() ? firstChild()->preferredWidth() : 0; + + preferredWidth = max( childPreferredWidth, + (10 + fontMetrics().width( title() ) ) ); + preferredWidth += 2*frameWidth() + 1; + + return preferredWidth; +} + + +int YQFrame::preferredHeight() +{ + int preferredHeight = hasChildren() ? firstChild()->preferredHeight() : 0; + preferredHeight += frameWidth() + fontMetrics().height() + 1; + + return preferredHeight; +} + + +#include "YQFrame.moc" diff --git a/src/YQFrame.h b/src/YQFrame.h new file mode 100644 index 0000000..6d56d71 --- /dev/null +++ b/src/YQFrame.h @@ -0,0 +1,81 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQFrame.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQFrame_h +#define YQFrame_h + +#include + +#include "YFrame.h" + +class QWidget; + +class YQFrame : public QGroupBox, public YFrame +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQFrame( YWidget * parent, + const string & label ); + + /** + * Destructor. + **/ + virtual ~YQFrame(); + + /** + * Change the frame label. + **/ + virtual void setLabel( const string & newLabel ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); +}; + + +#endif // YQFrame_h diff --git a/src/YQGenericButton.cc b/src/YQGenericButton.cc new file mode 100644 index 0000000..85df8f3 --- /dev/null +++ b/src/YQGenericButton.cc @@ -0,0 +1,239 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQGenericButton.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQGenericButton.h" +#include "YQDialog.h" + + +YQGenericButton::YQGenericButton( YWidget * parent, + const string & label ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YPushButton( parent, label ) + , _dialog( 0 ) + , _qPushButton( 0 ) + , _setDefaultButtonRecursive( false ) +{ + setWidgetRep( 0 ); +} + + +void YQGenericButton::setQPushButton( QPushButton * pb ) +{ + _qPushButton = pb; + _qPushButton->setAutoDefault( true ); + _qPushButton->installEventFilter( this ); + _qPushButton->setAutoDefault( true ); + + YPushButton::setLabel( toUTF8 ( _qPushButton->text() ) ); +} + + +YQGenericButton::~YQGenericButton() +{ + if ( _dialog ) // If we don't have one any more, don't bother + { + if ( _dialog->focusButton() == this ) + _dialog->losingFocus( this ); + + if ( _dialog->defaultButton() == this ) + _dialog->setDefaultButton(0); + } +} + + +YQDialog * +YQGenericButton::dialog() +{ + if ( ! _dialog ) + { + YDialog * yDialog = findDialog(); + + if ( yDialog ) + _dialog = dynamic_cast (yDialog); + + YUI_CHECK_PTR( _dialog ); + } + + return _dialog; +} + + +void +YQGenericButton::setDefaultButton( bool def ) +{ + YPushButton::setDefaultButton( def ); + + if ( ! _setDefaultButtonRecursive ) + { + _setDefaultButtonRecursive = true; + + if ( _dialog && def ) + dialog()->setDefaultButton( this ); + + _setDefaultButtonRecursive = true; + } +} + + +void YQGenericButton::setEnabled( bool enabled ) +{ + if ( _qPushButton ) + _qPushButton->setEnabled( enabled ); + + YWidget::setEnabled( enabled ); +} + + +bool YQGenericButton::isEnabled() const +{ + return _qPushButton ? _qPushButton->isEnabled() : false; +} + + +void YQGenericButton::setIcon( const string & iconName ) +{ + if ( ! _qPushButton ) + { + y2error( "NULL button (icon %s)", iconName.c_str() ); + return; + } + + QString qIconName = fromUTF8( iconName ); + + if ( qIconName.isEmpty() ) + { + _qPushButton->setIconSet( QIconSet() ); + return; + } + + qIconName = QString( ICONDIR ) + "/" + qIconName; + QPixmap icon( qIconName ); + + if ( icon.isNull() ) + y2warning( "Can't load icon '%s'", (const char *) qIconName ); + else + _qPushButton->setIconSet( icon ); +} + + +void YQGenericButton::setLabel( const QString & label ) +{ + if ( _qPushButton ) + _qPushButton->setText( label ); + else + y2error( "NULL button '%s'", (const char *) label ); + + YPushButton::setLabel( toUTF8( label ) ); +} + + +void YQGenericButton::setLabel( const string & label ) +{ + if ( _qPushButton ) + _qPushButton->setText( fromUTF8( label ) ); + else + y2error( "NULL button '%s'", label.c_str() ); + + YPushButton::setLabel( label ); +} + + +void YQGenericButton::showAsDefault( bool show ) +{ + if ( _qPushButton ) + { + _qPushButton->setDefault( show ); + _qPushButton->update(); + } +} + + +bool YQGenericButton::isShownAsDefault() const +{ + return _qPushButton ? _qPushButton->isDefault() : false; +} + + +QString +YQGenericButton::text() const +{ + return _qPushButton ? _qPushButton->text() : ""; +} + + +void YQGenericButton::activate() +{ + if ( _qPushButton ) + _qPushButton->animateClick(); +} + + +bool YQGenericButton::eventFilter( QObject * obj, QEvent * event ) +{ + if ( event ) + { + if ( event->type() == QEvent::FocusIn ) + { + dialog()->gettingFocus( this ); + return false; // event processed? + } + else if ( event->type() == QEvent::FocusOut ) + { + dialog()->losingFocus( this ); + return false; // event processed? + } + else if ( event->type() == QEvent::MouseButtonRelease ) + { + QMouseEvent * mouseEvent = dynamic_cast (event); + + if ( mouseEvent && mouseEvent->button() == Qt::RightButton ) + { + y2milestone( "Right click on button detected" ); + YQUI::ui()->maybeLeftHandedUser(); + } + } + } + + + return QObject::eventFilter( obj, event ); +} + + +bool YQGenericButton::setKeyboardFocus() +{ + if ( ! _qPushButton ) + return false; + + dialog()->gettingFocus( this ); + _qPushButton->setFocus(); + + return true; +} + + +#include "YQGenericButton.moc" diff --git a/src/YQGenericButton.h b/src/YQGenericButton.h new file mode 100644 index 0000000..90f7422 --- /dev/null +++ b/src/YQGenericButton.h @@ -0,0 +1,167 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQGenericButton.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQGenericButton_h +#define YQGenericButton_h + +#include + +#include "YPushButton.h" + + +class QPushButton; +class QObject; +class YQDialog; + +using std::string; + +/** + * Abstract base class for push button and similar widgets - + * all that can become a YQDialog's "default button". + **/ +class YQGenericButton : public QWidget, public YPushButton +{ + Q_OBJECT + +protected: + + /** + * Constructor. + **/ + YQGenericButton( YWidget * parent, + const string & label ); + +public: + + /** + * Destructor. + **/ + virtual ~YQGenericButton(); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Returns 'true' if this button is enabled, 'false' otherwise. + **/ + bool isEnabled() const; + + /** + * Changes the label (the text) of the button. + **/ + void setLabel( const QString & label ); + + /** + * Changes the label (the text) of the button. + * + * Reimplemented from YWidget. + **/ + void setLabel( const string & label ); + + /** + * Show this button as the dialog's default button. The button never calls + * this by itself - the parent dialog is responsible for that. + **/ + void showAsDefault( bool show = true ); + + /** + * Returns 'true' if this button is shown as a default button - which may + * mean that this really is the dialogs's default button or it is the + * dialog's focus button (a button that currently has the keyboard focus). + * + * Don't confuse this with YPushButton::isDefaultButton()! + **/ + bool isShownAsDefault() const; + + /** + * Set this button's default button state. + * + * Reimplemented from YPushButton. + **/ + virtual void setDefaultButton( bool def = true ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + /** + * Set this button's icon. + * + * Reimplemented from YPushButton. + **/ + virtual void setIcon( const string & iconName ); + + /** + * Returns the button's text ( label ) - useful for log messages etc. + **/ + QString text() const; + + /** + * Returns the internal Qt PushButton. + **/ + QPushButton * qPushButton() const { return _qPushButton; } + + /** + * Returns the internal parent dialog. + **/ + YQDialog * yQDialog() const { return _dialog; } + + +public slots: + + /** + * Activate (animated) this button. + **/ + void activate(); + + +protected: + + /** + * Set the corresponding QPushButton. + **/ + void setQPushButton( QPushButton * pb ); + + /** + * Redirect events from the _qPushButton member to this object. + * + * Overwritten from QObject. + **/ + bool eventFilter( QObject * obj, QEvent * event ); + + /** + * Returns the corresponding YQDialog. + * Throws an exception if there is none. + **/ + YQDialog * dialog(); + + +private: + + YQDialog * _dialog; + QPushButton * _qPushButton; + bool _setDefaultButtonRecursive; +}; + +#endif // YQGenericButton_h diff --git a/src/YQIconPool.cc b/src/YQIconPool.cc new file mode 100644 index 0000000..9a49322 --- /dev/null +++ b/src/YQIconPool.cc @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQIconPool.cc + + Author: Stefan Hundhammer + +/-*/ + +#define y2log_component "qt-ui" +#include + +#include "YQIconPool.h" + + +#include "icons/autodel.xpm" +#include "icons/autodel_disabled.xpm" +#include "icons/autoinstall.xpm" +#include "icons/autoinstall_disabled.xpm" +#include "icons/autoupdate.xpm" +#include "icons/autoupdate_disabled.xpm" +#include "icons/del.xpm" +#include "icons/del_disabled.xpm" +#include "icons/install.xpm" +#include "icons/install_disabled.xpm" +#include "icons/keepinstalled.xpm" +#include "icons/keepinstalled_disabled.xpm" +#include "icons/noinst.xpm" +#include "icons/noinst_disabled.xpm" +#include "icons/protected.xpm" +#include "icons/protected_disabled.xpm" +#include "icons/sel_autodel.xpm" +#include "icons/sel_autodel_disabled.xpm" +#include "icons/sel_autoinstall.xpm" +#include "icons/sel_autoinstall_disabled.xpm" +#include "icons/sel_autoupdate.xpm" +#include "icons/sel_autoupdate_disabled.xpm" +#include "icons/taboo.xpm" +#include "icons/taboo_disabled.xpm" +#include "icons/update.xpm" +#include "icons/update_disabled.xpm" +#include "icons/tree_plus.xpm" +#include "icons/tree_minus.xpm" +#include "icons/warning_sign.xpm" +#include "icons/satisfied.xpm" + +#include "icons/normal_conflict.xpm" +#include "icons/select_conflict.xpm" +#include "icons/delete_conflict.xpm" +#include "icons/unresolvable_conflict.xpm" + +#include "icons/checklist_off.xpm" +#include "icons/checklist_on.xpm" + +#include "icons/step_current.xpm" +#include "icons/step_todo.xpm" +#include "icons/step_done.xpm" + + +YQIconPool * YQIconPool::_iconPool = 0; + +QPixmap YQIconPool::pkgTaboo() { return iconPool()->cachedIcon( taboo_xpm ); } +QPixmap YQIconPool::pkgDel() { return iconPool()->cachedIcon( del_xpm ); } +QPixmap YQIconPool::pkgUpdate() { return iconPool()->cachedIcon( update_xpm ); } +QPixmap YQIconPool::pkgInstall() { return iconPool()->cachedIcon( install_xpm ); } +QPixmap YQIconPool::pkgAutoInstall() { return iconPool()->cachedIcon( autoinstall_xpm ); } +QPixmap YQIconPool::pkgAutoUpdate() { return iconPool()->cachedIcon( autoupdate_xpm ); } +QPixmap YQIconPool::pkgAutoDel() { return iconPool()->cachedIcon( autodel_xpm ); } +QPixmap YQIconPool::pkgSelAutoInstall() { return iconPool()->cachedIcon( sel_autoinstall_xpm ); } +QPixmap YQIconPool::pkgSelAutoUpdate() { return iconPool()->cachedIcon( sel_autoupdate_xpm ); } +QPixmap YQIconPool::pkgSelAutoDel() { return iconPool()->cachedIcon( sel_autodel_xpm ); } +QPixmap YQIconPool::pkgKeepInstalled() { return iconPool()->cachedIcon( keepinstalled_xpm ); } +QPixmap YQIconPool::pkgNoInst() { return iconPool()->cachedIcon( noinst_xpm ); } +QPixmap YQIconPool::pkgProtected() { return iconPool()->cachedIcon( protected_xpm ); } + +QPixmap YQIconPool::disabledPkgTaboo() { return iconPool()->cachedIcon( taboo_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgDel() { return iconPool()->cachedIcon( del_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgUpdate() { return iconPool()->cachedIcon( update_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgInstall() { return iconPool()->cachedIcon( install_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgAutoInstall() { return iconPool()->cachedIcon( autoinstall_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgAutoUpdate() { return iconPool()->cachedIcon( autoupdate_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgAutoDel() { return iconPool()->cachedIcon( autodel_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgSelAutoInstall() { return iconPool()->cachedIcon( sel_autoinstall_disabled_xpm );} +QPixmap YQIconPool::disabledPkgSelAutoUpdate() { return iconPool()->cachedIcon( sel_autoupdate_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgSelAutoDel() { return iconPool()->cachedIcon( sel_autodel_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgKeepInstalled() { return iconPool()->cachedIcon( keepinstalled_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgNoInst() { return iconPool()->cachedIcon( noinst_disabled_xpm ); } +QPixmap YQIconPool::disabledPkgProtected() { return iconPool()->cachedIcon( protected_disabled_xpm ); } + +QPixmap YQIconPool::checkMarkOn() { return iconPool()->cachedIcon( checklist_on_xpm ); } +QPixmap YQIconPool::checkMarkOff() { return iconPool()->cachedIcon( checklist_off_xpm ); } + +QPixmap YQIconPool::normalPkgConflict() { return iconPool()->cachedIcon( normal_conflict_xpm ); } +QPixmap YQIconPool::severePkgConflict() { return iconPool()->cachedIcon( normal_conflict_xpm ); } +QPixmap YQIconPool::unresolvablePkgConflict() { return iconPool()->cachedIcon( unresolvable_conflict_xpm ); } +QPixmap YQIconPool::deletePkgConflict() { return iconPool()->cachedIcon( delete_conflict_xpm ); } +QPixmap YQIconPool::tabooPkgConflict() { return iconPool()->cachedIcon( normal_conflict_xpm ); } +QPixmap YQIconPool::selectPkgConflict() { return iconPool()->cachedIcon( select_conflict_xpm ); } + +QPixmap YQIconPool::treePlus() { return iconPool()->cachedIcon( tree_plus_xpm ); } +QPixmap YQIconPool::treeMinus() { return iconPool()->cachedIcon( tree_minus_xpm ); } + +QPixmap YQIconPool::warningSign() { return iconPool()->cachedIcon( warning_sign_xpm ); } +QPixmap YQIconPool::pkgSatisfied() { return iconPool()->cachedIcon( satisfied_xpm ); } + +QPixmap YQIconPool::stepCurrent() { return iconPool()->cachedIcon( step_current_xpm ); } +QPixmap YQIconPool::stepToDo() { return iconPool()->cachedIcon( step_todo_xpm ); } +QPixmap YQIconPool::stepDone() { return iconPool()->cachedIcon( step_done_xpm ); } + + +YQIconPool * YQIconPool::iconPool() +{ + if ( ! _iconPool ) + _iconPool = new YQIconPool(); + + return _iconPool; +} + + +YQIconPool::YQIconPool() +{ + _iconCache.setAutoDelete( true ); +} + + +YQIconPool::~YQIconPool() +{ + // NOP +} + + + +QPixmap +YQIconPool::cachedIcon( const char ** xpm_data ) +{ + QPixmap * iconPtr = _iconCache[ xpm_data ]; + + if ( ! iconPtr ) + { + iconPtr = new QPixmap( xpm_data ); + _iconCache.insert( xpm_data, iconPtr ); + } + + return *iconPtr; +} + diff --git a/src/YQIconPool.h b/src/YQIconPool.h new file mode 100644 index 0000000..f2d682d --- /dev/null +++ b/src/YQIconPool.h @@ -0,0 +1,116 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQIconPool.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQIconPool_h +#define YQIconPool_h + +#include +#include + +class YQIconPool +{ +public: + + static QPixmap pkgAutoDel(); + static QPixmap pkgAutoInstall(); + static QPixmap pkgAutoUpdate(); + static QPixmap pkgDel(); + static QPixmap pkgInstall(); + static QPixmap pkgKeepInstalled(); + static QPixmap pkgNoInst(); + static QPixmap pkgProtected(); + static QPixmap pkgSelAutoDel(); + static QPixmap pkgSelAutoInstall(); + static QPixmap pkgSelAutoUpdate(); + static QPixmap pkgTaboo(); + static QPixmap pkgUpdate(); + + static QPixmap disabledPkgAutoDel(); + static QPixmap disabledPkgAutoInstall(); + static QPixmap disabledPkgAutoUpdate(); + static QPixmap disabledPkgDel(); + static QPixmap disabledPkgInstall(); + static QPixmap disabledPkgKeepInstalled(); + static QPixmap disabledPkgNoInst(); + static QPixmap disabledPkgProtected(); + static QPixmap disabledPkgSelAutoDel(); + static QPixmap disabledPkgSelAutoInstall(); + static QPixmap disabledPkgSelAutoUpdate(); + static QPixmap disabledPkgTaboo(); + static QPixmap disabledPkgUpdate(); + + static QPixmap checkMarkOn(); + static QPixmap checkMarkOff(); + + static QPixmap normalPkgConflict(); + static QPixmap severePkgConflict(); + static QPixmap unresolvablePkgConflict(); + static QPixmap deletePkgConflict(); + static QPixmap tabooPkgConflict(); + static QPixmap selectPkgConflict(); + + static QPixmap treePlus(); + static QPixmap treeMinus(); + + static QPixmap warningSign(); + static QPixmap pkgSatisfied(); + + static QPixmap stepCurrent(); + static QPixmap stepToDo(); + static QPixmap stepDone(); + + +protected: + + /** + * Return the global icon pool. + **/ + static YQIconPool * iconPool(); + + /** + * Return the cached icon for 'xpm_data' ( an included XPM file ). + * If the icon isn't in the cache yet, create it and store it in the + * cache. + **/ + QPixmap cachedIcon( const char ** xpm_data ); + +private: + + /** + * (Private!) Constructor + * Singleton object - use the static methods only! + **/ + YQIconPool(); + + /** + * Destructor + **/ + virtual ~YQIconPool(); + + + // + // Data members + // + + static YQIconPool * _iconPool; + QPtrDict _iconCache; +}; + + +#endif // ifndef YQIconPool_h diff --git a/src/YQImage.cc b/src/YQImage.cc new file mode 100644 index 0000000..b224c55 --- /dev/null +++ b/src/YQImage.cc @@ -0,0 +1,167 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQImage.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQImage.h" + + + +YQImage::YQImage( YWidget * parent, + const string & imageFileName, + bool animated ) + : QLabel( (QWidget *) parent->widgetRep() ) + , YImage( parent, imageFileName, animated ) +{ + setWidgetRep( this ); + setAlignment( Qt::AlignLeft | Qt::AlignTop ); + + setScaledContents( false ); + _pixmapHeight = 0; + _pixmapWidth = 0; + + setImage( imageFileName, animated ); +} + + +YQImage::~YQImage() +{ + // NOP +} + + +void +YQImage::setImage( const string & fileName, bool animated ) +{ + YImage::setImage( fileName, animated ); + + if ( animated ) + { + QMovie movie( fromUTF8( imageFileName() ) ); + + if ( movie.isNull() ) + { + y2error( "Couldn't load animation from %s", imageFileName().c_str() ); + } + else + { + y2debug( "Loading animation from %s", imageFileName().c_str() ); + QLabel::setMovie( movie ); + } + } + else + { + QPixmap pixmap( fromUTF8( imageFileName() ) ); + + if ( pixmap.isNull() ) + { + y2error( "Couldn't load pixmap from %s", imageFileName().c_str() ); + } + else + { + if ( autoScale() ) + { + _pixmapWidth = 0; + _pixmapHeight = 0; + } + else + { + _pixmapWidth = pixmap.size().width(); + _pixmapHeight = pixmap.size().height(); + } + + y2debug( "Loading image from %s (%d x %d)", + imageFileName().c_str(), + pixmap.size().width(), + pixmap.size().height() ); + + QLabel::setPixmap( pixmap ); + } + } +} + +void YQImage::setAutoScale( bool newAutoScale ) +{ + if ( autoScale() == newAutoScale ) + return; + + YImage::setAutoScale( newAutoScale ); + setScaledContents( newAutoScale ); + + // Trigger image re-display + setImage( imageFileName(), animated() ); +} + + +int YQImage::preferredWidth() +{ + if ( hasZeroSize( YD_HORIZ ) ) + return 0; + + if ( animated() ) + { + // a QMovie doesn't have a size() method, thus use sizeHint() instead. + + return sizeHint().width(); + } + else + { + // for non-animated images, the background pixmap is used, thus + // sizeHint() will always return ( 0,0 ) - thus, use the internally + // stored sizes instead. + + return _pixmapWidth; + } +} + + +int YQImage::preferredHeight() +{ + if ( hasZeroSize( YD_VERT ) ) + return 0; + + if ( animated() ) + { + // a QMovie doesn't have a size() method, thus use sizeHint() instead. + + return sizeHint().height(); + } + else + { + // for non-animated images, the background pixmap is used, thus + // sizeHint() will always return ( 0,0 ) - thus, use the internally + // stored sizes instead. + + return _pixmapHeight; + } +} + + +void YQImage::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +#include "YQImage.moc" diff --git a/src/YQImage.h b/src/YQImage.h new file mode 100644 index 0000000..3278042 --- /dev/null +++ b/src/YQImage.h @@ -0,0 +1,91 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQImage.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQImage_h +#define YQImage_h + +#include +#include + +#include "YImage.h" +#include "YUI.h" + + +class YQImage : public QLabel, public YImage +{ + Q_OBJECT + +public: + /** + * Constructor. + * + * 'animated' indicates if 'imageFileName' is an animated image format + * (e.g., MNG). + **/ + YQImage( YWidget * parent, + const string & imageFileName, + bool animated = false ); + + /** + * Destructor. + **/ + virtual ~YQImage(); + + /** + * Set and display a new image. + * + * Reimplemented from YImage. + **/ + virtual void setImage( const string & imageFileName, bool animated = false ); + + /** + * Make the image fit into the available space. + * + * Reimplemented from YImage. + **/ + virtual void setAutoScale( bool autoScale = true ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + +protected: + + int _pixmapWidth; + int _pixmapHeight; +}; + +#endif // YQImage_h diff --git a/src/YQInputField.cc b/src/YQInputField.cc new file mode 100644 index 0000000..7406224 --- /dev/null +++ b/src/YQInputField.cc @@ -0,0 +1,318 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQInputField.cc + + Author: Stefan Hundhammer + + textdomain "packages-qt" + +/-*/ + + +#include +#define y2log_component "qt-ui" +#include + +using std::max; + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "QY2CharValidator.h" +#include "YQInputField.h" +#include "YQi18n.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + +// Include low-level X headers AFTER Qt headers: +// X.h pollutes the global namespace (!!!) with pretty useless #defines +// like "Above", "Below" etc. that clash with some Qt headers. +#include // CapsLock detection +#include // CapsLock detection +#include // CapsLock detection + +using std::string; + + + +YQInputField::YQInputField( YWidget * parent, + const string & label, + bool passwordMode ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YInputField( parent, label, passwordMode ) + , _validator(0) + , _displayingCapsLockWarning( false ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_lineEdit = new YQRawLineEdit( this ); + YUI_CHECK_NEW( _qt_lineEdit ); + + _caption->setBuddy( _qt_lineEdit ); + + connect( _qt_lineEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT ( changed ( const QString & ) ) ); + + if ( passwordMode ) + { + _qt_lineEdit->setEchoMode( QLineEdit::Password ); + + connect( _qt_lineEdit, SIGNAL( capsLockActivated() ), + this, SLOT ( displayCapsLockWarning() ) ); + + connect( _qt_lineEdit, SIGNAL( capsLockDeactivated() ), + this, SLOT ( clearCapsLockWarning() ) ); + } +} + + +string YQInputField::value() +{ + return toUTF8( _qt_lineEdit->text() ); +} + + +void YQInputField::setValue( const string & newText ) +{ + QString text = fromUTF8( newText ); + + if ( isValidText( text ) ) + { + YQSignalBlocker sigBlocker( _qt_lineEdit ); + _qt_lineEdit->setText( text ); + } + else + { + y2error( "%s \"%s\": Rejecting invalid value \"%s\"", + widgetClass(), debugLabel().c_str(), newText.c_str() ); + } +} + + +void YQInputField::setEnabled( bool enabled ) +{ + _qt_lineEdit->setEnabled( enabled ); + _caption->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQInputField::preferredWidth() +{ + int minSize = shrinkable() ? 30 : 200; + int hintWidth = _caption->isShown() + ? _caption->sizeHint().width() + 2 * YQWidgetMargin + : 0; + + return max( minSize, hintWidth ); +} + + +int YQInputField::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQInputField::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void YQInputField::setLabel( const string & label ) +{ + _caption->setText( label ); + YInputField::setLabel( label ); +} + + +bool YQInputField::isValidText( const QString & txt ) const +{ + if ( ! _validator ) + return true; + + int pos = 0; + QString text( txt ); // need a non-const QString & + + return _validator->validate( text, pos ) == QValidator::Acceptable; +} + + +void YQInputField::setValidChars( const string & newValidChars ) +{ + if ( _validator ) + { + _validator->setValidChars( fromUTF8( newValidChars ) ); + } + else + { + _validator = new QY2CharValidator( fromUTF8( newValidChars ), this ); + _qt_lineEdit->setValidator( _validator ); + + // No need to delete the validator in the destructor - Qt will take + // care of that since it's a QObject with a parent! + } + + if ( ! isValidText( _qt_lineEdit->text() ) ) + { + y2error( "Old value \"%s\" of %s \"%s\" invalid according to ValidChars \"%s\" - deleting", + (const char *) _qt_lineEdit->text(), + widgetClass(), debugLabel().c_str(), + newValidChars.c_str() ); + _qt_lineEdit->setText( "" ); + } + + YInputField::setValidChars( newValidChars ); +} + +void YQInputField::setInputMaxLength( int len ) +{ + _qt_lineEdit->setMaxLength( len ); + YInputField::setInputMaxLength( len ); +} + +bool YQInputField::setKeyboardFocus() +{ + _qt_lineEdit->setFocus(); + _qt_lineEdit->selectAll(); + + return true; +} + + +void YQInputField::changed( const QString & ) +{ + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +void YQInputField::displayCapsLockWarning() +{ + y2milestone( "warning" ); + if ( _displayingCapsLockWarning ) + return; + + if ( _qt_lineEdit->echoMode() == QLineEdit::Normal ) + return; + + // Translators: This is a very short warning that the CapsLock key + // is active while trying to type in a password field. This warning + // replaces the normal label (caption) of that password field while + // CapsLock is active, so please keep it short. Please don't translate it + // at all if the term "CapsLock" can reasonably expected to be understood + // by the target audience. + // + // In particular, please don't translate this to death in German. + // Simply leave it. + + _caption->setText( _( "CapsLock!" ) ); + _displayingCapsLockWarning = true; +} + + +void YQInputField::clearCapsLockWarning() +{ + y2milestone( "warning off " ); + if ( ! _displayingCapsLockWarning ) + return; + + if ( _qt_lineEdit->echoMode() == QLineEdit::Normal ) + return; + + _caption->setText( label() ); + _displayingCapsLockWarning = false; +} + + +bool YQRawLineEdit::x11Event( XEvent * event ) +{ + // Qt (3.x) does not have support for the CapsLock key. + // All other modifiers (Shift, Control, Meta) are propagated via + // Qt's events, but for some reason, CapsLock is not. + // + // So let's examine the raw X11 event here to check for the + // CapsLock status. All events are really handled on the parent class + // (QWidget) level, though. We only peek into the modifier states. + + if ( event ) + { + bool oldCapsLockActive = _capsLockActive; + + switch ( event->type ) + { + case KeyPress: + _capsLockActive = (bool) ( event->xkey.state & LockMask ); + break; + + case KeyRelease: + + _capsLockActive = (bool) ( event->xkey.state & LockMask ); + + if ( _capsLockActive && oldCapsLockActive ) + { + KeySym key = XLookupKeysym( &(event->xkey), 0 ); + + if ( key == XK_Caps_Lock || + key == XK_Shift_Lock ) + { + y2milestone( "CapsLock released" ); + _capsLockActive = false; + } + } + + y2debug( "Key event; caps lock: %s", _capsLockActive ? "on" : "off" ); + break; + + case ButtonPress: + case ButtonRelease: + _capsLockActive = (bool) ( event->xbutton.state & LockMask ); + break; + + case EnterNotify: + _capsLockActive = (bool) ( event->xcrossing.state & LockMask ); + break; + + case LeaveNotify: + case FocusOut: + _capsLockActive = false; + emit capsLockDeactivated(); + break; + + default: + break; + } + + if ( oldCapsLockActive != _capsLockActive ) + { + y2milestone( "Emitting warning" ); + + if ( _capsLockActive ) + emit capsLockActivated(); + else + emit capsLockDeactivated(); + } + } + + return false; // handle this event at the Qt level +} + + +#include "YQInputField.moc" diff --git a/src/YQInputField.h b/src/YQInputField.h new file mode 100644 index 0000000..2b05827 --- /dev/null +++ b/src/YQInputField.h @@ -0,0 +1,205 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQInputField.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQInputField_h +#define YQInputField_h + +#include +#include + +#include "YInputField.h" + +class QString; +class QY2CharValidator; +class YQWidgetCaption; +class YQRawLineEdit; + +using std::string; + + +class YQInputField : public QVBox, public YInputField +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQInputField( YWidget * parent, + const string & label, + bool passwordMode = false ); + + /** + * Get the current value (the text entered by the user or set from the + * outside) of this input field. + * + * Reimplemented from YInputField. + **/ + virtual string value(); + + /** + * Set the current value (the text entered by the user or set from the + * outside) of this input field. + * + * Reimplemented from YInputField. + **/ + virtual void setValue( const string & text ); + + /** + * Set the label (the caption above the input field). + * + * Reimplemented from YInputField. + **/ + virtual void setLabel( const string & label ); + + /** + * Set the valid input characters. No input validation is performed (i.e., + * the user can enter anything) if this is empty. + * + * Reimplemented from YInputField. + **/ + virtual void setValidChars( const string & validChars ); + + /** + * Specify the amount of characters which can be inserted. + * + * Reimplemented from YInputField. + **/ + virtual void setInputMaxLength( int numberOfChars ); + + /** + * Returns 'true' if a given text is valid according to ValidChars. + **/ + bool isValidText( const QString & text ) const; + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +protected slots: + /** + * Triggered when the text in the InputField changes. + * This _may_ be of interest to the module. + **/ + void changed( const QString & ); + + /** + * Display a warning that CapsLock is active: + * Replace the label with "CapsLock!" + **/ + void displayCapsLockWarning(); + + /** + * Clear the CapsLock warning: Restore old label + **/ + void clearCapsLockWarning(); + + +protected: + + YQWidgetCaption * _caption; + YQRawLineEdit * _qt_lineEdit; + QY2CharValidator * _validator; + bool _shrinkable; + bool _displayingCapsLockWarning; +}; + + +/** + * Helper class that can obtain the CapsLock status, too. + * For some reason, Qt does not propagate that information from X11. + **/ +class YQRawLineEdit: public QLineEdit +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQRawLineEdit( QWidget * parent ) + : QLineEdit( parent ) + , _capsLockActive( false ) + {} + + /** + * Destructor + **/ + virtual ~YQRawLineEdit() {}; + + /** + * Check if CapsLock is active + * (rather: was active at the time of the last key or focus event) + **/ + bool isCapsLockActive() const { return _capsLockActive; } + + +signals: + void capsLockActivated(); + void capsLockDeactivated(); + +protected: + + /** + * X11 raw event handler. Propagates all events to the Qt event handlers, + * but updates _capsLockActive for key events. + * + * Reimplemented from QWidget. + **/ + bool x11Event( XEvent * event ) ; + +private: + + bool _capsLockActive; +}; + +#endif // YQInputField_h diff --git a/src/YQIntField.cc b/src/YQIntField.cc new file mode 100644 index 0000000..1ee4682 --- /dev/null +++ b/src/YQIntField.cc @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQIntField.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include + +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQIntField.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + + +YQIntField::YQIntField( YWidget * parent, + const string & label, + int minValue, + int maxValue, + int initialValue ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YIntField( parent, label, minValue, maxValue ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_spinBox = new QSpinBox( minValue, maxValue, + 1, // step + this ); + YUI_CHECK_NEW( _qt_spinBox ); + _qt_spinBox->setValue( initialValue ); + + _caption->setBuddy( _qt_spinBox ); + + setValue( initialValue ); + + connect( _qt_spinBox, SIGNAL( valueChanged ( int ) ), + this, SLOT ( valueChangedSlot( int ) ) ); +} + + +YQIntField::~YQIntField() +{ + // NOP +} + + +int +YQIntField::value() +{ + return _qt_spinBox->value(); +} + + +void +YQIntField::setValueInternal( int newValue ) +{ + YQSignalBlocker sigBlocker( _qt_spinBox ); + _qt_spinBox->setValue( newValue ); +} + + +void +YQIntField::valueChangedSlot( int newValue ) +{ + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); + emit valueChanged( newValue ); +} + + +void +YQIntField::setLabel( const string & newLabel ) +{ + YIntField::setLabel( newLabel ); + _caption->setText( newLabel ); +} + + +void +YQIntField::setEnabled( bool enabled ) +{ + _caption->setEnabled ( enabled ); + _qt_spinBox->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int +YQIntField::preferredWidth() +{ + return sizeHint().width(); +} + + +int +YQIntField::preferredHeight() +{ + return sizeHint().height(); +} + + +void +YQIntField::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool +YQIntField::setKeyboardFocus() +{ + _qt_spinBox->setFocus(); + + return true; +} + + +#include "YQIntField.moc" diff --git a/src/YQIntField.h b/src/YQIntField.h new file mode 100644 index 0000000..cf52478 --- /dev/null +++ b/src/YQIntField.h @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQIntField.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQIntField_h +#define YQIntField_h + +#include +#include + +#include "YIntField.h" + + +class YQWidgetCaption; +class QSpinBox; + + +class YQIntField : public QVBox, public YIntField +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQIntField( YWidget * parent, + const string & label, + int minValue, + int maxValue, + int initialValue ); + + /** + * Destructor. + **/ + virtual ~YQIntField(); + + /** + * Get the current value (the number entered by the user or set from the + * outside) of this IntField. + * + * Implemented from YIntField. + **/ + virtual int value(); + +protected: + + /** + * Set the current value (the number entered by the user or set from the + * outside) of this IntField. 'val' is guaranteed to be between minValue + * and maxValue; no further checks are required. + * + * Implemented from YIntField. + **/ + virtual void setValueInternal( int val ); + +public: + + /** + * Set the label (the caption above the input field). + * + * Reimplemented from YIntField. + **/ + virtual void setLabel( const string & label ); + + /** + * Sets the widget's enabled state. + * + * Inherited from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +signals: + + /** + * Emitted when the value changes (regardless of the notify flag). + **/ + void valueChanged( int newValue ); + + +protected slots: + + /** + * Slot for "value changed". This will send a ValueChanged event if + * 'notify' is set. + **/ + void valueChangedSlot( int newValue ); + + +protected: + + YQWidgetCaption * _caption; + QSpinBox * _qt_spinBox; +}; + + +#endif // YQIntField_h diff --git a/src/YQLabel.cc b/src/YQLabel.cc new file mode 100644 index 0000000..fe34245 --- /dev/null +++ b/src/YQLabel.cc @@ -0,0 +1,106 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLabel.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQApplication.h" +#include "YQLabel.h" + + +YQLabel::YQLabel( YWidget * parent, + const string & text, + bool isHeading, + bool isOutputField ) + : QLabel( (QWidget *) parent->widgetRep() ) + , YLabel( parent, text, isHeading, isOutputField ) +{ + setWidgetRep( this ); + + setTextFormat( QLabel::PlainText ); + QLabel::setText( fromUTF8( text ) ); + setIndent(0); + + if ( isHeading ) + { + setFont( YQUI::yqApp()->headingFont() ); + } + else if ( isOutputField ) + { + setFrameStyle ( QFrame::Panel | QFrame::Sunken ); + setLineWidth(2); + setMidLineWidth(2); + } + + setMargin( YQWidgetMargin ); + setAlignment( AlignLeft | AlignTop ); +} + + +YQLabel::~YQLabel() +{ + // NOP +} + + +void YQLabel::setText( const string & newText ) +{ + YLabel::setText( newText ); + QLabel::setText( fromUTF8( newText ) ); +} + + +void YQLabel::setUseBoldFont( bool useBold ) +{ + setFont( useBold ? + YQUI::yqApp()->boldFont() : + YQUI::yqApp()->currentFont() ); + + YLabel::setUseBoldFont( useBold ); +} + + +void YQLabel::setEnabled( bool enabled ) +{ + QLabel::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQLabel::preferredWidth() +{ + return sizeHint().width(); +} + + +int YQLabel::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQLabel::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +#include "YQLabel.moc" diff --git a/src/YQLabel.h b/src/YQLabel.h new file mode 100644 index 0000000..fb31398 --- /dev/null +++ b/src/YQLabel.h @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLabel.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQLabel_h +#define YQLabel_h + +#include +#include "YLabel.h" + + +class YQLabel : public QLabel, public YLabel +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQLabel( YWidget * parent, + const string & text, + bool isHeading = false, + bool isOutputField = false ); + + /** + * Destructor. + **/ + virtual ~YQLabel(); + + /** + * Set the text the widget displays. + * + * Reimplemented from YLabel. + **/ + virtual void setText( const string & newText ); + + /** + * Switch bold font on or off. + * + * Reimplemented from YLabel. + **/ + virtual void setUseBoldFont( bool bold ); + + /** + * Set enabled / disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); +}; + + +#endif // YQLabel_h diff --git a/src/YQLayoutBox.cc b/src/YQLayoutBox.cc new file mode 100644 index 0000000..eba0f43 --- /dev/null +++ b/src/YQLayoutBox.cc @@ -0,0 +1,56 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLayoutBox.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include +#include "YQLayoutBox.h" + + +YQLayoutBox::YQLayoutBox( YWidget * parent, + YUIDimension dimension ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YLayoutBox( parent, dimension ) +{ + setWidgetRep( this ); +} + + +void YQLayoutBox::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void YQLayoutBox::setSize( int newWidth, int newHeight ) +{ + // y2debug( "Resizing %s to %d x %d", widgetClass(), newWidth, newHeight ); + resize( newWidth, newHeight ); + YLayoutBox::setSize( newWidth, newHeight ); +} + + +void YQLayoutBox::moveChild( YWidget * child, int newX, int newY ) +{ + QWidget * qw = (QWidget *)( child->widgetRep() ); + qw->move( newX, newY ); +} + + +#include "YQLayoutBox.moc" diff --git a/src/YQLayoutBox.h b/src/YQLayoutBox.h new file mode 100644 index 0000000..f109bdc --- /dev/null +++ b/src/YQLayoutBox.h @@ -0,0 +1,68 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLayoutBox.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQLayoutBox_h +#define YQLayoutBox_h + +#include + +#include "YLayoutBox.h" + + +class YQLayoutBox : public QWidget, public YLayoutBox +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * Creates a VBox for dim == YD_VERT or a HBox for YD_HORIZ. + **/ + YQLayoutBox( YWidget * parent, YUIDimension dim ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Move a child widget to a new position. + * + * Reimplemented from YLayoutBox. + **/ + virtual void moveChild( YWidget * child, int newX, int newY ); +}; + + +typedef YQLayoutBox YQVBox; +typedef YQLayoutBox YQHBox; + + +#endif // YQLayoutBox_h diff --git a/src/YQLogView.cc b/src/YQLogView.cc new file mode 100644 index 0000000..27680f7 --- /dev/null +++ b/src/YQLogView.cc @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLogView.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#define y2log_component "qt-ui" +#include + +using std::max; + +#include "utf8.h" +#include "YQUI.h" +#include "YQLogView.h" +#include "YQWidgetCaption.h" + + +YQLogView::YQLogView( YWidget * parent, + const string & label, + int visibleLines, + int maxLines ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YLogView( parent, label, visibleLines, maxLines ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_text = new QMultiLineEdit( this ); + YUI_CHECK_NEW( _qt_text ); + + _qt_text->setReadOnly( true ); + _qt_text->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); + + _caption->setBuddy( _qt_text ); +} + + +YQLogView::~YQLogView() +{ + // NOP +} + + +void +YQLogView::displayLogText( const string & text ) +{ + _qt_text->setText( fromUTF8( text ) ); + _qt_text->scrollToBottom(); +} + + +void +YQLogView::setLabel( const string & label ) +{ + _caption->setText( label ); + YLogView::setLabel( label ); +} + + + +void +YQLogView::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_text->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int +YQLogView::preferredWidth() +{ + return max( 50, sizeHint().width() ); +} + + +int +YQLogView::preferredHeight() +{ + int hintHeight = visibleLines() * _qt_text->fontMetrics().lineSpacing(); + hintHeight += _qt_text->style().scrollBarExtent().height(); + hintHeight += _qt_text->frameWidth() * 2; + + if ( _caption->isShown() ) + hintHeight += _caption->sizeHint().height(); + + return max( 80, hintHeight ); +} + + +void +YQLogView::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool +YQLogView::setKeyboardFocus() +{ + _qt_text->setFocus(); + + return true; +} + + + +#include "YQLogView.moc" + diff --git a/src/YQLogView.h b/src/YQLogView.h new file mode 100644 index 0000000..754cb76 --- /dev/null +++ b/src/YQLogView.h @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQLogView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQLogView_h +#define YQLogView_h + +#include + +#include "YLogView.h" + +class YQWidgetCaption; +class QMultiLineEdit; + + +class YQLogView : public QVBox, public YLogView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQLogView( YWidget * parent, + const string & label, + int visibleLines, + int maxLines ); + + /** + * Destructor. + **/ + virtual ~YQLogView(); + +protected: + /** + * Display the part of the log text that should be displayed. + * 'text' contains the last 'visibleLines()' lines. + * This is called whenever the log text changes. Note that the text might + * also be empty, in which case the displayed log text should be cleared. + * + * Implemented from YLogView. + **/ + virtual void displayLogText( const string & text ); + +public: + + /** + * Set the label (the caption above the log text). + * + * Reimplemented from YLogView. + **/ + virtual void setLabel( const string & label ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +protected: + + YQWidgetCaption * _caption; + QMultiLineEdit * _qt_text; +}; + + +#endif // YQLogView_h diff --git a/src/YQMenuButton.cc b/src/YQMenuButton.cc new file mode 100644 index 0000000..42ff8be --- /dev/null +++ b/src/YQMenuButton.cc @@ -0,0 +1,221 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMenuButton.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQMenuButton.h" +#include "YEvent.h" + + + +YQMenuButton::YQMenuButton( YWidget * parent, + const string & label ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YMenuButton( parent, label ) + , _selectedItem( 0 ) +{ + setWidgetRep( this ); + _qt_button = new QPushButton( fromUTF8( label ), this ); + // _qt_button->setMinimumSize( 2,2 ); + _qt_button->move( YQButtonBorder, YQButtonBorder ); + setMinimumSize( _qt_button->minimumSize() + + 2 * QSize( YQButtonBorder, YQButtonBorder ) ); +} + + +YQMenuButton::~YQMenuButton() +{ + // NOP +} + + +void +YQMenuButton::setLabel( const string & label ) +{ + _qt_button->setText( fromUTF8( label ) ); + YMenuButton::setLabel( label ); +} + + +void +YQMenuButton::rebuildMenuTree() +{ + // + // Delete any previous menu + // (in case the menu items got replaced) + // + + if ( _qt_button->popup() ) + delete _qt_button->popup(); + + // + // Create toplevel menu + // + + QPopupMenu * menu = new QPopupMenu( _qt_button ); + YUI_CHECK_NEW( menu ); + _qt_button->setPopup( menu ); + + connect( menu, SIGNAL( activated ( int ) ), + this, SLOT ( menuEntryActivated( int ) ) ); + + // + // Recursively add Qt menu items from the YMenuItems + // + + rebuildMenuTree( menu, itemsBegin(), itemsEnd() ); +} + + +void +YQMenuButton::rebuildMenuTree( QPopupMenu * parentMenu, YItemIterator begin, YItemIterator end ) +{ + for ( YItemIterator it = begin; it != end; ++it ) + { + YMenuItem * item = dynamic_cast (*it); + YUI_CHECK_PTR( item ); + + QPixmap icon; + + if ( item->hasIconName() ) + { + string iconName = iconFullPath( item ); + icon = QPixmap( iconName.c_str() ); + + if ( icon.isNull() ) + y2warning( "Can't load icon %s", iconName.c_str() ); + } + + if ( item->hasChildren() ) + { + QPopupMenu * subMenu = new QPopupMenu( parentMenu ); + YUI_CHECK_NEW( subMenu ); + + if ( icon.isNull() ) + parentMenu->insertItem( fromUTF8( item->label() ), subMenu ); + else + parentMenu->insertItem( QIconSet( icon ), fromUTF8( item->label() ), subMenu ); + + connect( subMenu, SIGNAL( activated ( int ) ), + this, SLOT ( menuEntryActivated( int ) ) ); + + rebuildMenuTree( subMenu, item->childrenBegin(), item->childrenEnd() ); + } + else // No children - leaf entry + { + // item->index() is guaranteed to be unique within this YMenuButton's items, + // so it can easily be used as unique ID in all QPopupMenus that belong + // to this YQMenuButton. + + if ( icon.isNull() ) + parentMenu->insertItem( fromUTF8( item->label() ), item->index() ); + else + parentMenu->insertItem( QIconSet( icon ), fromUTF8( item->label() ), item->index() ); + } + } +} + + +void +YQMenuButton::menuEntryActivated( int serialNo ) +{ + // y2debug( "Selected menu entry #%d", menu_item_index ); + _selectedItem = findMenuItem( serialNo ); + + if ( _selectedItem ) + { + /* + * Defer the real returnNow() until all popup related events have been + * processed. This took me some hours to figure out; obviously + * exit_loop() doesn't have any effect as long as there are still + * popups open. So be it - use a zero timer to perform the real + * returnNow() later. + */ + + /* + * the 100 delay is a ugly dirty workaround + */ + QTimer::singleShot( 100, this, SLOT( returnNow() ) ); + } + else + { + y2error( "No menu item with serial no. %d", serialNo ); + } +} + + +void +YQMenuButton::returnNow() +{ + if ( _selectedItem ) + { + YQUI::ui()->sendEvent( new YMenuEvent( _selectedItem ) ); + _selectedItem = 0; + } +} + + + +void +YQMenuButton::setEnabled( bool enabled ) +{ + _qt_button->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQMenuButton::preferredWidth() +{ + return 2*YQButtonBorder + _qt_button->sizeHint().width(); +} + + +int YQMenuButton::preferredHeight() +{ + return 2*YQButtonBorder + _qt_button->sizeHint().height(); +} + + +void +YQMenuButton::setSize( int newWidth, int newHeight ) +{ + _qt_button->resize( newWidth - 2 * YQButtonBorder, + newHeight - 2 * YQButtonBorder ); + resize( newWidth, newHeight ); +} + + +bool +YQMenuButton::setKeyboardFocus() +{ + _qt_button->setFocus(); + + return true; +} + + +#include "YQMenuButton.moc" diff --git a/src/YQMenuButton.h b/src/YQMenuButton.h new file mode 100644 index 0000000..f1ef4af --- /dev/null +++ b/src/YQMenuButton.h @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMenuButton.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQMenuButton_h +#define YQMenuButton_h + +#include +#include "YMenuButton.h" + + +class QPushButton; +class QPopupMenu; + +class YQMenuButton : public QWidget, public YMenuButton +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQMenuButton( YWidget * parent, + const string & label ); + + /** + * Destructor. + **/ + virtual ~YQMenuButton(); + + /** + * Change the label on the button. + * + * Reimplemented from YMenuButton / YSelectionWidget. + **/ + virtual void setLabel( const string & label ); + + /** + * Rebuild the displayed menu tree from the internally stored YMenuItems. + * + * Implemented from YMenuButton. + **/ + virtual void rebuildMenuTree(); + + /** + * Set enabled / disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +protected slots: + + /** + * Triggered when any menu item is activated. + **/ + void menuEntryActivated( int menuItemIndex ); + + /** + * Triggered via menuEntryActivated() by zero timer to get back in sync + * with the Qt event loop. + **/ + void returnNow(); + + +protected: + + /** + * Recursively insert menu items into 'menu' from iterator 'begin' to iterator 'end'. + **/ + void rebuildMenuTree( QPopupMenu * menu, YItemIterator begin, YItemIterator end ); + + + // + // Data members + // + + YMenuItem * _selectedItem; + QPushButton * _qt_button; +}; + +#endif // YQMenuButton_h diff --git a/src/YQMultiLineEdit.cc b/src/YQMultiLineEdit.cc new file mode 100644 index 0000000..a6dfdc3 --- /dev/null +++ b/src/YQMultiLineEdit.cc @@ -0,0 +1,199 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMultiLineEdit.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +using std::max; + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQMultiLineEdit.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + + +YQMultiLineEdit::YQMultiLineEdit( YWidget * parent, const string & label ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YMultiLineEdit( parent, label ) +{ + setWidgetRep( this ); + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_textEdit = new QTextEdit( this ); + YUI_CHECK_NEW( _qt_textEdit ); + + _qt_textEdit->setTextFormat( Qt::PlainText ); + _qt_textEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); + + _caption->setBuddy( _qt_textEdit ); + + connect( _qt_textEdit, SIGNAL( textChanged( void ) ), + this, SLOT ( changed ( void ) ) ); +} + + +YQMultiLineEdit::~YQMultiLineEdit() +{ + // NOP +} + + +string YQMultiLineEdit::value() +{ + return toUTF8( _qt_textEdit->text() ); +} + + +void YQMultiLineEdit::setValue( const string & text ) +{ + YQSignalBlocker sigBlocker( _qt_textEdit ); + + _qt_textEdit->setText( fromUTF8( text ) ); +} + + +void YQMultiLineEdit::setLabel( const string & label ) +{ + _caption->setText( label ); + YMultiLineEdit::setLabel( label ); +} + + +void YQMultiLineEdit::setInputMaxLength( int newMaxLength ) +{ + YMultiLineEdit::setInputMaxLength( newMaxLength ); + + QString text = _qt_textEdit->text(); + + if ( (int) text.length() > inputMaxLength() ) + { + text.truncate( inputMaxLength() ); + _qt_textEdit->setText(text); + } +} + + +void YQMultiLineEdit::enforceMaxInputLength() +{ + if ( inputMaxLength() >= 0 && _qt_textEdit->length() > inputMaxLength() ) + { + int index; + int para; + + _qt_textEdit->getCursorPosition( ¶, &index); + + QString text = _qt_textEdit->text(); + + int pos = 0; // current positon in text + int section =0; // section in text; + // iterate over the string + + while ( pos != (int) text.length()+1 ) + { + // we reached the paragraph where the user entered + // a character + if ( section == para ) + { + // remove that character + text.remove( pos+index-1, 1 ); + break; + } + + // new paragraph begins + if ( text[pos] == '\n' ) + section++; + + pos++; + } + + _qt_textEdit->setText( text ); + + // user removed a paragraph + if ( index == 0 ) + { + --para; + // the new index is the end of the previous paragraph + index = _qt_textEdit->paragraphLength(para) + 1; + } + + // adjust to new cursor position before the removed character + _qt_textEdit->setCursorPosition( para, index-1 ); + } +} + + +void YQMultiLineEdit::changed() +{ + enforceMaxInputLength(); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +void YQMultiLineEdit::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_textEdit->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQMultiLineEdit::preferredWidth() +{ + return max( 30, sizeHint().width() ); +} + + +int YQMultiLineEdit::preferredHeight() +{ + int hintHeight = defaultVisibleLines() * _qt_textEdit->fontMetrics().lineSpacing(); + hintHeight += _qt_textEdit->frameWidth() * 2 + YQWidgetMargin * 2; + + if ( _caption->isShown() ) + hintHeight += _caption->sizeHint().height() + YQWidgetSpacing; + + return max( 10, hintHeight ); +} + + +void YQMultiLineEdit::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool YQMultiLineEdit::setKeyboardFocus() +{ + _qt_textEdit->setFocus(); + + return true; +} + + +#include "YQMultiLineEdit.moc" + diff --git a/src/YQMultiLineEdit.h b/src/YQMultiLineEdit.h new file mode 100644 index 0000000..72d0890 --- /dev/null +++ b/src/YQMultiLineEdit.h @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMultiLineEdit.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQMultiLineEdit_h +#define YQMultiLineEdit_h + +#include +#include "YMultiLineEdit.h" + +class YQWidgetCaption; +class QTextEdit; + + +/** + * MultiLineEdit - an input area for multi-line text. + **/ +class YQMultiLineEdit : public QVBox, public YMultiLineEdit +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQMultiLineEdit( YWidget * parent, const string & label ); + + /** + * Destructor. + **/ + virtual ~YQMultiLineEdit(); + + /** + * Get the current value (the text entered by the user or set from the + * outside) of this MultiLineEdit. + * + * Implemented from YMultiLineEdit. + **/ + virtual string value(); + + /** + * Set the current value (the text entered by the user or set from the + * outside) of this MultiLineEdit. + * + * Implemented from YMultiLineEdit. + **/ + virtual void setValue( const string & text ); + + /** + * Set the label (the caption above the MultiLineEdit). + * + * Reimplemented from YMultiLineEdit. + **/ + virtual void setLabel( const string & label ); + + /** + * Set the maximum input length, i.e., the maximum number of characters the + * user can enter. -1 means no limit. + * + * Reimplemented from YMultiLineEdit. + **/ + virtual void setInputMaxLength( int numberOfChars ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +protected slots: + + /** + * Triggered when the text changes. + **/ + void changed(); + + /** + * Enforce the maximum input length: If the text becomes too long, remove + * the just-entered character at the current cursor position. + * + * Note that this is a lot more user friendly than silently truncating at + * the end of the text: In the latter case, chances are that the user never + * gets to know that text was truncated. Removing the just-typed character + * OTOH is something he will notice very quickly. + **/ + void enforceMaxInputLength(); + + +protected: + + YQWidgetCaption * _caption; + QTextEdit * _qt_textEdit; +}; + + +#endif // YQMultiLineEdit_h diff --git a/src/YQMultiProgressMeter.cc b/src/YQMultiProgressMeter.cc new file mode 100644 index 0000000..ce144e8 --- /dev/null +++ b/src/YQMultiProgressMeter.cc @@ -0,0 +1,419 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMultiProgressMeter.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include + +#include "YQUI.h" +#include "YQMultiProgressMeter.h" + + + +YQMultiProgressMeter::YQMultiProgressMeter( YWidget * parent, + YUIDimension dim, + const vector & maxValues ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YMultiProgressMeter( parent, dim, maxValues ) +{ + _triangularShaped = false; + init(); + setWidgetRep( this ); +} + + +YQMultiProgressMeter::~YQMultiProgressMeter() +{ + // NOP +} + + +void YQMultiProgressMeter::init() +{ + _margin = 2; + _segmentMinLength = 12; + _triSpacing = 1; + + if ( triangularShaped() ) + { + _spacing = 0; + setTriThickness( -1 ); + } + else + { + _spacing = 2; + setTriThickness( 4 ); + } +} + + +void YQMultiProgressMeter::setTriangularShaped( bool triangular ) +{ + _triangularShaped = triangular; + init(); +} + + +void YQMultiProgressMeter::doUpdate() +{ + QWidget::update(); +} + + +void YQMultiProgressMeter::paintEvent ( QPaintEvent * event ) +{ + if ( ! event ) + return; + + QPainter painter( this ); + + if ( ! event->erased() ) + painter.eraseRect( event->rect() ); + + int totalLength = horizontal() ? width() : height(); + int thickness = horizontal() ? height() : width(); + + totalLength -= 2 * margin() + spacing() * ( segments()-1 ); + thickness -= 2 * margin(); + + if ( triThickness() > 0 ) + thickness -= 2 * triThickness() + 2 * triSpacing(); + + if ( totalLength < 1 || thickness < 1 || segments() < 1 ) + return; + + + // Add up the total sum of all maxValues + + float totalSum = 0.0; + + for( int i=0; i < segments(); i++ ) + totalSum += maxValue( i ); + + + // Figure out minimal segment length + + int minLength = segmentMinLength(); + + + // Limit the minimum if there isn't even that much space + + if ( minLength * segments() > totalLength ) + minLength = totalLength / ( 2 * segments() ); + + + // First attempt of scaling factor from values to pixel coordinates + + if ( totalSum == 0.0 ) + { + y2error( "Avoiding division by zero: totalSum" ); + return; + } + + float scale = ( (float) totalLength ) / totalSum; + float scaledMinLength = ( (float) minLength ) / scale; + + + // Check how many segments would become smaller than the minimum + + int smallSegmentsCount = 0; + float restSum = 0.0; + + for ( int i=0; i < segments(); i++ ) + { + if ( maxValue( i ) < scaledMinLength ) + smallSegmentsCount++; + else + restSum += maxValue( i ); + } + + + // Small segments that get at least minLength pixels consume more screen + // space than initially planned, so recompute what is left for the others + + int distributableLength = totalLength - smallSegmentsCount * minLength; + + if ( restSum == 0.0 ) + { + y2error( "Avoiding division by zero: restSum" ); + return; + } + + // Recompute scale to take small segments into account that now get screen + // space disproportional to their real size (maxValue). + scale = ( (float) distributableLength ) / ( restSum ); + + + // Calculate indentation + + int indent = triangularShaped() ? (int) ( thickness * 0.37 ) : 0; + + + // Set up painter + + if ( vertical() ) + { + painter.rotate( 90 ); + painter.scale( 1.0, -1.0 ); + } + + int offset = margin(); + + // Draw each segment in turn + + for ( int i=0; i < segments(); i++ ) + { + int length; + + if ( maxValue( i ) < scaledMinLength ) + length = minLength; + else + length = (int) ( maxValue( i ) * scale + 0.5 ); + + drawSegment( i, painter, offset, length, thickness, indent ); + + if ( i > 0 ) + drawMarkers( painter, offset, thickness ); + + offset += length + spacing(); + } +} + + +void YQMultiProgressMeter::mouseDoubleClickEvent ( QMouseEvent * event ) +{ + if ( event && event->button() == Qt::RightButton ) + { + // Easter egg: Switch between rectangular and triangular shape + + y2milestone( "Switching shape" ); + setTriangularShaped( ! triangularShaped() ); + setSize( vertical() ? preferredWidth() : width(), + horizontal() ? preferredHeight() : height() ); + YQUI::ui()->evaluateRecalcLayout(); + QWidget::update(); + } +} + + +void YQMultiProgressMeter::drawSegment( int segment, + QPainter & painter, + int offset, + int length, + int thickness, + int indent ) +{ + // + // Fill segment + // + // Vertical MultiProgressMeters will be filled thermometer-like from bottom + // to top, horizontal ones like normal progress bars from left to right, + // i.e. just the opposite way. + // + + int fillStart = 0; + int fillHeight = 0; + int border = margin(); + + if ( triThickness() > 0 ) + border += triThickness() + triSpacing(); + + if ( currentValue( segment ) < maxValue( segment ) ) + { + if ( maxValue( segment ) == 0.0 ) + { + y2error( "Avoiding division by zero: maxValue[%d]", segment ); + return; + } + + float emptyPart = 1.0 - ( currentValue( segment ) ) / ( maxValue( segment ) ); + fillStart = (int) ( length * emptyPart ); + fillHeight = (int) ( indent * emptyPart ); + } + + thickness--; // We always deal with tickness-1 anyway, so let's cut this short + + if ( vertical() ) // fill thermometer-like from bottom to top + { + if ( fillStart < length ) + { + QPointArray points( 4 ); + int p=0; + + points.setPoint( p++, offset + fillStart, border + fillHeight ); + points.setPoint( p++, offset + fillStart, border + thickness - fillHeight ); + points.setPoint( p++, offset + length, border + thickness - indent ); + points.setPoint( p++, offset + length, border + indent ); + + painter.setBrush( palette().active().highlight() ); + painter.setPen( NoPen ); + painter.drawConvexPolygon( points ); + } + } + else // horizontal - fill from left to right like a normal progress bar + { + if ( fillStart > 0 ) + { + QPointArray points( 4 ); + int p=0; + + points.setPoint( p++, offset, border + thickness ); + points.setPoint( p++, offset, border ); + points.setPoint( p++, offset + fillStart, border + fillHeight ); + points.setPoint( p++, offset + fillStart, border + thickness - fillHeight ); + + painter.setBrush( palette().active().highlight() ); + painter.setPen( NoPen ); + painter.drawConvexPolygon( points ); + } + } + + + // + // Draw outline + // + + const QColor & dark = palette().active().dark(); + const QColor & light = palette().active().light(); + + // Draw arrow base (left) + + painter.setPen( dark ); + painter.setPen( SolidLine ); + painter.drawLine( offset, border, + offset, border + thickness ); + + + // Draw upper outline + + painter.drawLine( offset, border, + offset + length - 1, border + indent ); + + // Draw arrow point (right) + + painter.setPen( light ); + painter.drawLine( offset + length - 1, border + indent, + offset + length - 1, border + thickness - indent ); + + // Draw lower outline + + painter.drawLine( offset, border + thickness, + offset + length - 1, border + thickness - indent ); + +} + + +void YQMultiProgressMeter::drawMarkers( QPainter & painter, int offset, int thickness ) +{ + if ( triThickness() < 1 ) + return; + + offset -= spacing() / 2 + 1; // integer division rounds down! + + const QColor & color = palette().active().foreground(); + painter.setPen( color ); + painter.setPen( SolidLine ); + painter.setBrush( color ); + // painter.setBrush( NoBrush ); + + + // Draw upper marker triangle + + int tri = triThickness(); + QPointArray points( 3 ); + + int p=0; + points.setPoint( p++, offset - tri+1, margin() ); // top left (base) + points.setPoint( p++, offset, margin() + tri-1 ); // lower center (point) + points.setPoint( p++, offset + tri-1, margin() ); // top right (base) + + painter.drawConvexPolygon( points ); + + + // Draw lower marker triangle + + int pointOffset = margin() + tri + thickness + 2 * triSpacing(); + + p=0; + points.setPoint( p++, offset, pointOffset ); // top center (point) + points.setPoint( p++, offset + tri-1, pointOffset + tri-1 ); // top right (base) + points.setPoint( p++, offset - tri+1, pointOffset + tri-1 ); // bottom left (base) + + painter.drawConvexPolygon( points ); +} + + +int YQMultiProgressMeter::thickness() +{ + int thickness = triangularShaped() ? 35 : 23; + thickness += 2 * margin(); + + if ( triThickness() > 0 ) + thickness += 2 * triThickness() + 2 * triSpacing(); + + return thickness; +} + + +int YQMultiProgressMeter::length() +{ + int length = 70 * segments() + 2 * margin(); + + return length; +} + + +void YQMultiProgressMeter::setTriThickness( int value ) +{ + _triThickness = value; + + if ( _triThickness < 1 ) + setTriSpacing( 0 ); +} + + +void YQMultiProgressMeter::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + QWidget::update(); + YWidget::setEnabled( enabled ); +} + + +int YQMultiProgressMeter::preferredWidth() +{ + return horizontal() ? length() : thickness(); +} + + +int YQMultiProgressMeter::preferredHeight() +{ + return horizontal() ? thickness() : length(); +} + + +void YQMultiProgressMeter::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + doUpdate(); +} + + +#include "YQMultiProgressMeter.moc" diff --git a/src/YQMultiProgressMeter.h b/src/YQMultiProgressMeter.h new file mode 100644 index 0000000..89629cd --- /dev/null +++ b/src/YQMultiProgressMeter.h @@ -0,0 +1,220 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMultiProgressMeter.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQMultiProgressMeter_h +#define YQMultiProgressMeter_h + + +#include "YMultiProgressMeter.h" +#include +#include + + +class QPaintEvent; +class QMouseEvent; + + +class YQMultiProgressMeter : public QWidget, public YMultiProgressMeter +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQMultiProgressMeter( YWidget * parent, + YUIDimension dim, + const vector & maxValues ); + /** + * Destructor. + **/ + virtual ~YQMultiProgressMeter(); + + /** + * Overall thickness (in pixels) of the MultiProgressMeter. + **/ + int thickness(); + + /** + * Overall length (in pixels) of the MultiProgressMeter. + **/ + int length(); + + /** + * Returns the margin around the widget contents. + **/ + int margin() const { return _margin; } + + /** + * Sets the margin around the widget contents. + * Does not trigger an update. + **/ + void setMargin( int value ) { _margin = value; } + + /** + * Returns the spacing between segments in pixels. + **/ + int spacing() const { return _spacing; } + + /** + * Sets the spacing between segments in pixels. + * Does not trigger an update. + **/ + void setSpacing( int value ) { _spacing = value; } + + /** + * Returns the minimal length of a segment in pixels. + **/ + int segmentMinLength() const { return _segmentMinLength; } + + /** + * Set the minimal length of a segment in pixels. + **/ + void setSegmentMinLength( int val ) { _segmentMinLength = val; } + + /** + * Returns the thickness (base to point) of the small triangles next to the + * spacing between individual segments. The base length of those small + * triangles is double this value minus one. A value <1 indicates no + * such triangles will be drawn. + **/ + int triThickness() const { return _triThickness; } + + /** + * Set the thickness (base to point) of the small triangles next to the + * spacing between individual segments. The base length of those small + * triangles is double this value minus one. + * + * Use -1 to switch off those triangles - in which case triSpacing (see + * below) will be set to 0. + * + * This call does not trigger a screen update. + **/ + void setTriThickness( int value ); + + /** + * Returns the spacing between the segment indicators and the small + * triangles next to the spacing between segments. + **/ + int triSpacing() const { return _triSpacing; } + + /** + * Sets the spacing between the segment indicators and the small + * triangles next to the spacing between segments. + **/ + void setTriSpacing( int value ) { _triSpacing = value; } + + /** + * Returns "true" if the segments of this widget are triangular shaped. + **/ + bool triangularShaped() const { return _triangularShaped; } + + /** + * Set triangular shape (true) or normal rectangular shape. + * This call does not trigger a screen update. + **/ + void setTriangularShaped( bool triangular = true ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + +protected: + + /** + * Common initialization + **/ + void init(); + + /** + * Perform a visual update on the screen. + * Reimplemented from YMultiProgressMeter. + **/ + virtual void doUpdate(); + + /** + * Paint the widget's contents. + * Reimplemented from QWidget. + **/ + virtual void paintEvent ( QPaintEvent * ); + + /** + * Mouse double click - + * + * reimplemented from QWidget. + **/ + virtual void mouseDoubleClickEvent ( QMouseEvent * e ); + + /** + * Draw segment number 'segment' with pixel length 'length' from pixel + * coordinate 'offset' on and fill it according to that segment's current + * value. 'painter' is set up previously to take rotating into account + * (horizontal / vertical). + **/ + void drawSegment( int segment, + QPainter & painter, + int offset, + int length, + int thickness, + int indent ); + + /** + * Draw markers between segments (or beside that spacing). + **/ + void drawMarkers( QPainter & painter, int offset, int thickness ); + + +private: + + bool _triangularShaped; + int _margin; + int _spacing; + int _segmentMinLength; + int _triThickness; + int _triSpacing; +}; + + +#endif // YQMultiProgressMeter_h diff --git a/src/YQMultiSelectionBox.cc b/src/YQMultiSelectionBox.cc new file mode 100644 index 0000000..9913921 --- /dev/null +++ b/src/YQMultiSelectionBox.cc @@ -0,0 +1,358 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMultiSelectionBox.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#include +#define y2log_component "qt-ui" +#include + +using std::max; + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQMultiSelectionBox.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + +#define DEFAULT_VISIBLE_LINES 5 +#define SHRINKABLE_VISIBLE_LINES 2 + + +YQMultiSelectionBox::YQMultiSelectionBox( YWidget * parent, + const string & label ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YMultiSelectionBox( parent, label ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_listView = new QListView( this ); + YUI_CHECK_NEW( _qt_listView ); + + _qt_listView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); + _qt_listView->addColumn( "" ); // QListView doesn't have one single column by default! + _qt_listView->setSorting( 0, false ); + _qt_listView->header()->setStretchEnabled( true ); + _qt_listView->header()->hide(); + _caption->setBuddy( _qt_listView ); + + // Very small default size if specified + + connect( _qt_listView, SIGNAL( selectionChanged() ), + this, SLOT ( slotSelected() ) ); + + connect( this, SIGNAL( valueChanged() ), + this, SLOT ( slotValueChanged() ) ); +} + + +YQMultiSelectionBox::~YQMultiSelectionBox() +{ + // NOP +} + + +void +YQMultiSelectionBox::setLabel( const string & label ) +{ + _caption->setText( label ); + YMultiSelectionBox::setLabel( label ); +} + + +void +YQMultiSelectionBox::addItem( YItem * yItem ) +{ + YQSignalBlocker sigBlocker( _qt_listView ); + YMultiSelectionBox::addItem( yItem ); // will also check for NULL + + YQMultiSelectionBoxItem * msbItem = + new YQMultiSelectionBoxItem( this, _qt_listView, yItem ); + + YUI_CHECK_NEW( msbItem ); + + // Take care of the item's check box + + if ( yItem->selected() ) + msbItem->setOn( true ); + + + // Take care of the QListView's keyboard focus + + if ( ! _qt_listView->selectedItem() ) + _qt_listView->setSelected( msbItem, true ); +} + + +void YQMultiSelectionBox::selectItem( YItem * yItem, bool selected ) +{ + YMultiSelectionBox::selectItem( yItem, selected ); + YQMultiSelectionBoxItem * msbItem = findItem( yItem ); + + if ( msbItem ) + msbItem->setOn( selected ); +} + + +void +YQMultiSelectionBox::deselectAllItems() +{ + YQSignalBlocker sigBlocker( _qt_listView ); + YMultiSelectionBox::deselectAllItems(); + + QListViewItemIterator it( _qt_listView ); + + while ( *it ) + { + YQMultiSelectionBoxItem * item = dynamic_cast (*it); + + if ( item ) + item->setOn( false ); + + ++it; + } +} + + +void +YQMultiSelectionBox::deleteAllItems() +{ + YQSignalBlocker sigBlocker( _qt_listView ); + + YMultiSelectionBox::deleteAllItems(); + _qt_listView->clear(); +} + + +YItem * +YQMultiSelectionBox::currentItem() +{ + // QListView::currentItem() is very similar, but not exactly the same as + // QListView::selectedItem(), and it is NOT to be confused with an item's + // "selected" state in a YQMultiSelectionBox (the item's check box): + // + // QListView::currentItem() is the item that currently has the keyboard + // focus. By default, it is displayed with a faint dotted outline. + // + // QListView::selectedItem() is the item that is selected in the QListView + // widget. It is displayed a very visible with inverted colors (typically + // blue backround). If there is a selected item, it is also the current + // item. if there is no selected item, there might still be a current item, + // though. + // + // The Y(Q)MultiSelectionBox item's "selected" state is completely + // independent of all this: It only depends on the item's check + // box. QListView::selectedItem() and QListView::currentItem() are just + // mechanisms for keyboard navigation to show the user which item's check + // box will be toggled when he hits the space bar. + // + // For the purpose of this function, QListView::currentItem() is the + // minimum requirement. + + QListViewItem * currentQItem = _qt_listView->currentItem(); + + if ( currentQItem ) + { + YQMultiSelectionBoxItem * item = dynamic_cast (currentQItem); + + if ( item ) + return item->yItem(); + } + + return 0; +} + + +void +YQMultiSelectionBox::setCurrentItem( YItem * yItem ) +{ + // See also explanations about QListView::currentItem() vs. + // QListView::selectedItem() above + // + // This function uses QListView::selectedItem() for better visibility. + // This implicitly also changes QListView::currentItem(). + + YQSignalBlocker sigBlocker( _qt_listView ); + + if ( ! yItem ) + { + _qt_listView->clearSelection(); + } + else + { + YQMultiSelectionBoxItem * msbItem = findItem( yItem ); + + if ( msbItem ) + _qt_listView->setSelected( msbItem, true ); + + // This does NOT change the item's check box! + // (see explanations in YQMultiSelectionBox::currentItem() avove) + } +} + + +void +YQMultiSelectionBox::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_listView->setEnabled( enabled ); + _qt_listView->triggerUpdate(); + YWidget::setEnabled( enabled ); +} + + +int YQMultiSelectionBox::preferredWidth() +{ + int hintWidth = _caption->isShown() ? + _caption->sizeHint().width() + frameWidth() : 0; + + return max( 80, hintWidth ); +} + + +int YQMultiSelectionBox::preferredHeight() +{ + int hintHeight = _caption->isShown() ? _caption->sizeHint().height() : 0; + int visibleLines = shrinkable() ? SHRINKABLE_VISIBLE_LINES : DEFAULT_VISIBLE_LINES; + hintHeight += visibleLines * _qt_listView->fontMetrics().lineSpacing(); + hintHeight += _qt_listView->frameWidth() * 2; + + return max( 80, hintHeight ); +} + + +void +YQMultiSelectionBox::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool +YQMultiSelectionBox::setKeyboardFocus() +{ + _qt_listView->setFocus(); + + return true; +} + + +void +YQMultiSelectionBox::slotSelected() +{ + if ( notify() ) + { + if ( ! YQUI::ui()->eventPendingFor( this ) ) + { + // Avoid overwriting a (more important) ValueChanged event with a SelectionChanged event + + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) ); + } + } +} + + +void +YQMultiSelectionBox::slotValueChanged() +{ + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +void +YQMultiSelectionBox::sendValueChanged() +{ + emit valueChanged(); +} + + +YQMultiSelectionBoxItem * +YQMultiSelectionBox::findItem( YItem * wantedItem ) +{ + // FIXME: Don't search through all items, use the YItem::data() pointer instead + + QListViewItemIterator it( _qt_listView ); + + while ( *it ) + { + YQMultiSelectionBoxItem * item = dynamic_cast (*it); + + if ( item && item->yItem() == wantedItem ) + return item; + + ++it; + } + + return 0; +} + + + + + +int YQMultiSelectionBoxItem::_item_count = 0; + + + +YQMultiSelectionBoxItem::YQMultiSelectionBoxItem( YQMultiSelectionBox * parent, + QListView * listView, + YItem * yItem ) + : QCheckListItem( listView, fromUTF8( yItem->label() ), QCheckListItem::CheckBox ) + , _yItem( yItem ) + , _multiSelectionBox( parent ) +{ + YUI_CHECK_PTR( yItem ); + + _serial = _item_count++; +} + + +void +YQMultiSelectionBoxItem::stateChange( bool newState ) +{ + _yItem->setSelected( newState ); + _multiSelectionBox->sendValueChanged(); + QCheckListItem::stateChange( newState ); +} + + +QString +YQMultiSelectionBoxItem::key( int, bool ) const +{ + /* + * Return a sort key that depends on creation (i.e. insertion) order. + */ + + static QString sortKey; + sortKey.sprintf( "%010d", INT_MAX - _serial ); + + return sortKey; +} + + +#include "YQMultiSelectionBox.moc" diff --git a/src/YQMultiSelectionBox.h b/src/YQMultiSelectionBox.h new file mode 100644 index 0000000..4505ade --- /dev/null +++ b/src/YQMultiSelectionBox.h @@ -0,0 +1,225 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQMultiSelectionBox.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQMultiSelectionBox_h +#define YQMultiSelectionBox_h + +#include +#include + +#include "YMultiSelectionBox.h" + +class YQWidgetCaption; +class YQMultiSelectionBoxItem; + + +class YQMultiSelectionBox : public QVBox, public YMultiSelectionBox +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQMultiSelectionBox( YWidget * parent, const string & label ); + + /** + * Destructor. + **/ + ~YQMultiSelectionBox(); + + /** + * Change the label text. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void setLabel( const string & label ); + + /** + * Add an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void addItem( YItem * item ); + + /** + * Select or deselect an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void selectItem( YItem * item, bool selected = true ); + + /** + * Deselect all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deselectAllItems(); + + /** + * Delete all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deleteAllItems(); + + /** + * Return the the item that currently has the keyboard focus + * or 0 if no item currently has the keyboard focus. + * + * Reimplemented from YMultiSelectionBox. + **/ + virtual YItem * currentItem(); + + /** + * Set the keyboard focus to the specified item. + * 0 means clear the keyboard focus. + * + * Reimplemented from YMultiSelectionBox. + **/ + virtual void setCurrentItem( YItem * item ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + /** + * Sends a ValueChanged signal. + **/ + void sendValueChanged(); + + +signals: + /** + * Emitted upon when an item changes its state. + **/ + void valueChanged(); + + +protected slots: + /** + * Send SelectionChanged event if `opt(`notify) is set. + **/ + void slotSelected(); + + /** + * Send ValueChanged event if `opt(`notify) is set. + **/ + void slotValueChanged(); + + +protected: + /** + * Find the counterpart of 'item'. Return 0 if there is none. + **/ + YQMultiSelectionBoxItem * findItem( YItem * item ); + + + YQWidgetCaption * _caption; + QListView * _qt_listView; +}; + + + +class YQMultiSelectionBoxItem: public QCheckListItem +{ +public: + /** + * Constructor. + **/ + YQMultiSelectionBoxItem( YQMultiSelectionBox * parent, + QListView * listView, + YItem * yItem ); + + /** + * Destructor. + **/ + virtual ~YQMultiSelectionBoxItem() {} + + /** + * Return the corresponding YItem. + **/ + YItem * yItem() const { return _yItem; } + + +protected: + + /** + * Called when the on/off state changes. + * Triggers a 'valueChanged' event in the associated YQMultiSelectionBox. + * + * Reimplemented from QChecklistItem. + **/ + void stateChange( bool newState ); + + /** + * Returns the sort key for any column. + * In this case, maintain item creation order. + * + * Reimplemented from QListViewItem. + **/ + virtual QString key ( int column, + bool ascending ) const; + + // + // Data members + // + + YItem * _yItem; + int _serial; + YQMultiSelectionBox * _multiSelectionBox; + + + /** + * The next serial number to use + **/ + static int _item_count; +}; + +#endif // YQLabel_h diff --git a/src/YQOptionalWidgetFactory.cc b/src/YQOptionalWidgetFactory.cc new file mode 100644 index 0000000..59e93a4 --- /dev/null +++ b/src/YQOptionalWidgetFactory.cc @@ -0,0 +1,259 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQOptionalWidgetFactory.cc + + Author: Stefan Hundhammer + +/-*/ + +#include "YQOptionalWidgetFactory.h" +#include "YQUI.h" +#include "YUIException.h" +#include "YQPackageSelectorPlugin.h" + + +#define THROW_UNSUPPORTED( WIDGET_TYPE ) \ + YUI_THROW( YUIUnsupportedWidgetException( WIDGET_TYPE ) ); \ + return 0 + + + +YQOptionalWidgetFactory::YQOptionalWidgetFactory() + : YOptionalWidgetFactory() +{ + // NOP +} + +YQOptionalWidgetFactory::~YQOptionalWidgetFactory() +{ + // NOP +} + + + +bool YQOptionalWidgetFactory::hasWizard() +{ + return true; +} + +YQWizard * +YQOptionalWidgetFactory::createWizard( YWidget * parent, + YWidgetID * backButtonId, const string & backButtonLabel, + YWidgetID * abortButtonId, const string & abortButtonLabel, + YWidgetID * nextButtonId, const string & nextButtonLabel, + YWizardMode wizardMode ) +{ + YQWizard * wizard = new YQWizard( parent, + backButtonId, backButtonLabel, + abortButtonId, abortButtonLabel, + nextButtonId, nextButtonLabel, + wizardMode ); + YUI_CHECK_NEW( wizard ); + + return wizard; +} + + + +bool YQOptionalWidgetFactory::hasDumbTab() +{ + return true; +} + +YQDumbTab * +YQOptionalWidgetFactory::createDumbTab( YWidget * parent ) +{ + YQDumbTab * dumbTab = new YQDumbTab( parent ); + YUI_CHECK_NEW( dumbTab ); + + return dumbTab; +} + + + +bool YQOptionalWidgetFactory::hasSlider() +{ + return true; +} + +YQSlider * +YQOptionalWidgetFactory::createSlider( YWidget * parent, + const string & label, + int minVal, + int maxVal, + int initialVal ) +{ + YQSlider * slider = new YQSlider( parent, label, minVal, maxVal, initialVal ); + YUI_CHECK_NEW( slider ); + + return slider; +} + + + +bool YQOptionalWidgetFactory::hasDateField() +{ + return true; +} + +YQDateField * +YQOptionalWidgetFactory::createDateField( YWidget * parent, const string & label ) +{ + YQDateField * dateField = new YQDateField( parent, label ); + YUI_CHECK_NEW( dateField ); + + return dateField; +} + + + +bool YQOptionalWidgetFactory::hasTimeField() +{ + return true; +} + +YQTimeField * +YQOptionalWidgetFactory::createTimeField( YWidget * parent, const string & label ) +{ + YQTimeField * timeField = new YQTimeField( parent, label ); + YUI_CHECK_NEW( timeField ); + + return timeField; +} + + + +bool YQOptionalWidgetFactory::hasBarGraph() +{ + return true; +} + +YQBarGraph * +YQOptionalWidgetFactory::createBarGraph( YWidget * parent ) +{ + YQBarGraph * barGraph = new YQBarGraph( parent ); + YUI_CHECK_NEW( barGraph ); + + return barGraph; +} + + + +bool YQOptionalWidgetFactory::hasPatternSelector() +{ + return true; +} + +YQPatternSelector * +YQOptionalWidgetFactory::createPatternSelector( YWidget * parent, long modeFlags ) +{ + YQPackageSelectorPlugin * plugin = YQUI::ui()->packageSelectorPlugin(); + + if ( plugin ) + return plugin->createPatternSelector( parent, modeFlags ); + else + return 0; +} + + + +bool YQOptionalWidgetFactory::hasSimplePatchSelector() +{ + return true; +} + +YQSimplePatchSelector * +YQOptionalWidgetFactory::createSimplePatchSelector( YWidget * parent, long modeFlags ) +{ + YQPackageSelectorPlugin * plugin = YQUI::ui()->packageSelectorPlugin(); + + if ( plugin ) + return plugin->createSimplePatchSelector( parent, modeFlags ); + else + return 0; +} + + + +bool YQOptionalWidgetFactory::hasMultiProgressMeter() +{ + return true; +} + +YQMultiProgressMeter * +YQOptionalWidgetFactory::createMultiProgressMeter( YWidget * parent, YUIDimension dim, const vector & maxValues ) +{ + YQMultiProgressMeter * multiProgressMeter = new YQMultiProgressMeter( parent, dim, maxValues ); + YUI_CHECK_NEW( multiProgressMeter ); + + return multiProgressMeter; +} + + + +bool YQOptionalWidgetFactory::hasPartitionSplitter() +{ + return true; +} + +YQPartitionSplitter * +YQOptionalWidgetFactory::createPartitionSplitter( YWidget * parent, + int usedSize, + int totalFreeSize, + int newPartSize, + int minNewPartSize, + int minFreeSize, + const string & usedLabel, + const string & freeLabel, + const string & newPartLabel, + const string & freeFieldLabel, + const string & newPartFieldLabel ) +{ + YQPartitionSplitter * partitionSplitter = new YQPartitionSplitter( parent, + usedSize, + totalFreeSize, + newPartSize, + minNewPartSize, + minFreeSize, + usedLabel, + freeLabel, + newPartLabel, + freeFieldLabel, + newPartFieldLabel ); + YUI_CHECK_NEW( partitionSplitter ); + + return partitionSplitter; +} + + + +bool YQOptionalWidgetFactory::hasDownloadProgress() +{ + return true; +} + +YQDownloadProgress * +YQOptionalWidgetFactory::createDownloadProgress( YWidget * parent, + const string & label, + const string & filename, + YFileSize_t expectedSize ) +{ + YQDownloadProgress * downloadProgress = new YQDownloadProgress( parent, + label, + filename, + expectedSize ); + YUI_CHECK_NEW( downloadProgress ); + + return downloadProgress; +} + diff --git a/src/YQOptionalWidgetFactory.h b/src/YQOptionalWidgetFactory.h new file mode 100644 index 0000000..646a979 --- /dev/null +++ b/src/YQOptionalWidgetFactory.h @@ -0,0 +1,132 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQOptionalWidgetFactory.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQOptionalWidgetFactory_h +#define YQOptionalWidgetFactory_h + + +#include "YOptionalWidgetFactory.h" + +#include "YQBarGraph.h" +#include "YQDateField.h" +#include "YQDownloadProgress.h" +#include "YQDumbTab.h" +#include "YQMultiProgressMeter.h" +#include "YQPartitionSplitter.h" +#include "YQPatternSelector.h" +#include "YQSimplePatchSelector.h" +#include "YQSlider.h" +#include "YQTimeField.h" +#include "YQWizard.h" + +using std::string; +using std::vector; + + + +/** + * Widget factory for optional ("special") widgets. + * + * Remember to always check with the corresponding "has..()" method if the + * current UI actually provides the requested widget. Otherwise the + * "create...()" method will throw an exception. + **/ +class YQOptionalWidgetFactory: public YOptionalWidgetFactory +{ +public: + + // + // Optional Widgets + // + + + virtual bool hasWizard(); + virtual YQWizard * createWizard ( YWidget * parent, + YWidgetID * backButtonId, const string & backButtonLabel, + YWidgetID * abortButtonId, const string & abortButtonLabel, + YWidgetID * nextButtonId, const string & nextButtonLabel, + YWizardMode wizardMode = YWizardMode_Standard ); + + virtual bool hasDumbTab(); + virtual YQDumbTab * createDumbTab ( YWidget * parent ); + + virtual bool hasSlider(); + virtual YQSlider * createSlider ( YWidget * parent, + const string & label, + int minVal, + int maxVal, + int initialVal ); + + virtual bool hasDateField(); + virtual YQDateField * createDateField ( YWidget * parent, const string & label ); + + virtual bool hasTimeField(); + virtual YQTimeField * createTimeField ( YWidget * parent, const string & label ); + + virtual bool hasBarGraph(); + virtual YQBarGraph * createBarGraph ( YWidget * parent ); + + virtual bool hasPatternSelector(); + virtual YQPatternSelector * createPatternSelector ( YWidget * parent, long modeFlags = 0 ); + + virtual bool hasSimplePatchSelector(); + virtual YQSimplePatchSelector * createSimplePatchSelector( YWidget * parent, long modeFlags = 0 ); + + virtual bool hasMultiProgressMeter(); + virtual YQMultiProgressMeter * createMultiProgressMeter( YWidget * parent, YUIDimension dim, const vector & maxValues ); + + virtual bool hasPartitionSplitter(); + virtual YQPartitionSplitter * createPartitionSplitter ( YWidget * parent, + int usedSize, + int totalFreeSize, + int newPartSize, + int minNewPartSize, + int minFreeSize, + const string & usedLabel, + const string & freeLabel, + const string & newPartLabel, + const string & freeFieldLabel, + const string & newPartFieldLabel ); + + virtual bool hasDownloadProgress(); + virtual YQDownloadProgress * createDownloadProgress ( YWidget * parent, + const string & label, + const string & filename, + YFileSize_t expectedFileSize ); + +protected: + + friend class YQUI; + + /** + * Constructor. + * + * Use YUI::optionalWidgetFactory() to get the singleton for this class. + **/ + YQOptionalWidgetFactory(); + + /** + * Destructor. + **/ + virtual ~YQOptionalWidgetFactory(); + +}; // class YQOptionalWidgetFactory + + + +#endif // YQOptionalWidgetFactory_h diff --git a/src/YQPackageSelectorPlugin.cc b/src/YQPackageSelectorPlugin.cc new file mode 100644 index 0000000..5d01170 --- /dev/null +++ b/src/YQPackageSelectorPlugin.cc @@ -0,0 +1,136 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (c) SuSE Linux AG | +\----------------------------------------------------------------------/ + + File: YQPackageSelectorPlugin.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include "YQPackageSelectorPlugin.h" +#define y2log_component "qt-ui" +#include +#include "YQPackageSelector.h" +#include "YQPatternSelector.h" +#include "YQSimplePatchSelector.h" +#include "YUIException.h" + +#define PLUGIN_BASE_NAME "qt_pkg" + + +YQPackageSelectorPlugin::YQPackageSelectorPlugin() + : YPackageSelectorPlugin( PLUGIN_BASE_NAME ) +{ + if ( success() ) + { + y2milestone( "Loaded %s plugin successfully from %s", + PLUGIN_BASE_NAME, pluginLibFullPath().c_str() ); + } + else + YUI_THROW( YUIPluginException( PLUGIN_BASE_NAME ) ); +} + + +YQPackageSelectorPlugin::~YQPackageSelectorPlugin() +{ + // NOP +} + + +YQPackageSelector * +YQPackageSelectorPlugin::createPackageSelector( YWidget * parent, long modeFlags ) +{ + if ( error() ) + return 0; + + YQPackageSelector * packageSelector = 0; + + try + { + packageSelector = new YQPackageSelector( parent, modeFlags ); + } + catch (const std::exception & e) + { + y2error( "Caught std::exception: %s", e.what() ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + catch (...) + { + y2error( "Caught unspecified exception." ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + + YUI_CHECK_NEW( packageSelector ); + + return packageSelector; +} + + +YQPatternSelector * +YQPackageSelectorPlugin::createPatternSelector( YWidget * parent, long modeFlags ) +{ + if ( error() ) + return 0; + + YQPatternSelector * patternSelector = 0; + + try + { + patternSelector = new YQPatternSelector( parent, modeFlags ); + } + catch (const std::exception & e) + { + y2error( "Caught std::exception: %s", e.what() ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + catch (...) + { + y2error( "Caught unspecified exception." ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + + YUI_CHECK_NEW( patternSelector ); + + return patternSelector; +} + + +YQSimplePatchSelector * +YQPackageSelectorPlugin::createSimplePatchSelector( YWidget * parent, long modeFlags ) +{ + if ( error() ) + return 0; + + YQSimplePatchSelector * simplePatchSelector = 0; + + try + { + simplePatchSelector = new YQSimplePatchSelector( parent, modeFlags ); + } + catch (const std::exception & e) + { + y2error( "Caught std::exception: %s", e.what() ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + catch (...) + { + y2error( "Caught unspecified exception." ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + + YUI_CHECK_NEW( simplePatchSelector ); + + return simplePatchSelector; +} + diff --git a/src/YQPackageSelectorPlugin.h b/src/YQPackageSelectorPlugin.h new file mode 100644 index 0000000..0704d26 --- /dev/null +++ b/src/YQPackageSelectorPlugin.h @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (c) SuSE Linux AG | +\----------------------------------------------------------------------/ + + File: YQPackageSelectorPlugin.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPackageSelectorPlugin_h +#define YQPackageSelectorPlugin_h + +#include +#include "YQPackageSelector.h" +#include "YQPatternSelector.h" +#include "YQSimplePatchSelector.h" + + +/** + * Simplified access to the Qt UI's package selector plugin. + **/ +class YQPackageSelectorPlugin: public YPackageSelectorPlugin +{ +public: + + /** + * Constructor: Load the plugin library for the Qt package selector. + **/ + YQPackageSelectorPlugin(); + + /** + * Destructor. Calls dlclose() which will unload the plugin library if it + * is no longer used, i.e. if the reference count dlopen() uses reaches 0. + **/ + virtual ~YQPackageSelectorPlugin(); + + /** + * Create a package selector. + * Implemented from YPackageSelectorPlugin. + * + * This might return 0 if the plugin lib could not be loaded or if the + * appropriate symbol could not be located in the plugin lib. + **/ + virtual YQPackageSelector * createPackageSelector ( YWidget * parent, + long modeFlags = 0 ); + + /** + * Create a pattern selector. + * + * This might return 0 if the plugin lib could not be loaded or if the + * appropriate symbol could not be located in the plugin lib. + **/ + virtual YQPatternSelector * createPatternSelector ( YWidget * parent, + long modeFlags = 0 ); + /** + * Create a simple patch selector. + * + * This might return 0 if the plugin lib could not be loaded or if the + * appropriate symbol could not be located in the plugin lib. + **/ + virtual YQSimplePatchSelector * createSimplePatchSelector( YWidget * parent, + long modeFlags = 0 ); +}; + + + +#endif // YQPackageSelectorPlugin_h diff --git a/src/YQPartitionSplitter.cc b/src/YQPartitionSplitter.cc new file mode 100644 index 0000000..35a5732 --- /dev/null +++ b/src/YQPartitionSplitter.cc @@ -0,0 +1,205 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPartitionSplitter.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQWidgetFactory.h" +#include "YQOptionalWidgetFactory.h" +#include "YQPartitionSplitter.h" +#include "YQLayoutBox.h" +#include "YQBarGraph.h" +#include "YQIntField.h" +#include "YQSlider.h" +#include "YQSignalBlocker.h" + + +YQPartitionSplitter::YQPartitionSplitter( YWidget * parent, + int usedSize, + int totalFreeSize, + int newPartSize, + int minNewSize, + int minFreeSize, + const string & usedLabel, + const string & freeLabel, + const string & newPartLabel, + const string & freeFieldLabel, + const string & newPartFieldLabel ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YPartitionSplitter( parent, + usedSize, + totalFreeSize, + newPartSize, + minNewSize, + minFreeSize, + usedLabel, + freeLabel, + newPartLabel, + freeFieldLabel, + newPartFieldLabel ) + , _vbox( 0 ) + , _barGraph( 0 ) + , _hbox( 0 ) + , _freeSizeSlider( 0 ) + , _newPartField( 0 ) +{ + setWidgetRep( this ); + + // Replace children manager so it will accept one single direct child (the outer vbox) + setChildrenManager( new YSingleWidgetChildManager( this ) ); + + // + // Create internal widgets + // + + _vbox = YUI::widgetFactory()->createVBox( this ); + _barGraph = dynamic_cast ( YUI::optionalWidgetFactory()->createBarGraph( _vbox ) ); + YUI_CHECK_PTR( _barGraph ); + + int freeSize = totalFreeSize - newPartSize; + + { + YBarGraphMultiUpdate multiUpdate( _barGraph ); + + _barGraph->addSegment( YBarGraphSegment( usedSize, usedLabel ) ); + _barGraph->addSegment( YBarGraphSegment( freeSize, freeLabel ) ); + _barGraph->addSegment( YBarGraphSegment( newPartSize, newPartLabel) ); + } + + _hbox = YUI::widgetFactory()->createHBox( _vbox ); + + _freeSizeSlider = new YQSlider( _hbox, freeFieldLabel, + minFreeSize, maxFreeSize(), freeSize, + true ); // reverseLayout (put QSpinBox left of QSlider) + YUI_CHECK_PTR( _freeSizeSlider ); + _freeSizeSlider->setStretchable( YD_HORIZ, true ); + + _newPartField = new YQIntField( _hbox, newPartFieldLabel, + minNewSize, maxNewPartSize(), newPartSize ); + YUI_CHECK_PTR( _newPartField ); + _newPartField->setStretchable( YD_HORIZ, false ); + + + // Connect signals + + connect( _newPartField, SIGNAL( valueChanged (int) ), + this, SLOT ( setNewPartSizeSlot(int) ) ); + + connect( _freeSizeSlider, SIGNAL( valueChanged (int) ), + this, SLOT ( setFreeSizeSlot(int) ) ); +} + + +YQPartitionSplitter::~YQPartitionSplitter() +{ + // NOP +} + + +void YQPartitionSplitter::setEnabled( bool enabled ) +{ + _freeSizeSlider->setEnabled( enabled ); + _newPartField->setEnabled ( enabled ); + + YWidget::setEnabled( enabled ); +} + + +int YQPartitionSplitter::preferredWidth() +{ + return _vbox->preferredWidth(); +} + + +int YQPartitionSplitter::preferredHeight() +{ + return _vbox->preferredHeight(); +} + + +void YQPartitionSplitter::setSize( int newWidth, int newHeight ) +{ + QWidget::resize( newWidth, newHeight ); + _vbox->setSize ( newWidth, newHeight ); +} + + +int YQPartitionSplitter::value() +{ + YUI_CHECK_PTR( _newPartField ); + + return _newPartField->value(); +} + + +void YQPartitionSplitter::setValue( int newValue ) +{ + YUI_CHECK_PTR( _barGraph ); + YUI_CHECK_PTR( _freeSizeSlider ); + YUI_CHECK_PTR( _newPartField ); + + YQSignalBlocker sigBlocker1( _barGraph ); + YQSignalBlocker sigBlocker2( _freeSizeSlider ); + YQSignalBlocker sigBlocker3( _newPartField ); + + _newPartField->setValue( newValue ); + + int freeSize = totalFreeSize() - newValue; + _freeSizeSlider->setValue( freeSize ); + + YBarGraphMultiUpdate multiUpdate( _barGraph ); + { + _barGraph->setValue( freeSegment, freeSize ); + _barGraph->setValue( newPartSegment, newValue ); + } +} + + +void YQPartitionSplitter::setFreeSizeSlot( int newFreeSize ) +{ + int newPartSize = totalFreeSize() - newFreeSize; + + setValue( newPartSize ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +void YQPartitionSplitter::setNewPartSizeSlot( int newPartSize ) +{ + setValue( newPartSize ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +bool YQPartitionSplitter::setKeyboardFocus() +{ + _newPartField->setKeyboardFocus(); + + return true; +} + + +#include "YQPartitionSplitter.moc" diff --git a/src/YQPartitionSplitter.h b/src/YQPartitionSplitter.h new file mode 100644 index 0000000..514d564 --- /dev/null +++ b/src/YQPartitionSplitter.h @@ -0,0 +1,141 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPartitionSplitter.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPartitionSplitter_h +#define YQPartitionSplitter_h + +#include "qwidget.h" +#include "YPartitionSplitter.h" + +class YLayoutBox; +class YQBarGraph; +class YQIntField; +class YQSlider; + + +class YQPartitionSplitter : public QWidget, public YPartitionSplitter +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQPartitionSplitter( YWidget * parent, + int usedSize, + int freeSize, + int newPartSize, + int minNewPartSize, + int minFreeSize, + const string & usedLabel, + const string & freeLabel, + const string & newPartLabel, + const string & freeFieldLabel, + const string & newPartFieldLabel ); + + /** + * Destructor. + **/ + ~YQPartitionSplitter(); + + /** + * Return the value (the size of the new partition). + * + * Implemented from YPartitionSplitter. + **/ + virtual int value(); + + /** + * Set the value (the size of the new partition). + * + * Implemented from YPartitionSplitter. + **/ + virtual void setValue( int newValue ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +public slots: + /** + * Slot for setting the free size. + **/ + void setFreeSizeSlot( int newFreeSize ); + + /** + * Slot for setting the new size. + **/ + void setNewPartSizeSlot( int newNewSize ); + + +protected: + + enum + { + usedSegment = 0, + freeSegment = 1, + newPartSegment = 2 + }; + + + // + // Widgets + // + + YLayoutBox * _vbox; + YQBarGraph * _barGraph; + YLayoutBox * _hbox; + YQSlider * _freeSizeSlider; + YQIntField * _newPartField; + +}; + + +#endif // YQPartitionSplitter_h diff --git a/src/YQProgressBar.cc b/src/YQProgressBar.cc new file mode 100644 index 0000000..19f73a2 --- /dev/null +++ b/src/YQProgressBar.cc @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQProgressBar.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +using std::max; + +#include "utf8.h" +#include "YQUI.h" +#include "YQProgressBar.h" +#include "YQWidgetCaption.h" + + +YQProgressBar::YQProgressBar( YWidget * parent, + const string & label, + int maxValue ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YProgressBar( parent, label, maxValue ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_progressbar = new QProgressBar( maxValue, this ); + YUI_CHECK_NEW( _qt_progressbar ); + + _caption->setBuddy( _qt_progressbar ); +} + + +YQProgressBar::~YQProgressBar() +{ + // NOP +} + + +void YQProgressBar::setLabel( const string & label ) +{ + _caption->setText( label ); + YProgressBar::setLabel( label ); +} + + +void YQProgressBar::setValue( int newValue ) +{ + YProgressBar::setValue( newValue ); + _qt_progressbar->setProgress( value() ); +} + + + +void YQProgressBar::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_progressbar->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQProgressBar::preferredWidth() +{ + int hintWidth = _caption->isShown() ? + _caption->sizeHint().width() + margin() : 0; + + return max( 200, hintWidth ); +} + + +int YQProgressBar::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQProgressBar::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool YQProgressBar::setKeyboardFocus() +{ + _qt_progressbar->setFocus(); + + return true; +} + + +#include "YQProgressBar.moc" diff --git a/src/YQProgressBar.h b/src/YQProgressBar.h new file mode 100644 index 0000000..092e9f7 --- /dev/null +++ b/src/YQProgressBar.h @@ -0,0 +1,101 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQProgressBar.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQProgressBar_h +#define YQProgressBar_h + +#include +#include "YProgressBar.h" + + +class QString; +class YQWidgetCaption; +class QProgressBar; + +class YQProgressBar : public QVBox, public YProgressBar +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQProgressBar( YWidget * parent, + const string & label, + int maxValue = 100 ); + /** + * Destructor. + **/ + virtual ~YQProgressBar(); + + /** + * Set the label (the caption above the progress bar). + * + * Reimplemented from YProgressBar. + **/ + virtual void setLabel( const string & label ); + + /** + * Set the current progress value ( <= maxValue() ). + * + * Reimplemented from YProgressBar. + **/ + virtual void setValue( int newValue ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +protected: + + YQWidgetCaption * _caption; + QProgressBar * _qt_progressbar; +}; + +#endif // YQProgressBar_h diff --git a/src/YQPushButton.cc b/src/YQPushButton.cc new file mode 100644 index 0000000..b433022 --- /dev/null +++ b/src/YQPushButton.cc @@ -0,0 +1,83 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPushButton.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQPushButton.h" + + +YQPushButton::YQPushButton( YWidget * parent, + const std::string & label ) + : YQGenericButton( parent, label ) +{ + setWidgetRep( this ); + + QPushButton * button = new QPushButton( fromUTF8( label ), this ); + CHECK_PTR( button ); + + setQPushButton( button ); + + button->setMinimumSize( 2, 2 ); + button->move( YQButtonBorder, YQButtonBorder ); + setMinimumSize( button->minimumSize() + + 2 * QSize( YQButtonBorder, YQButtonBorder ) ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( hit() ) ); +} + + +YQPushButton::~YQPushButton() +{ +} + + +int YQPushButton::preferredWidth() +{ + return 2 * YQButtonBorder + qPushButton()->sizeHint().width(); +} + + +int YQPushButton::preferredHeight() +{ + return 2 * YQButtonBorder + qPushButton()->sizeHint().height(); +} + + +void YQPushButton::setSize( int newWidth, int newHeight ) +{ + qPushButton()->resize( newWidth - 2 * YQButtonBorder, + newHeight - 2 * YQButtonBorder ); + resize( newWidth, newHeight ); +} + + +void YQPushButton::hit() +{ + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) ); +} + + +#include "YQPushButton.moc" diff --git a/src/YQPushButton.h b/src/YQPushButton.h new file mode 100644 index 0000000..390e80f --- /dev/null +++ b/src/YQPushButton.h @@ -0,0 +1,75 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPushButton.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPushButton_h +#define YQPushButton_h + +#include "YQGenericButton.h" + + +class YQDialog; + +class YQPushButton : public YQGenericButton +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQPushButton( YWidget * parent, + const std::string & label ); + + /** + * Destructor. + **/ + virtual ~YQPushButton(); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + +public slots: + + /** + * Triggered when the button is activated (clicked or via keyboard). + * Notifies the the ui about this. + **/ + void hit(); +}; + +#endif // YQPushButton_h diff --git a/src/YQRadioButton.cc b/src/YQRadioButton.cc new file mode 100644 index 0000000..30b099f --- /dev/null +++ b/src/YQRadioButton.cc @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQRadioButton.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQApplication.h" +#include "YEvent.h" +#include "YQRadioButton.h" +#include "YRadioButtonGroup.h" +#include "YQSignalBlocker.h" + +using std::string; + +#define SPACING 8 + +// +----+----------------------------------+----+ +// | |(o) RadioButtonlabel | | +// +----+----------------------------------+----+ +// <----> SPACING <----> + + + +YQRadioButton::YQRadioButton( YWidget * parent, + const string & label, + bool checked ) + : QGroupBox( (QWidget *) (parent->widgetRep() ) ) + , YRadioButton( parent, label ) +{ + setWidgetRep( this ); + setFrameStyle( NoFrame ); + + QBoxLayout * layout = new QBoxLayout( this, QBoxLayout::LeftToRight ); + + _qt_radioButton = new QRadioButton( fromUTF8( label ), this ); + + layout->addSpacing( SPACING ); + layout->addWidget( _qt_radioButton ); + layout->addSpacing( SPACING ); + _qt_radioButton->setChecked( checked ); + + installEventFilter(this); + + connect ( _qt_radioButton, SIGNAL( toggled ( bool ) ), + this, SLOT ( changed ( bool ) ) ); +} + + +void +YQRadioButton::setUseBoldFont( bool useBold ) +{ + _qt_radioButton->setFont( useBold ? + YQUI::yqApp()->boldFont() : + YQUI::yqApp()->currentFont() ); + + YRadioButton::setUseBoldFont( useBold ); +} + + +int YQRadioButton::preferredWidth() +{ + return 2 * SPACING + _qt_radioButton->sizeHint().width(); +} + + +int YQRadioButton::preferredHeight() +{ + return _qt_radioButton->sizeHint().height(); +} + + +void YQRadioButton::setSize( int newWidth, int newHeight ) +{ + _qt_radioButton->resize( newWidth - 2*SPACING, newHeight ); + resize( newWidth, newHeight ); +} + + +bool YQRadioButton::value() +{ + return _qt_radioButton->isChecked(); +} + + +void YQRadioButton::setValue( bool newValue ) +{ + YQSignalBlocker sigBlocker( _qt_radioButton ); + + _qt_radioButton->setChecked( newValue ); + + if ( newValue ) + { + YRadioButtonGroup * group = buttonGroup(); + + if ( group ) + group->uncheckOtherButtons( this ); + } +} + + +void YQRadioButton::setLabel( const string & label ) +{ + _qt_radioButton->setText( fromUTF8( label ) ); + YRadioButton::setLabel( label ); +} + + +void YQRadioButton::setEnabled( bool enabled ) +{ + _qt_radioButton->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +QRadioButton * YQRadioButton::getQtButton() +{ + return _qt_radioButton; +} + + +bool YQRadioButton::setKeyboardFocus() +{ + _qt_radioButton->setFocus(); + + return true; +} + + +// slots + +void YQRadioButton::changed( bool newState ) +{ + if ( notify() && newState ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); +} + + +bool YQRadioButton::eventFilter( QObject * obj, QEvent * event ) +{ + if ( event && event->type() == QEvent::MouseButtonRelease ) + { + QMouseEvent * mouseEvent = dynamic_cast (event); + + if ( mouseEvent && mouseEvent->button() == Qt::RightButton ) + { + y2milestone( "Right click on button detected" ); + YQUI::ui()->maybeLeftHandedUser(); + } + } + + return QObject::eventFilter( obj, event ); +} + + +#include "YQRadioButton.moc" diff --git a/src/YQRadioButton.h b/src/YQRadioButton.h new file mode 100644 index 0000000..d0a8573 --- /dev/null +++ b/src/YQRadioButton.h @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQRadioButton.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQRadioButton_h +#define YQRadioButton_h + +#include +#include "YRadioButton.h" + + + +class QRadioButton; +using std::string; + + +class YQRadioButton : public QGroupBox, public YRadioButton +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQRadioButton( YWidget * parent, + const string & label, + bool checked ); + + /** + * Return the "checked" state of the RadioButton. + * + * Reimplemented from YRadioButton. + **/ + virtual bool value(); + + /** + * Set the "checked" state of the RadioButton. + * + * Reimplemented from YRadioButton. + **/ + virtual void setValue( bool checked ); + + /** + * Change the label (the text) on the RadioButton. + * + * Reimplemented from YRadioButton. + **/ + virtual void setLabel( const string & label ); + + /** + * Use a bold font. + * + * Reimplemented from YRadioButton. + **/ + virtual void setUseBoldFont( bool bold = true ); + + /** + * Set enabled / disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + /** + * Return the actual qt button. Used by YQButtonGroup. + **/ + QRadioButton * getQtButton(); + + +protected slots: + /** + * Triggered when the RadioButton is toggled. + **/ + void changed( bool newState ); + + /** + * Redirect events to this object. + **/ + bool eventFilter( QObject * obj, QEvent * event ); + + +protected: + + QRadioButton * _qt_radioButton; +}; + +#endif // YQRadioButton_h diff --git a/src/YQRadioButtonGroup.cc b/src/YQRadioButtonGroup.cc new file mode 100644 index 0000000..7b94170 --- /dev/null +++ b/src/YQRadioButtonGroup.cc @@ -0,0 +1,120 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQRadioButtonGroup.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +#include "YQRadioButtonGroup.h" +#include "YQRadioButton.h" + + +YQRadioButtonGroup::YQRadioButtonGroup( YWidget * parent ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YRadioButtonGroup( parent ) + , _recursive( false ) +{ + setWidgetRep( this ); +} + + +YQRadioButtonGroup::~YQRadioButtonGroup() +{ + // NOP +} + + +void +YQRadioButtonGroup::addRadioButton( YRadioButton * button ) +{ + YRadioButtonGroup::addRadioButton( button ); + + if ( button->value() ) // if this new button is active + { + uncheckOtherButtons( button ); // make it the only active + } + + QRadioButton * radio_button = ( ( YQRadioButton * ) button )->getQtButton(); + + connect ( radio_button, SIGNAL ( toggled ( bool ) ), + this, SLOT ( radioButtonClicked( bool ) ) ); +} + + +void +YQRadioButtonGroup::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void +YQRadioButtonGroup::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + YRadioButtonGroup::setSize( newWidth, newHeight ); +} + + +void +YQRadioButtonGroup::radioButtonClicked( bool newState ) +{ + // Prevent infinite recursion: YQRadioButton::setValue() might cause Qt + // signals that would cause recursion to this place. + + if ( _recursive ) + return; + + _recursive = true; + + QRadioButton * senderButton = (QRadioButton *) sender(); + + // Implement radio box behaviour: Uncheck all other radio buttons + + for ( YRadioButtonListConstIterator it = radioButtonsBegin(); + it != radioButtonsEnd(); + ++it ) + { + YQRadioButton * radioButton = dynamic_cast (*it); + + if ( radioButton ) + { + if ( radioButton->getQtButton() == senderButton ) + { + // If this button has been clicked, it is to be the RadioBox's + // active button - regardless of newState. This is to avoid + // RadioBoxes where no single button is active; otherwise the + // second click would deactivate the only active button. + + radioButton->setValue( true ); + } + else + { + radioButton->setValue( false ); + } + } + } + + _recursive = false; +} + + +#include "YQRadioButtonGroup.moc" diff --git a/src/YQRadioButtonGroup.h b/src/YQRadioButtonGroup.h new file mode 100644 index 0000000..9d72913 --- /dev/null +++ b/src/YQRadioButtonGroup.h @@ -0,0 +1,83 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQRadioButtonGroup.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQRadioButtonGroup_h +#define YQRadioButtonGroup_h + +#include +#include "YRadioButtonGroup.h" + +class QButtonGroup; + +class YQRadioButtonGroup : public QWidget, public YRadioButtonGroup +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQRadioButtonGroup( YWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQRadioButtonGroup(); + + /** + * Add a RadioButton. + * + * Reimplemented from YRadioButtonGroup. + **/ + virtual void addRadioButton( YRadioButton * button ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + +private slots: + + /** + * Triggered when one of the radio buttons changed state. + * This implements the radio box behaviour, i.e. unselects all but the last + * selected radio button. + **/ + void radioButtonClicked( bool newState ); + + +private: + + /** + * Used to prevent infinite recursion due to signal race conditions. + **/ + bool _recursive; +}; + + +#endif // YQRadioButtonGroup_h diff --git a/src/YQReplacePoint.cc b/src/YQReplacePoint.cc new file mode 100644 index 0000000..f37f0b2 --- /dev/null +++ b/src/YQReplacePoint.cc @@ -0,0 +1,60 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQReplacePoint.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#define y2log_component "qt-ui" +#include + +#include "YQReplacePoint.h" + + +YQReplacePoint::YQReplacePoint( YWidget * parent ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YReplacePoint( parent ) +{ + setWidgetRep( this ); +} + + +void YQReplacePoint::showChild() +{ + YWidget * child = firstChild(); + + if ( child ) + { + QWidget * qChild = (QWidget *) child->widgetRep(); + qChild->show(); + } +} + + +void YQReplacePoint::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void YQReplacePoint::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + YReplacePoint::setSize( newWidth, newHeight ); +} + +#include "YQReplacePoint.moc" diff --git a/src/YQReplacePoint.h b/src/YQReplacePoint.h new file mode 100644 index 0000000..3f21b1e --- /dev/null +++ b/src/YQReplacePoint.h @@ -0,0 +1,63 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQReplacePoint.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQReplacePoint_h +#define YQReplacePoint_h + +#include + +#include "YReplacePoint.h" + +class QWidget; + +class YQReplacePoint : public QWidget, public YReplacePoint +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQReplacePoint( YWidget * parent ); + + /** + * Show a newly added child. + * + * Reimplemented from YReplacePoint. + **/ + virtual void showChild(); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); +}; + + +#endif // YQReplacePoint_h diff --git a/src/YQRichText.cc b/src/YQRichText.cc new file mode 100644 index 0000000..343f296 --- /dev/null +++ b/src/YQRichText.cc @@ -0,0 +1,207 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQRichText.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include "qregexp.h" +#include "YEvent.h" +#include "utf8.h" +#include "YQUI.h" +#include "YQDialog.h" +#include "YQRichText.h" + + +YQRichText::YQRichText( YWidget * parent, const string & text, bool plainTextMode ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YRichText( parent, text, plainTextMode ) +{ + setWidgetRep( this ); + + setMargin( YQWidgetMargin ); + + _textBrowser = new YQTextBrowser( this ); + YUI_CHECK_NEW( _textBrowser ); + + _textBrowser->setMimeSourceFactory( 0 ); + _textBrowser->installEventFilter( this ); + + if ( plainTextMode ) + { + _textBrowser->setTextFormat( Qt::PlainText ); + _textBrowser->setWordWrap( QTextEdit::NoWrap ); + } + else + { + _textBrowser->setTextFormat( Qt::RichText ); + } + + setValue( text ); + + + // Set the text foreground color to black, regardless of its current + // settings - it might be changed if this widget resides in a + // warnColor dialog - which we cannot find right now out since our + // parent is not set yet :-( + + QPalette pal( _textBrowser->palette() ); + QColorGroup normalColors( pal.normal() ); + normalColors.setColor( QColorGroup::Text, black ); + pal.setNormal( normalColors ); + _textBrowser->setPalette( pal ); + + // Set the text background to a light grey + + _textBrowser->setPaper( QColor( 234, 234, 234 ) ); + + + // Propagate clicks on hyperlinks + + connect( _textBrowser, SIGNAL( linkClicked( const QString & ) ), + this, SLOT ( linkClicked( const QString & ) ) ); +} + + +YQRichText::~YQRichText() +{ + // NOP +} + + +void YQRichText::setValue( const string & newText ) +{ + if ( _textBrowser->horizontalScrollBar() ) + _textBrowser->horizontalScrollBar()->setValue(0); + + if ( ! autoScrollDown() && _textBrowser->verticalScrollBar() ) + _textBrowser->verticalScrollBar()->setValue(0); + + QString text = fromUTF8( newText ); + + if ( ! plainTextMode() ) + text.replace( "&product;", YQUI::ui()->productName() ); + + YRichText::setValue( newText ); + _textBrowser->setText( text ); + + if ( autoScrollDown() && _textBrowser->verticalScrollBar() ) + _textBrowser->verticalScrollBar()->setValue( _textBrowser->verticalScrollBar()->maxValue() ); +} + + +void YQRichText::setPlainTextMode( bool newPlainTextMode ) +{ + YRichText::setPlainTextMode( newPlainTextMode ); + + if ( plainTextMode() ) + { + _textBrowser->setTextFormat( Qt::PlainText ); + _textBrowser->setWordWrap( QTextEdit::NoWrap ); + } + else + { + _textBrowser->setTextFormat( Qt::RichText ); + } +} + + +void YQRichText::setAutoScrollDown( bool newAutoScrollDown ) +{ + YRichText::setAutoScrollDown( newAutoScrollDown ); + + if ( autoScrollDown() && _textBrowser->verticalScrollBar() ) + _textBrowser->verticalScrollBar()->setValue( _textBrowser->verticalScrollBar()->maxValue() ); +} + + +void YQRichText::linkClicked( const QString & url ) +{ + // y2debug( "Selected hyperlink \"%s\"", (const char *) url ); + YQUI::ui()->sendEvent( new YMenuEvent( YCPString( (const char *) url ) ) ); +} + + +bool YQRichText::eventFilter( QObject * obj, QEvent * ev ) +{ + if ( ev->type() == QEvent::KeyPress ) + { + QKeyEvent * event = ( QKeyEvent * ) ev; + + if ( ( event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter ) && + ( event->state() == 0 || event->state() == Qt::Keypad ) && + ! haveHyperLinks() ) + { + YQDialog * dia = (YQDialog *) findDialog(); + + if ( dia ) + { + ( void ) dia->activateDefaultButton(); + return true; + } + } + } + + return QWidget::eventFilter( obj, ev ); +} + + +bool YQRichText::haveHyperLinks() +{ + if ( plainTextMode() ) + return false; + + return ( _textBrowser->text().contains( QRegExp( " 0 ); +} + + +int YQRichText::preferredWidth() +{ + return shrinkable() ? 10 : 100; +} + + +int YQRichText::preferredHeight() +{ + return shrinkable() ? 10 : 100; +} + + +void YQRichText::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void YQRichText::setEnabled( bool enabled ) +{ + _textBrowser->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +bool YQRichText::setKeyboardFocus() +{ + _textBrowser->setFocus(); + + return true; +} + + + +#include "YQRichText.moc" diff --git a/src/YQRichText.h b/src/YQRichText.h new file mode 100644 index 0000000..baccaf7 --- /dev/null +++ b/src/YQRichText.h @@ -0,0 +1,168 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQRichText.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQRichText_h +#define YQRichText_h + +#include +#include +#include "YRichText.h" + +using std::string; + + +class YQTextBrowser; + +class YQRichText : public QVBox, public YRichText +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQRichText( YWidget * parent, + const string & text, + bool plainTextMode = false ); + + /** + * Destructor. + **/ + virtual ~YQRichText(); + + /** + * Change the text content of the RichText widget. + * + * Reimplemented from YRichText. + **/ + virtual void setValue( const string & newValue ); + + /** + * Set this RichText widget's "plain text" mode on or off. + * + * Reimplemented from YRichText. + **/ + virtual void setPlainTextMode( bool on = true ); + + /** + * Set this RichText widget's "auto scroll down" mode on or off. + * + * Reimplemented from YRichText. + **/ + virtual void setAutoScrollDown( bool on = true ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + /** + * Event filter. + * + * Reimplemented from QWidget. + **/ + virtual bool eventFilter( QObject * obj, QEvent * ev ); + + /** + * Returns 'true' if the current text of this RichText widget contains + * hyperlinks. + **/ + bool haveHyperLinks(); + + +protected slots: + + /** + * Notification that a hyperlink is clicked. + **/ + void linkClicked( const QString & url ); + + +protected: + + YQTextBrowser * _textBrowser; +}; + + +/** + * Helper class - needed to have the benefits of both QVBox as the base class + * for YQRichText so uniform margins can be implemented (outside, not inside + * the scroll window as QTextBrowser normally does it) and QTextBrowser's + * featurs (enable hyperlinks) without removing the text each time the user + * clicks. + * + * This class is required only to overwrite setSource(). + **/ +class YQTextBrowser: public QTextBrowser +{ + Q_OBJECT + + +public: + + /** + * Constructor + **/ + YQTextBrowser( QWidget * parent = 0 ): + QTextBrowser( parent ) {} + +public slots: + + /** + * Get the document pointed to by a hyperlink. + * + * Reimplemented from QTextBrowser to avoid having an empty text each time + * the user clicks on a hyperlink. + **/ + virtual void setSource( const QString & name ) {} +}; + + +#endif // YQRichText_h diff --git a/src/YQSelectionBox.cc b/src/YQSelectionBox.cc new file mode 100644 index 0000000..d4ee7c2 --- /dev/null +++ b/src/YQSelectionBox.cc @@ -0,0 +1,313 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSelectionBox.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#include +#define y2log_component "qt-ui" +#include + +using std::max; + +#include "utf8.h" +#include "YEvent.h" +#include "YQUI.h" +#include "YQSelectionBox.h" +#include "YQSignalBlocker.h" +#include "YQDialog.h" +#include "YUIException.h" +#include "YQWidgetCaption.h" + +#define VERBOSE_SELECTION 1 + +#define DEFAULT_VISIBLE_LINES 5 +#define SHRINKABLE_VISIBLE_LINES 2 + + +YQSelectionBox::YQSelectionBox( YWidget * parent, const string & label ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YSelectionBox( parent, label ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_listBox = new QListBox( this ); + YUI_CHECK_NEW( _qt_listBox ); + + _qt_listBox->installEventFilter( this ); + _qt_listBox->setVariableHeight( false ); + _qt_listBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, + QSizePolicy::Expanding ) ); + _qt_listBox->setTopItem(0); + _caption->setBuddy( _qt_listBox ); + + connect( _qt_listBox, SIGNAL( highlighted ( int ) ), + this, SLOT ( slotSelected( int ) ) ); + + connect( _qt_listBox, SIGNAL( doubleClicked( QListBoxItem * ) ), + this, SLOT ( slotActivated( QListBoxItem * ) ) ); + + connect( &_timer, SIGNAL( timeout() ), + this, SLOT ( returnImmediately() ) ); +} + + +YQSelectionBox::~YQSelectionBox() +{ + // NOP +} + + +void YQSelectionBox::setLabel( const string & label ) +{ + _caption->setText( label ); + YSelectionBox::setLabel( label ); +} + + +void YQSelectionBox::addItem( YItem * item ) +{ + YSelectionBox::addItem( item ); + QPixmap icon; + + if ( item->hasIconName() ) + { + string iconName = iconFullPath( item ); + icon = QPixmap( iconName.c_str() ); + + if ( icon.isNull() ) + y2warning( "Can't load icon %s", iconName.c_str() ); + } + + if ( icon.isNull() ) + _qt_listBox->insertItem( fromUTF8( item->label() ) ); + else + _qt_listBox->insertItem( icon, fromUTF8( item->label() ) ); + + if ( item->selected() ) + { + YQSignalBlocker sigBlocker( _qt_listBox ); + _qt_listBox->setCurrentItem( item->index() ); + } +} + + +void YQSelectionBox::selectItem( YItem * item, bool selected ) +{ + YQSignalBlocker sigBlocker( _qt_listBox ); + + YSelectionBox::selectItem( item, selected ); + _qt_listBox->setCurrentItem( selected ? item->index() : -1 ); +} + + +void YQSelectionBox::selectItem( int index ) +{ + YSelectionBox::deselectAllItems(); + YItem * item = YSelectionBox::itemAt( index ); + + if ( item ) + { +#ifdef VERBOSE_SELECTION + y2debug( "%s \"%s\": Selecting item \"%s\"", + widgetClass(), + debugLabel().c_str(), + item->label().c_str() ); +#endif + + item->setSelected( true ); + } + else + YUI_THROW( YUIException( "Can't find selected item" ) ); +} + + +void YQSelectionBox::deselectAllItems() +{ + YSelectionBox::deselectAllItems(); + _qt_listBox->clearSelection(); + + if ( _qt_listBox->currentItem() > -1 ) + { + // Some item is selected after all; the Qt documtation says this + // happens if the QListBox is in single selection mode (which it is) + // and has the keyboard focus. + // + // Synchronize internal "selected" flags with what the QListBox + // displays. This has a small performance penalty because it calls + // YSelectionBox::deselectAllItems() again which again iterates over + // all items. + selectItem( _qt_listBox->currentItem() ); + } +} + + +void YQSelectionBox::deleteAllItems() +{ + YQSignalBlocker sigBlocker( _qt_listBox ); + + _qt_listBox->clear(); + YSelectionBox::deleteAllItems(); +} + + + +int YQSelectionBox::preferredWidth() +{ + int hintWidth = _caption->isShown() ? + _caption->sizeHint().width() + frameWidth() : 0; + + return max( 80, hintWidth ); +} + + +int YQSelectionBox::preferredHeight() +{ + int hintHeight = _caption->isShown() ? _caption->sizeHint().height() : 0; + int visibleLines = shrinkable() ? SHRINKABLE_VISIBLE_LINES : DEFAULT_VISIBLE_LINES; + hintHeight += visibleLines * _qt_listBox->fontMetrics().lineSpacing(); + hintHeight += _qt_listBox->frameWidth() * 2; + + return max( 80, hintHeight ); +} + + +void YQSelectionBox::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void YQSelectionBox::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_listBox->setEnabled( enabled ); + _qt_listBox->triggerUpdate( true ); + YWidget::setEnabled( enabled ); +} + + +bool YQSelectionBox::setKeyboardFocus() +{ + _qt_listBox->setFocus(); + + return true; +} + + +bool YQSelectionBox::eventFilter( QObject * obj, QEvent * ev ) +{ + if ( ev->type() == QEvent::KeyPress ) + { + QKeyEvent * event = ( QKeyEvent * ) ev; + + if ( ( event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter ) && + ( event->state() == 0 || event->state() == Qt::Keypad ) ) + { + YQDialog * dia = (YQDialog *) findDialog(); + + if ( dia ) + { + ( void ) dia->activateDefaultButton(); + return true; + } + } + } + else if ( ev->type() == QEvent::MouseButtonRelease ) + { + QMouseEvent * mouseEvent = dynamic_cast (ev); + + if ( mouseEvent && mouseEvent->button() == Qt::RightButton ) + { + y2milestone( "Right click in selecton box detected" ); + YQUI::ui()->maybeLeftHandedUser(); + } + } + + return QWidget::eventFilter( obj, ev ); +} + + +void YQSelectionBox::slotSelected( int index ) +{ + selectItem( index ); + + if ( notify() ) + { + if ( immediateMode() ) + returnImmediately(); + else + { + if ( ! YQUI::ui()->eventsBlocked() ) + { + // Delayed event delivery - only if events are to be delivered + // right now. + // + // An event block that is in effect right now may or may not + // affect events after the timer delay is expired. + // + // This may create nasty side effects such as bug #32510: When + // an item is initially selected, that initial selection event + // gets through even though (!) events are blocked during + // widget creation. + + returnDelayed(); + } + } + } +} + + +void YQSelectionBox::slotActivated( QListBoxItem * qItem ) +{ + selectItem( _qt_listBox->index( qItem ) ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) ); +} + + +void YQSelectionBox::returnImmediately() +{ + if ( ! YQUI::ui()->eventPendingFor( this ) ) + { + // Avoid overwriting a (more important) Activated event with a + // SelectionChanged event + + y2debug( "sending selbox event" ); + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) ); + } +} + + +void YQSelectionBox::returnDelayed() +{ + y2debug( "Starting selbox timer" ); + _timer.start( 250, true ); // millisec, singleShot +} + + + +#include "YQSelectionBox.moc" diff --git a/src/YQSelectionBox.h b/src/YQSelectionBox.h new file mode 100644 index 0000000..42e3a7c --- /dev/null +++ b/src/YQSelectionBox.h @@ -0,0 +1,170 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSelectionBox.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQSelectionBox_h +#define YQSelectionBox_h + +#include +#include + +#include "YSelectionBox.h" + +class YQWidgetCaption; +class QListBox; +class QListBoxItem; + + +class YQSelectionBox : public QVBox, public YSelectionBox +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQSelectionBox( YWidget * parent, const string & label ); + + /** + * Destructor. + **/ + virtual ~YQSelectionBox(); + + /** + * Change the label text. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void setLabel( const string & label ); + + /** + * Add an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void addItem( YItem * item ); + + /** + * Select or deselect an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void selectItem( YItem * item, bool selected = true ); + + /** + * Deselect all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deselectAllItems(); + + /** + * Delete all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deleteAllItems(); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + /** + * Event filter. + * + * Reimplemented from QWidget. + **/ + virtual bool eventFilter( QObject * obj, QEvent * ev ); + + +protected slots: + + /** + * Notification that an item has been selected. + * This is only relevant if `opt(`notify ) is set. + **/ + void slotSelected( int index ); + + /** + * Notification that an item has been activated (double clicked). + **/ + void slotActivated( QListBoxItem * item ); + + /** + * Return after some millseconds delay - collect multiple events. + * This is only relevant if `opt( `notify ) is set. + **/ + void returnDelayed(); + + /** + * Return immediately. + * This is only relevant if `opt( `notify ) is set. + **/ + void returnImmediately(); + + +protected: + + /** + * Select an item by index. + **/ + void selectItem( int index ); + + + // + // Data members + // + + YQWidgetCaption * _caption; + QListBox * _qt_listBox; + QTimer _timer; +}; + +#endif // YQLabel_h diff --git a/src/YQSignalBlocker.cc b/src/YQSignalBlocker.cc new file mode 100644 index 0000000..88ff1c5 --- /dev/null +++ b/src/YQSignalBlocker.cc @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSignalBlocker.cc + + Author: Stefan Hundhammer + +/-*/ + +#include "YQSignalBlocker.h" +#include + + +YQSignalBlocker::YQSignalBlocker( QObject * qobject ) + : _qobject( qobject ) +{ + if ( _qobject ) + { + _oldBlockedState = _qobject->signalsBlocked(); + _qobject->blockSignals( true ); + } +} + + +YQSignalBlocker::~YQSignalBlocker() +{ + if ( _qobject ) + _qobject->blockSignals( _oldBlockedState ); +} + diff --git a/src/YQSignalBlocker.h b/src/YQSignalBlocker.h new file mode 100644 index 0000000..f4a649b --- /dev/null +++ b/src/YQSignalBlocker.h @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSignalBlocker.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQSignalBlocker_h +#define YQSignalBlocker_h + +class QObject; + +/** + * Helper class to block Qt signals for QWidgets or QObjects as long as this +Y * object exists. + * + * This object will restore the old blocked state when it goes out of scope. + **/ +class YQSignalBlocker +{ +public: + + /** + * Constructor. + * + * Qt signals for 'qobject' will be blocked as long as this object exists. + * Remember that a QWidget is also a QObject. + **/ + YQSignalBlocker( QObject * qobject ); + + /** + * Destructor. + * + * This will restore the old signal state. + **/ + ~YQSignalBlocker(); + + +private: + + QObject * _qobject; + bool _oldBlockedState; +}; + + +#endif // ifndef YQSignalBlocker_h diff --git a/src/YQSlider.cc b/src/YQSlider.cc new file mode 100644 index 0000000..21dd2cc --- /dev/null +++ b/src/YQSlider.cc @@ -0,0 +1,184 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSlider.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#include + +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQSlider.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + + +YQSlider::YQSlider( YWidget * parent, + const string & label, + int minValue, + int maxValue, + int initialValue, + bool reverseLayout ) + + : QVBox( (QWidget *) parent->widgetRep() ) + , YSlider( parent, label, minValue, maxValue ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, toUTF8( label ) ); + YUI_CHECK_NEW( _caption ); + + _hbox = new QHBox( this ); + YUI_CHECK_NEW( _hbox ); + + _hbox->setSpacing( YQWidgetSpacing ); + + if ( reverseLayout ) + { + _qt_spinBox = new QSpinBox( minValue, maxValue, + 1, // step + _hbox ); + } + else + { + _caption->setAlignment( Qt::AlignRight ); + } + + _qt_slider = new QSlider( minValue, maxValue, + 1, // pageStep + initialValue, + QSlider::Horizontal, _hbox ); + YUI_CHECK_NEW( _qt_slider ); + + if ( ! reverseLayout ) + { + _qt_spinBox = new QSpinBox( minValue, maxValue, + 1, // step + _hbox ); + } + YUI_CHECK_NEW( _qt_spinBox ); + + _qt_spinBox->setValue( initialValue ); + _caption->setBuddy( _qt_spinBox ); + + setValue( initialValue ); + + connect( _qt_spinBox, SIGNAL( valueChanged(int) ), + _qt_slider, SLOT ( setValue (int) ) ); + + connect( _qt_slider, SIGNAL( valueChanged(int) ), + _qt_spinBox, SLOT ( setValue (int) ) ); + + connect( _qt_spinBox, SIGNAL( valueChanged (int) ), + this, SLOT ( valueChangedSlot(int) ) ); +} + + +YQSlider::~YQSlider() +{ + // NOP +} + + +int +YQSlider::value() +{ + return _qt_spinBox->value(); +} + + +void +YQSlider::setValueInternal( int newValue ) +{ + YQSignalBlocker sigBlocker1( _qt_spinBox ); + YQSignalBlocker sigBlocker2( _qt_slider ); + _qt_slider->setValue ( newValue ); + _qt_spinBox->setValue( newValue ); +} + + +void +YQSlider::valueChangedSlot( int newValue ) +{ + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::ValueChanged ) ); + + emit valueChanged( newValue ); +} + + +void +YQSlider::setEnabled( bool enabled ) +{ + _caption->setEnabled ( enabled ); + _qt_slider->setEnabled ( enabled ); + _qt_spinBox->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int +YQSlider::preferredWidth() +{ + int hintWidth = _caption->isShown() ? _caption->sizeHint().width() : 0; + + // Arbitrary value - there is no really good default + return max( 200, hintWidth ); +} + + +int +YQSlider::preferredHeight() +{ + return sizeHint().height(); +} + + +void +YQSlider::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void +YQSlider::setLabel( const string & newLabel ) +{ + _caption->setText( newLabel ); + YSlider::setLabel( newLabel ); +} + + +bool +YQSlider::setKeyboardFocus() +{ + _qt_spinBox->setFocus(); + + return true; +} + + +#include "YQSlider.moc" diff --git a/src/YQSlider.h b/src/YQSlider.h new file mode 100644 index 0000000..7a13968 --- /dev/null +++ b/src/YQSlider.h @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSlider.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQSlider_h +#define YQSlider_h + +#include +#include "YSlider.h" + + +class YQWidgetCaption; +class QSlider; +class QSpinBox; +class QHBox; + +class YQSlider : public QVBox, public YSlider +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * 'reverseLayout' creates the QSpinBox to the left and the QSlider to the right. + **/ + YQSlider( YWidget * parent, + const string & label, + int minValue, + int maxValue, + int initialValue, + bool reverseLayout = false ); + + /** + * Destructor. + **/ + virtual ~YQSlider(); + + /** + * Get the current value (the number entered by the user or set from the + * outside) of this slider. + * + * Implemented from YSlider / YIntField. + **/ + virtual int value(); + +protected: + + /** + * Set the current value (the number entered by the user or set from the + * outside) of this slider. 'val' is guaranteed to be between minValue + * and maxValue; no further checks are required. + * + * Implemented from YSlider/ YIntField. + **/ + virtual void setValueInternal( int val ); + +public: + + /** + * Set the label (the caption above the input field). + * + * Reimplemented from YSlider / YIntField. + **/ + virtual void setLabel( const string & label ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +public slots: + /** + * Slot for "value changed". This will send a ValueChanged event if + * 'notify' is set. + **/ + void valueChangedSlot( int newValue ); + + /** + * Slot for setting the value. + * This is needed separately from setValue() to avoid infinite loops via + * ChangeWidget(). + **/ + void setValueSlot( int newValue ); + + +signals: + + /** + * Emitted when the value changes (regardless of the notify flag). + **/ + void valueChanged( int newValue ); + + +protected: + + YQWidgetCaption * _caption; + QSlider * _qt_slider; + QSpinBox * _qt_spinBox; + QHBox * _hbox; +}; + + +#endif // YQSlider_h diff --git a/src/YQSpacing.cc b/src/YQSpacing.cc new file mode 100644 index 0000000..c7cfa9c --- /dev/null +++ b/src/YQSpacing.cc @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSpacing.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include "YQSpacing.h" + + +YQSpacing::YQSpacing( YWidget * parent, + YUIDimension dim, + bool stretchable, + YLayoutSize_t layoutUnits ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YSpacing( parent, dim, stretchable, layoutUnits ) +{ + setWidgetRep( this ); +} + + +YQSpacing::~YQSpacing() +{ + // NOP +} + + +void YQSpacing::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + + +#include "YQSpacing.moc" diff --git a/src/YQSpacing.h b/src/YQSpacing.h new file mode 100644 index 0000000..ff156cd --- /dev/null +++ b/src/YQSpacing.h @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSpacing.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQSpacing_h +#define YQSpacing_h + +#include +#include "YSpacing.h" + + +class YQSpacing : public QWidget, public YSpacing +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQSpacing( YWidget * parent, + YUIDimension dim, + bool stretchable = false, + YLayoutSize_t layoutUnits = 0.0 ); + + virtual ~YQSpacing(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); +}; + + +#endif // YQSpacing_h diff --git a/src/YQSquash.cc b/src/YQSquash.cc new file mode 100644 index 0000000..6bd4382 --- /dev/null +++ b/src/YQSquash.cc @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSquash.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include "YQSquash.h" + + +YQSquash::YQSquash( YWidget * parent, + bool horSquash, + bool vertSquash ) + : QWidget( (QWidget *) parent->widgetRep() ) + , YSquash( parent, horSquash, vertSquash ) +{ + setWidgetRep( this ); +} + + +YQSquash::~YQSquash() +{ + // NOP +} + + +void YQSquash::setEnabled( bool enabled ) +{ + QWidget::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +void YQSquash::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + YSquash::setSize( newWidth, newHeight ); +} + + +#include "YQSquash.moc" diff --git a/src/YQSquash.h b/src/YQSquash.h new file mode 100644 index 0000000..7c94176 --- /dev/null +++ b/src/YQSquash.h @@ -0,0 +1,61 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSquash.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQSquash_h +#define YQSquash_h + +#include + +#include "YSquash.h" + +class QWidget; + +class YQSquash : public QWidget, public YSquash +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQSquash( YWidget * parent, bool horSquash, bool vertSquash ); + + /** + * Destructor. + **/ + virtual ~YQSquash(); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); +}; + + +#endif // YQSquash_h diff --git a/src/YQTable.cc b/src/YQTable.cc new file mode 100644 index 0000000..0b64757 --- /dev/null +++ b/src/YQTable.cc @@ -0,0 +1,326 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQTable.cc + + Author: Stefan Hundhammer + +/-*/ + +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQSignalBlocker.h" +#include "YUIException.h" + +#include "QY2ListView.h" +#include "YQTable.h" + + +YQTable::YQTable( YWidget * parent, YTableHeader * tableHeader ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YTable( parent, tableHeader ) +{ + setWidgetRep( this ); + setMargin( YQWidgetMargin ); + + _qt_listView = new QY2ListView( this ); + YUI_CHECK_NEW( _qt_listView ); + _qt_listView->setAllColumnsShowFocus( true ); + + + // + // Add columns + // + + for ( int i=0; i < columns(); i++ ) + { + _qt_listView->addColumn( fromUTF8( header( i ) ) ); + + int qt_alignment = Qt::Left; + + switch ( alignment( i ) ) + { + case YAlignBegin: qt_alignment = Qt::AlignLeft; break; + case YAlignCenter: qt_alignment = Qt::AlignCenter; break; + case YAlignEnd: qt_alignment = Qt::AlignRight; break; + + case YAlignUnchanged: break; + } + + _qt_listView->setColumnAlignment( i, qt_alignment ); + // _qt_listView->adjustColumn( column ); + } + + + // + // Connect signals and slots + // + + connect( _qt_listView, SIGNAL( doubleClicked ( QListViewItem * ) ), + this, SLOT ( slotActivated ( QListViewItem * ) ) ); + + connect( _qt_listView, SIGNAL( spacePressed ( QListViewItem * ) ), + this, SLOT ( slotActivated ( QListViewItem * ) ) ); + + connect( _qt_listView, SIGNAL( selectionChanged ( QListViewItem * ) ), + this, SLOT ( slotSelected ( QListViewItem * ) ) ); +} + + +YQTable::~YQTable() +{ + // NOP +} + + +void +YQTable::setKeepSorting( bool keepSorting ) +{ + YTable::setKeepSorting( keepSorting ); + _qt_listView->setSortByInsertionSequence( keepSorting ); +} + + +void +YQTable::addItem( YItem * yitem ) +{ + YTableItem * item = dynamic_cast (yitem); + YUI_CHECK_PTR( item ); + + YTable::addItem( item ); + + YQTableListViewItem * clone = new YQTableListViewItem( this, _qt_listView, item ); + YUI_CHECK_NEW( clone ); + + if ( item->selected() ) + { + YQSignalBlocker sigBlocker( _qt_listView ); + _qt_listView->setSelected( clone, true ); + } +} + + +void +YQTable::selectItem( YItem * yitem, bool selected ) +{ + YQSignalBlocker sigBlocker( _qt_listView ); + + YTableItem * item = dynamic_cast (yitem); + YUI_CHECK_PTR( item ); + + YQTableListViewItem * clone = (YQTableListViewItem *) item->data(); + YUI_CHECK_PTR( clone ); + + if ( ! selected && clone == _qt_listView->selectedItem() ) + { + deselectAllItems(); + } + else + { + _qt_listView->setSelected( clone, true ); + YTable::selectItem( item, selected ); + } +} + + +void +YQTable::deselectAllItems() +{ + YQSignalBlocker sigBlocker( _qt_listView ); + + YTable::deselectAllItems(); + _qt_listView->clearSelection(); +} + + +void +YQTable::deleteAllItems() +{ + _qt_listView->clear(); + YTable::deleteAllItems(); +} + + +void +YQTable::cellChanged( const YTableCell * cell ) +{ + YTableItem * item = cell->parent(); + YUI_CHECK_PTR( item ); + + YQTableListViewItem * clone = (YQTableListViewItem *) item->data(); + YUI_CHECK_PTR( clone ); + + clone->updateCell( cell ); +} + + +void +YQTable::selectOrigItem( QListViewItem * listViewItem ) +{ + if ( listViewItem ) + { + YQTableListViewItem * tableListViewItem = dynamic_cast (listViewItem); + YUI_CHECK_PTR( tableListViewItem ); + + YTable::selectItem( tableListViewItem->origItem(), true ); + } +} + + +void +YQTable::slotSelected( QListViewItem * listViewItem ) +{ + selectOrigItem( listViewItem ); + + if ( immediateMode() ) + { + if ( ! YQUI::ui()->eventPendingFor( this ) ) + { + // Avoid overwriting a (more important) Activated event with a SelectionChanged event + + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) ); + } + } +} + + +void +YQTable::slotActivated( QListViewItem * listViewItem ) +{ + selectOrigItem( listViewItem ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) ); +} + + +void +YQTable::setEnabled( bool enabled ) +{ + _qt_listView->setEnabled( enabled ); + _qt_listView->triggerUpdate(); + YWidget::setEnabled( enabled ); +} + + + +int +YQTable::preferredWidth() +{ + // Arbitrary value. + // Use a MinSize widget to set a size that is useful for the application. + + return 30; +} + + +int +YQTable::preferredHeight() +{ + // Arbitrary value. + // Use a MinSize widget to set a size that is useful for the application. + + return 30; +} + + +void +YQTable::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool +YQTable::setKeyboardFocus() +{ + _qt_listView->setFocus(); + + return true; +} + + + + + + +YQTableListViewItem::YQTableListViewItem( YQTable * table, + QY2ListView * parent, + YTableItem * origItem ) + : QY2ListViewItem( parent ) + , _table( table ) + , _origItem( origItem ) +{ + YUI_CHECK_PTR( _table ); + YUI_CHECK_PTR( _origItem ); + + _origItem->setData( this ); + + for ( YTableCellIterator it = _origItem->cellsBegin(); + it != _origItem->cellsEnd(); + ++it ) + { + updateCell( *it ); + } + + if ( _origItem->selected() ) + QY2ListViewItem::setSelected( true ); +} + + +void +YQTableListViewItem::updateCell( const YTableCell * cell ) +{ + if ( ! cell ) + return; + + int column = cell->column(); + + // + // Set label text + // + + setText( column, fromUTF8( cell->label() ) ); + + + // + // Set icon (if specified) + // + + if ( cell->hasIconName() ) + { + // _table is checked against 0 in the constructor + + string iconName = _table->iconFullPath( cell->iconName() ); + QPixmap icon = QPixmap( iconName.c_str() ); + + if ( icon.isNull() ) + y2warning( "Can't load icon %s", iconName.c_str() ); + else + setPixmap( column, icon ); + } + else // No pixmap name + { + if ( pixmap( column ) ) // Was there a pixmap before? + { + setPixmap( column, QPixmap() ); // Set empty pixmap + } + } +} + + +#include "YQTable.moc" diff --git a/src/YQTable.h b/src/YQTable.h new file mode 100644 index 0000000..19bf1e3 --- /dev/null +++ b/src/YQTable.h @@ -0,0 +1,198 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQTable.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQTable_h +#define YQTable_h + +#include +#include + +#include "YTable.h" + + +class QY2ListView; +class QListViewItem; +class YQListViewItem; + +class YQTable : public QVBox, public YTable +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQTable( YWidget * parent, YTableHeader * header ); + + /** + * Destructor. + **/ + virtual ~YQTable(); + + /** + * Switch between sorting by item insertion order (keepSorting: true) or + * allowing the user to sort by an arbitrary column (by clicking on the + * column header). + * + * Reimplemented from YTable. + **/ + virtual void setKeepSorting( bool keepSorting ); + + /** + * Add an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void addItem( YItem * item ); + + /** + * Select or deselect an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void selectItem( YItem * item, bool selected = true ); + + /** + * Deselect all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deselectAllItems(); + + /** + * Delete all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deleteAllItems(); + + /** + * Notification that a cell (its text and/or its icon) was changed from the + * outside. Applications are required to call this whenever a table cell is + * changed after adding the corresponding table item (the row) to the table + * widget. + * + * Reimplemented from YTable. + **/ + virtual void cellChanged( const YTableCell * cell ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +protected slots: + + /** + * Notification that an item is selected (single click or keyboard). + **/ + void slotSelected( QListViewItem * ); + + /** + * Notification that an item is activated (double click or keyboard). + **/ + void slotActivated( QListViewItem * ); + + +protected: + + /** + * Select the original item (the YTableItem) that corresponds to the + * specified listViewItem. + **/ + void selectOrigItem( QListViewItem * listViewItem ); + + // + // Data members + // + + QY2ListView * _qt_listView; +}; + + + +/** + * Visual representation of a YTableItem. + **/ +class YQTableListViewItem: public QY2ListViewItem +{ +public: + + /** + * Constructor. + **/ + YQTableListViewItem( YQTable * table, + QY2ListView * parent, + YTableItem * origItem ); + + /** + * Return the parent table widget. + **/ + YQTable * table() const { return _table; } + + /** + * Return the corresponding YTableItem. + **/ + YTableItem * origItem() const { return _origItem; } + + /** + * Update this item's display with the content of 'cell'. + **/ + void updateCell( const YTableCell * cell ); + +protected: + + YQTable * _table; + YTableItem * _origItem; +}; + + + +#endif // YQLabel_h diff --git a/src/YQTimeField.cc b/src/YQTimeField.cc new file mode 100644 index 0000000..1847e12 --- /dev/null +++ b/src/YQTimeField.cc @@ -0,0 +1,109 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQTimeField.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQTimeField.h" +#include "YQWidgetCaption.h" + + + +YQTimeField::YQTimeField( YWidget * parent, const string & label ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YTimeField( parent, label ) +{ + setWidgetRep( this ); + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _caption = new YQWidgetCaption( this, fromUTF8( label ) ); + YUI_CHECK_NEW( _caption ); + + _qt_timeEdit = new QTimeEdit( this ); + YUI_CHECK_NEW( _qt_timeEdit ); + + _qt_timeEdit->setAutoAdvance( true ); + _caption->setBuddy( _qt_timeEdit ); +} + + +YQTimeField::~YQTimeField() +{ + // NOP +} + + +string YQTimeField::value() +{ + return toUTF8( _qt_timeEdit->time().toString( Qt::ISODate ) ); +} + + +void YQTimeField::setValue( const string & newValue ) +{ + _qt_timeEdit->setTime( QTime::fromString( fromUTF8( newValue ), Qt::ISODate ) ); +} + + +void YQTimeField::setLabel( const string & newLabel ) +{ + _caption->setText( fromUTF8( newLabel ) ); + YTimeField::setLabel( newLabel ); +} + + +void YQTimeField::setEnabled( bool enabled ) +{ + QVBox::setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +int YQTimeField::preferredWidth() +{ + return sizeHint().width(); +} + + +int YQTimeField::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQTimeField::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +bool YQTimeField::setKeyboardFocus() +{ + _qt_timeEdit->setFocus(); + + return true; +} + + +#include "YQTimeField.moc" diff --git a/src/YQTimeField.h b/src/YQTimeField.h new file mode 100644 index 0000000..1c85fe7 --- /dev/null +++ b/src/YQTimeField.h @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQTimeField.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQTimeField_h +#define YQTimeField_h + +#include +#include "YTimeField.h" + +class YQWidgetCaption; +class QTimeEdit; + + +class YQTimeField : public QVBox, public YTimeField +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQTimeField( YWidget * parent, + const string & label ); + + /** + * Destructor. + **/ + virtual ~YQTimeField(); + + /** + * Get the current value (the text entered by the user or set from the + * outside) of this input field. + * + * Implemented from YSimpleInputField. + **/ + virtual string value(); + + /** + * Set the current value (the text entered by the user or set from the + * outside) of this input field. + * + * Implemented from YSimpleInputField. + **/ + virtual void setValue( const string & newValue ); + + /** + * Set the label (the caption above the input field). + * + * Reimplemented from YSimpleInputField. + **/ + virtual void setLabel( const string & label ); + + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +protected: + + YQWidgetCaption * _caption; + QTimeEdit * _qt_timeEdit; +}; + + +#endif // YQTimeField_h diff --git a/src/YQTree.cc b/src/YQTree.cc new file mode 100644 index 0000000..a3f51fc --- /dev/null +++ b/src/YQTree.cc @@ -0,0 +1,337 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQTree.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#include +#include +#include +#define y2log_component "qt-ui" +#include + +using std::min; +using std::max; + +#include "YQUI.h" +#include "YEvent.h" +#include "utf8.h" +#include "YQTree.h" +#include "YTreeItem.h" +#include "YQSignalBlocker.h" +#include "YQWidgetCaption.h" + +#define VERBOSE_TREE_ITEMS 0 + + +YQTree::YQTree( YWidget * parent, const string & label ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YTree( parent, label ) +{ + setWidgetRep( this ); + + setSpacing( YQWidgetSpacing ); + setMargin ( YQWidgetMargin ); + + _nextSerialNo = 0; + + _caption = new YQWidgetCaption( this, label ); + YUI_CHECK_NEW( _caption ); + + _qt_listView = new QListView( this ); + YUI_CHECK_NEW( _qt_listView ); + + _qt_listView->addColumn( "" ); + _qt_listView->header()->hide(); + _qt_listView->setRootIsDecorated ( true ); + + _caption->setBuddy ( _qt_listView ); + + connect( _qt_listView, SIGNAL( selectionChanged ( QListViewItem * ) ), + this, SLOT ( slotSelected ( QListViewItem * ) ) ); + + connect( _qt_listView, SIGNAL( spacePressed ( QListViewItem * ) ), + this, SLOT ( slotActivated ( QListViewItem * ) ) ); + + connect( _qt_listView, SIGNAL( doubleClicked ( QListViewItem * ) ), + this, SLOT ( slotActivated ( QListViewItem * ) ) ); +} + + +YQTree::~YQTree() +{ + // NOP +} + + +void YQTree::setLabel( const string & label ) +{ + _caption->setText( label ); + YTree::setLabel( label ); +} + + +void YQTree::rebuildTree() +{ + // y2debug( "Rebuilding tree" ); + + YQSignalBlocker sigBlocker( _qt_listView ); + _qt_listView->clear(); + + buildDisplayTree( 0, itemsBegin(), itemsEnd() ); +} + + +void YQTree::buildDisplayTree( YQTreeItem * parentItem, YItemIterator begin, YItemIterator end ) +{ + for ( YItemIterator it = begin; it < end; ++it ) + { + YTreeItem * orig = dynamic_cast (*it); + YUI_CHECK_PTR( orig ); + + YQTreeItem * clone; + + if ( parentItem ) + clone = new YQTreeItem( this, parentItem, orig, _nextSerialNo++ ); + else + clone = new YQTreeItem( this, _qt_listView, orig, _nextSerialNo++ ); + + YUI_CHECK_NEW( clone ); + + if ( orig->hasChildren() ) + buildDisplayTree( clone, orig->childrenBegin(), orig->childrenEnd() ); + } +} + + +void YQTree::selectItem( YItem * yItem, bool selected ) +{ + YQSignalBlocker sigBlocker( _qt_listView ); + + YTreeItem * treeItem = dynamic_cast (yItem); + YUI_CHECK_PTR( treeItem ); + + YQTreeItem * yqTreeItem = (YQTreeItem *) treeItem->data(); + YUI_CHECK_PTR( yqTreeItem ); + + if ( ! selected && yqTreeItem == _qt_listView->selectedItem() ) + { + deselectAllItems(); + } + else + { + _qt_listView->setSelected( yqTreeItem, true ); + openBranch( yqTreeItem ); + YTree::selectItem( treeItem, selected ); + } +} + + +void YQTree::selectItem( YQTreeItem * item ) +{ + if ( item ) + { + YQSignalBlocker sigBlocker( _qt_listView ); + + _qt_listView->setSelected( item, true ); + openBranch( item ); + YTree::selectItem( item->origItem(), true ); + + y2debug( "selected item: \"%s\"", item->origItem()->label().c_str() ); + } +} + + +void YQTree::openBranch( QListViewItem * item ) +{ + while ( item ) + { + item->setOpen( true ); // Takes care of origItem()->setOpen() + item = item->parent(); + } +} + + +void YQTree::deselectAllItems() +{ + YQSignalBlocker sigBlocker( _qt_listView ); + + YTree::deselectAllItems(); + _qt_listView->clearSelection(); +} + + +void YQTree::deleteAllItems() +{ + YQSignalBlocker sigBlocker( _qt_listView ); + + _qt_listView->clear(); + YTree::deleteAllItems(); +} + + +void YQTree::slotSelected( QListViewItem * qItem ) +{ + selectItem( dynamic_cast (qItem) ); + + if ( notify() && ! YQUI::ui()->eventPendingFor( this ) ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) ); +} + + +void YQTree::slotActivated( QListViewItem * qItem ) +{ + selectItem( dynamic_cast (qItem) ); + + if ( notify() ) + YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) ); +} + + +int YQTree::preferredWidth() +{ + int hintWidth = _caption->isShown() ? _caption->sizeHint().width() : 0; + return max( 200, hintWidth ); +} + + +int YQTree::preferredHeight() +{ + // 300 is an arbitrary value. Use a MinSize or MinHeight widget to set a + // size that is useful for the application. + + int hintHeight = _caption->isShown() ? _caption->sizeHint().height() : 0; + + return 300 + hintHeight; +} + + +void YQTree::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void YQTree::setEnabled( bool enabled ) +{ + _caption->setEnabled( enabled ); + _qt_listView->setEnabled( enabled ); + YWidget::setEnabled( enabled ); +} + + +bool YQTree::setKeyboardFocus() +{ + _qt_listView->setFocus(); + + return true; +} + + +/*============================================================================*/ + + + +YQTreeItem::YQTreeItem( YQTree * tree, + QListView * listView, + YTreeItem * orig, + int serial ) + : QListViewItem( listView ) +{ + init( tree, orig, serial ); + +#if VERBOSE_TREE_ITEMS + y2debug( "Creating toplevel tree item \"%s\"", orig->label().c_str() ); +#endif +} + + +YQTreeItem::YQTreeItem( YQTree * tree, + YQTreeItem * parentItem, + YTreeItem * orig, + int serial ) + : QListViewItem( parentItem ) +{ + init( tree, orig, serial ); + +#if VERBOSE_TREE_ITEMS + y2debug( "Creating tree item \"%s\" as child of \"%s\"", + orig->label().c_str(), + parentItem->origItem()->label().c_str() ); +#endif +} + + +void YQTreeItem::init( YQTree * tree, + YTreeItem * orig, + int serial ) +{ + YUI_CHECK_PTR( tree ); + YUI_CHECK_PTR( orig ); + + _tree = tree; + _serialNo = serial; + _origItem = orig; + + _origItem->setData( this ); + + setText( 0, fromUTF8 ( _origItem->label() ) ); + setOpen( _origItem->isOpen() ); + + if ( _origItem->hasIconName() ) + { + string iconName = _tree->iconFullPath( _origItem ); + QPixmap icon( iconName.c_str() ); + + if ( icon.isNull() ) + y2warning( "Can't load icon %s", iconName.c_str() ); + else + setPixmap( 0, icon ); + } +} + + +void +YQTreeItem::setOpen( bool open ) +{ + QListViewItem::setOpen( open ); + _origItem->setOpen( open ); +} + + + +QString +YQTreeItem::key( int column, bool ascending ) const +{ + /* + * Sorting key for QListView internal sorting: + * + * Always sort tree items by insertion order. The tree widget + * cannot maintain a meaningful sorting order of its own: All it + * could do is sort by names (ASCII sort). Better let the (YCP) + * application handle this. + */ + + QString strKey; + strKey.sprintf( "%08d", _serialNo ); + + return strKey; +} + + +#include "YQTree.moc" diff --git a/src/YQTree.h b/src/YQTree.h new file mode 100644 index 0000000..d9686b3 --- /dev/null +++ b/src/YQTree.h @@ -0,0 +1,233 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQTree.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQTree_h +#define YQTree_h + +#include +#include + +#include "YTree.h" + + +class YQWidgetCaption; +class YQTreeItem; + + +class YQTree : public QVBox, public YTree +{ + Q_OBJECT + +public: + + /** + * Constructor. + **/ + YQTree( YWidget * parent, const string & label ); + + /** + * Destructor. + **/ + virtual ~YQTree(); + + /** + * Change the label text. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void setLabel( const string & label ); + + /** + * Rebuild the displayed tree from the internally stored YTreeItems. + * + * The application should call this (once) after all items have been added + * with addItem(). YTree::addItems() calls this automatically. + * + * Implemented from YTree. + **/ + virtual void rebuildTree(); + + /** + * Select or deselect an item. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void selectItem( YItem * item, bool selected = true ); + + /** + * Deselect all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deselectAllItems(); + + /** + * Delete all items. + * + * Reimplemented from YSelectionWidget. + **/ + virtual void deleteAllItems(); + + /** + * Set enabled/disbled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabled( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + **/ + virtual bool setKeyboardFocus(); + + +protected slots: + + /** + * Propagate a tree item selection. + * + * This will trigger a 'SelectionChanged' event if 'notify' is set. + **/ + void slotSelected( QListViewItem * item ); + + /** + * Propagate a double click or pressing the space key on a tree item. + * + * This will trigger an 'Activated' event if 'notify' is set. + **/ + void slotActivated( QListViewItem * item); + + +protected: + + /** + * Select an item via the corresponding YQTreItem. + **/ + void selectItem( YQTreeItem * item ); + + /** + * Open the branch of 'item' recursively to its toplevel item. + **/ + void openBranch( QListViewItem * item ); + + /** + * Build a tree of items that will be displayed (YQTreeItems) from the + * original items between iterators 'begin' and 'end' as child items of + * 'parentItem' (or as toplevel items if 'parentItem' is 0). + **/ + void buildDisplayTree( YQTreeItem * parentItem, + YItemIterator begin, + YItemIterator end ); + + // + // Data members + // + + YQWidgetCaption * _caption; + QListView * _qt_listView; + int _nextSerialNo; +}; + + +class YQTreeItem: public QListViewItem +{ +public: + + /** + * Constructor for a top level item. + **/ + YQTreeItem( YQTree * tree, + QListView * parent, + YTreeItem * origItem, + int serial ); + + /** + * Constructor for a non-top level item. + **/ + YQTreeItem( YQTree * tree, + YQTreeItem * parent, + YTreeItem * origItem, + int serial ); + + /** + * Returns the original YTreeItem of which this item is a clone. + **/ + YTreeItem * origItem() { return _origItem; } + + /** + * Open this item. + * + * Reimplemented from QListViewItem. + **/ + virtual void setOpen( bool open ); + + +private: + + /** + * Init function. All constructors end up here. + **/ + void init( YQTree * tree, + YTreeItem * yTreeItem, + int serial ); + + +protected: + + /** + * Sort key of this item. + * + * Reimplemented from QListViewItem. + **/ + QString key( int column, bool ascending ) const; + + + // + // Data members + // + + YQTree * _tree; + YTreeItem * _origItem; + int _serialNo; + +}; + + +#endif // ifndef YQTree_h diff --git a/src/YQUI.h b/src/YQUI.h new file mode 100644 index 0000000..8c61403 --- /dev/null +++ b/src/YQUI.h @@ -0,0 +1,674 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQUI.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQUI_h +#define YQUI_h + +#include +#include +#include +#include + +#include "YSimpleEventHandler.h" +#include + +#define YQWidgetMargin 4 +#define YQWidgetSpacing 4 +#define YQButtonBorder 3 + +class QCursor; +class QVBox; +class QWidgetStack; +class QY2Settings; +class YEvent; +class YQOptionalWidgetFactory; +class YQPackageSelectorPlugin; +class YQWidgetFactory; +class YQApplication; + +using std::string; +using std::vector; + + +class YQUI: public QObject, public YUI +{ + Q_OBJECT +public: + + /** + * Constructor. + **/ + YQUI( int argc, + char ** argv, + bool with_threads, + const char * macro_file ); + + /** + * Destructor. + **/ + ~YQUI(); + + /** + * Access the global Qt-UI. + **/ + static YQUI * ui() { return _ui; } + + +protected: + /** + * Create the widget factory that provides all the createXY() methods for + * standard (mandatory, i.e. non-optional) widgets. + * + * Reimplemented from YUI. + **/ + virtual YWidgetFactory * createWidgetFactory(); + + /** + * Create the widget factory that provides all the createXY() methods for + * optional ("special") widgets and the corresponding hasXYWidget() + * methods. + * + * Reimplemented from YUI. + **/ + virtual YOptionalWidgetFactory * createOptionalWidgetFactory(); + + /* + * Create the YApplication object that provides global methods. + * + * Reimplemented from YUI. + **/ + virtual YApplication * createApplication(); + +public: + + /** + * Return the global YApplication object as YQApplication. + * + * This will create the Y(Q)Application upon the first call and return a + * pointer to the one and only (singleton) Y(Q)Application upon each + * subsequent call. This may throw exceptions if the Y(Q)Application + * cannot be created. + **/ + static YQApplication * yqApp(); + + /** + * Widget event handlers (slots) call this when an event occured that + * should be the answer to a UserInput() / PollInput() (etc.) call. + * + * The UI assumes ownership of the event object that 'event' points to. + * In particular, it takes care to delete that object. + * + * It is an error to pass 0 for 'event'. + **/ + void sendEvent( YEvent * event ); + + /** + * Returns 'true' if there is any event pending for the specified widget. + **/ + bool eventPendingFor( YWidget * widget ) const + { return _event_handler.eventPendingFor( widget ); } + + /** + * Returns the last event that isn't processed yet or 0 if there is none. + * + * The Qt UI keeps track of only one single (the last one) event. + **/ + YEvent * pendingEvent() const { return _event_handler.pendingEvent(); } + + /** + * Returns 'false" if the "--no-wm" was specified on the command line, i.e. + * we should assume no window manager is running. + **/ + bool haveWM() const { return _have_wm; } + + /** + * Returns 'true' if defaultsize windows should use the full screen. + **/ + bool fullscreen() const { return _fullscreen; } + + /** + * Returns 'false' if toplevel (defaultsize) windows should not get window + * manager decorations, i.e. "--noborder" was specified on the command + * line. + **/ + bool decorateToplevelWindow() const { return _decorate_toplevel_window; } + + /** + * Returns 'true' if the UI had a fatal error that requires the application + * to abort. + **/ + bool fatalError() const { return _fatal_error; } + + /** + * Raise a fatal UI error. It will be delivered when it is safe to do so. + * The caller should make sure it can continue for some time until the + * error is delivered. + **/ + void raiseFatalError() { _fatal_error = true; } + + /** + * Returns size for `opt(`defaultsize) dialogs (in one dimension). + **/ + int defaultSize( YUIDimension dim ) const; + + /** + * Make a screen shot in .png format and save it to 'filename'. + * Opens a file selection box if 'filename' is empty. + **/ + void makeScreenShot( string filename ); + + /** + * UI-specific runPkgSeleciton method: Start the package selection. + * This implementation does the same as UserInput(). + * + * Reimplemented from YUI. + **/ + YCPValue runPkgSelection( YWidget * packageSelector ); + + /** + * Toggle macro recording (activated by Ctrl-Shift-Alt-M): + * Stop macro recording if it is in progress, + * open a file selection box and ask for a macro file name to save to and + * start recording if no recording has been in progress. + **/ + void toggleRecordMacro(); + + /** + * Open file selection box and ask for a macro file to play + * (activated by Ctrl-Shift-Alt-P) + **/ + void askPlayMacro(); + + /** + * Issue an internal error: Open popup with that message and wait. + * + * Reimplemented from YUI. + **/ + void internalError( const char * msg ); + + + /** + * Block WM_CLOSE events for the main window. + **/ + void blockWmClose() { _wm_close_blocked = true; } + + /** + * Unblock WM_CLOSE events for the main window. + **/ + void unblockWmClose() { _wm_close_blocked = false; } + + /** + * Check if dialogs are to be activated automatically + **/ + bool autoActivateDialogs() const { return _auto_activate_dialogs; } + + /** + * Change automatic dialog activation + **/ + void setAutoActivateDialogs( bool activate ) + { _auto_activate_dialogs = activate; } + + /** + * Block (or unblock) events. If events are blocked, any event sent + * should be ignored until events are unblocked again. + * + * Reimplemented from YUI. + **/ + virtual void blockEvents( bool block = true ) + { _event_handler.blockEvents( block ); } + + /** + * Returns 'true' if events are currently blocked. + * + * Reimplemented from YUI. + **/ + virtual bool eventsBlocked() const + { return _event_handler.eventsBlocked(); } + + /** + * Returns the current product name + * ("SuSE Linux", "SuSE Linux Enterprise Server", "United Linux", etc.) + * as QString. + **/ + QString productName() const; + + /** + * Beep - activate the system (X11) bell. + * + * Reimplemented from YUI. + **/ + void beep(); + + +public slots: + + /** + * Show hourglass cursor. + * + * Reimplemented from YUI. + **/ + void busyCursor(); + + /** + * Show pointer cursor. + * + * Reimplemented from YUI. + **/ + void normalCursor(); + + /** + * Open file selection box and let the user Save y2logs to that location. + * (Shift-F8) + **/ + void askSaveLogs(); + + /** + * Open dialog to configure logging. + * (Shift-F7) + **/ + void askConfigureLogging(); + + /** + * Fun stuff (release dependent) + **/ + void easterEgg(); + + /** + * A mouse click with the wrong mouse button was detected - e.g., a right + * click on a push button. The user might be left-handed, but his mouse + * might not (yet) be configured for left-handed use - e.g., during + * installation. Ask him if he would like his mouse temporarily configured + * as a left-handed mouse. + * + * This status can be queried with UI::GetDisplayInfo() ("LeftHandedMouse"). + **/ + void maybeLeftHandedUser(); + + +signals: + /** + * Emitted upon WM_CLOSE + **/ + void wmClose(); + + +protected: + + /** + * Idle around until fd_ycp is readable and handle repaints. + * This is only used when a separate ui thread is running. + * + * Reimplemented from YUI. + **/ + void idleLoop( int fd_ycp ); + + /** + * Return a representation for the glyph symbol specified in UTF-8 encoding + * or an empty string to get a default textual representation. + * + * Reimplemented from YUI. + **/ + YCPString glyph( const YCPSymbol & glyphSymbol ); + + /** + * Go into event loop until next user input is available. + * + * Reimplemented from YUI. + **/ + YEvent * userInput( unsigned long timeout_millisec = 0 ); + + /** + * Check the event queue for user input. Don't wait. + * + * Reimplemented from YUI. + **/ + YEvent * pollInput(); + + /** + * Create a dialog. + * + * Reimplemented from YUI. + **/ + YDialog * createDialog( YWidgetOpt & opt ); + + /** + * Show and activate a dialog. + * + * Reimplemented from YUI. + **/ + void showDialog( YDialog * dialog ); + + /** + * Decativate and close a dialog. This does not delete the dialog yet. + * + * Reimplemented from YUI. + **/ + void closeDialog( YDialog * dialog ); + + /** + * Grab show events and work around QWidgetStack bug. + * + * Reimplemented from QObject. + **/ + bool eventFilter( QObject * obj, QEvent * ev ); + + /** + * Make all UI windows usable without a mouse - even predefined Qt dialogs + * that don't know the UI's dialogs' activate() magic. + * + * Reimplemented from QObject. + **/ + bool showEventFilter( QObject * obj, QEvent * ev ); + + +public: + + /** + * + * Open a directory selection box and prompt the user for an existing directory. + * [Reimplemented from YUI] + * + * 'startDir' is the initial directory that is displayed. + * + * 'headline' is an explanatory text for the directory selection box. + * Graphical UIs may omit that if no window manager is running. + * + * Returns the selected directory name + * or 'nil' (YCPVoid() ) if the user canceled the operation. + **/ + YCPValue askForExistingDirectory ( const YCPString & startDir, + const YCPString & headline ); + + /** + * Open a file selection box and prompt the user for an existing file. + * [Reimplemented from YUI] + * + * 'startWith' is the initial directory or file. + * + * 'filter' is one or more blank-separated file patterns, e.g. "*.png *.jpg" + * + * 'headline' is an explanatory text for the file selection box. + * Graphical UIs may omit that if no window manager is running. + * + * Returns the selected file name + * or 'nil' (YCPVoid() ) if the user canceled the operation. + **/ + YCPValue askForExistingFile ( const YCPString & startWith, + const YCPString & filter, + const YCPString & headline ); + + /** + * Open a file selection box and prompt the user for a file to save data to. + * Automatically asks for confirmation if the user selects an existing file. + * [Reimplemented from YUI] + * + * 'startWith' is the initial directory or file. + * + * 'filter' is one or more blank-separated file patterns, e.g. "*.png *.jpg" + * + * 'headline' is an explanatory text for the file selection box. + * Graphical UIs may omit that if no window manager is running. + * + * Returns the selected file name + * or 'nil' (YCPVoid() ) if the user canceled the operation. + **/ + YCPValue askForSaveFileName ( const YCPString & startWith, + const YCPString & filter, + const YCPString & headline ); + + /** + * Lower-level version that works with QStrings and does not change + * the mouse cursor. + **/ + QString askForSaveFileName( const QString & startWith, + const QString & filter, + const QString & headline ); + + /** + * main widget + **/ + QWidget* mainWidget(); + + /** + * Initialize and set a textdomain for gettext() + **/ + static void setTextdomain( const char * domain ); + + /** + * Returns a high-contrast color palette suitable for vision impaired users. + **/ + static QPalette visionImpairedPalette(); + + /** + * Returns the normal color palette + **/ + QPalette normalPalette() const { return _normalPalette; } + + /** + * Toggle between the vision impaired and the normal color palette. + **/ + void toggleVisionImpairedPalette(); + + /** + * Returns 'true' if high-contrast colors for vision impaired users is in use. + * This should be queried at other places before using custom colors. + **/ + bool usingVisionImpairedPalette() const { return _usingVisionImpairedPalette; } + + /** + * Convert logical layout spacing units into device dependent units. + * A default size dialog is assumed to be 80x25 layout spacing units + * and 640x480 device dependent spacing units. + * + * Reimplemented from YUI. + **/ + virtual int deviceUnits( YUIDimension dim, float layout_units ); + + /** + * Convert device dependent units into logical layout spacing units. + * A default size dialog is assumed to be 80x25 layout spacing units + * and 640x480 device dependent spacing units. + * + * Reimplemented from YUI. + **/ + virtual float layoutUnits( YUIDimension dim, int device_units ); + + /** + * Returns the package selector plugin singleton of this UI or creates it + * (including loading the plugin lib) if it does not exist yet. + **/ + YQPackageSelectorPlugin * packageSelectorPlugin(); + + +protected: + + /** + * Display capabilities. + * [Reimplemented from YUI] + * See UI builtin GetDisplayInfo() doc for details. + **/ + int getDisplayWidth(); + int getDisplayHeight(); + int getDisplayDepth(); + long getDisplayColors(); + int getDefaultWidth(); + int getDefaultHeight(); + bool textMode() { return false; } + bool hasImageSupport() { return true; } + bool hasLocalImageSupport() { return true; } + bool hasAnimationSupport() { return true; } + bool hasIconSupport() { return false; } // not yet + bool hasFullUtf8Support() { return true; } + bool richTextSupportsTable() { return true; } + bool leftHandedMouse() { return _leftHandedMouse; } + + + QMap screenShotNo; + QString screenShotNameTemplate; + + +protected slots: + + /** + * Application shutdown + **/ + bool close(); + + /** + * Timeout during TimeoutUserInput() / WaitForEvent() + **/ + void userInputTimeout(); + + /** + * Sets @ref #leave_idle_loop to true. + **/ + void leaveIdleLoop( int ); + + +protected: + + /** + * Handle command line args + **/ + void processCommandLineArgs( int argc, char **argv ); + + /** + * Calculate size of `opt(`defaultsize) dialogs + **/ + void calcDefaultSize(); + + + // + // Data members + // + + /** + * Assume presence of a window manager + **/ + bool _have_wm; + + /** + * Use the entire available screen + **/ + bool _fullscreen; + + /** + * Decorate the toplevel window + **/ + bool _decorate_toplevel_window; + + /** + * Container for the widget stack. QWidgetStack cannot handle a WFlags + * argument, so this needs to be embedded into something else - and a QVBox + * at least handles all the sizeHint and resize stuff. + **/ + QVBox * _main_win; + + /** + * Stack for the Qt widgets inside the main window. + **/ + QWidgetStack * _widget_stack; + + /** + * Stack to keep track of the stacking order of popup dialogs. + **/ + vector _popup_stack; + + /** + * Numeric ID for defaultsize dialogs for the widget stack + **/ + int _main_dialog_id; + + /** + * Size for `opt(`defaultsize) dialogs. + **/ + QSize _default_size; + + /** + * A flag used during the idle loop. If it is set to true, + * the idle loop is left. This happens, if the ycp-ui-communication + * pipe to the ui gets readable. + **/ + bool _leave_idle_loop; + + /** + * This flag is set during @ref #userInput in order to tell + * @ref #returnNow to call exit_loop, which only may be called + * after enter_loop. + **/ + bool _do_exit_loop; + + /** + * Window manager close events blocked? + **/ + bool _wm_close_blocked; + + /** + * Force new dialogs to the foreground and grab the keyboard focus? + * (Only if running without a window manager) + **/ + bool _auto_activate_dialogs; + + /** + * Global reference to the UI + **/ + static YQUI * _ui; + + /** + * Indicate a fatal error that requires the UI to terminate + **/ + bool _fatal_error; + + /** + * Timer for TimeoutUserInput() / WaitForEvent(). + **/ + QTimer _user_input_timer; + + /** + * Timer for delayed busy cursor + **/ + QTimer _busy_cursor_timer; + + /** + * The handler for the single pending event this UI keeps track of + **/ + YSimpleEventHandler _event_handler; + + /** + * Saved normal palette + **/ + QPalette _normalPalette; + + /** + * Flag: currently using special palette for vision impaired users? + **/ + bool _usingVisionImpairedPalette; + + /** + * Flag: Does the user want to use a left-handed mouse? + **/ + bool _leftHandedMouse; + + /** + * Flag: Was the user already asked if he wants to use a left-handed mouse? + **/ + bool _askedForLeftHandedMouse; +}; + + +#endif // YQUI_h diff --git a/src/YQUIComponent.h b/src/YQUIComponent.h new file mode 100644 index 0000000..758c01c --- /dev/null +++ b/src/YQUIComponent.h @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQUIComponent.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQUIComponent_h +#define YQUIComponent_h + +#include +#include "YQUI.h" + + +class YQUIComponent : public YUIComponent +{ +public: + + YQUIComponent(): YUIComponent() {} + + /** + * Create a Qt UI. This is called from within setServerOptions(). + * + * Reimplemented from YUIComponent. + **/ + virtual YUI * createUI( int argc, char **argv, bool with_threads, const char * macro_file ) + { + return new YQUI( argc, argv, with_threads, macro_file ); + } + + /** + * Returns the name of this YaST2 component. + * + * Reimplemented from YUIComponent. + **/ + virtual string name() const { return "qt"; } + +}; + + +#endif // YQUIComponent_h diff --git a/src/YQUI_builtins.cc b/src/YQUI_builtins.cc new file mode 100644 index 0000000..a200bda --- /dev/null +++ b/src/YQUI_builtins.cc @@ -0,0 +1,476 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YUIQt_builtins.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define USE_QT_CURSORS 1 +#define FORCE_UNICODE_FONT 0 + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#define y2log_component "qt-ui" +#include + +#include "YQUI.h" +#include "YEvent.h" +#include "YMacroRecorder.h" +#include "YUISymbols.h" +#include "YQDialog.h" +#include "YQSignalBlocker.h" + +#include "utf8.h" +#include "YQi18n.h" + +#include + + +#define DEFAULT_MACRO_FILE_NAME "macro.ycp" + + + +YCPString +YQUI::glyph( const YCPSymbol & glyphSymbol ) +{ + string sym = glyphSymbol->symbol(); + QChar unicodeChar; + + // Hint: Use 'xfd' to view characters available in the Unicode font. + + if ( sym == YUIGlyph_ArrowLeft ) unicodeChar = QChar( 0x2190 ); + else if ( sym == YUIGlyph_ArrowRight ) unicodeChar = QChar( 0x2192 ); + else if ( sym == YUIGlyph_ArrowUp ) unicodeChar = QChar( 0x2191 ); + else if ( sym == YUIGlyph_ArrowDown ) unicodeChar = QChar( 0x2193 ); + else if ( sym == YUIGlyph_CheckMark ) unicodeChar = QChar( 0x2714 ); + else if ( sym == YUIGlyph_BulletArrowRight ) unicodeChar = QChar( 0x279c ); + else if ( sym == YUIGlyph_BulletCircle ) unicodeChar = QChar( 0x274d ); + else if ( sym == YUIGlyph_BulletSquare ) unicodeChar = QChar( 0x274f ); + else return YCPString( "" ); + + QString qstr( unicodeChar ); + + return YCPString( toUTF8( qstr ) ); +} + + +YCPValue YQUI::runPkgSelection( YWidget * packageSelector ) +{ + y2milestone( "Running package selection..." ); + _wm_close_blocked = true; + _auto_activate_dialogs = false; + + YCPValue input = YCPVoid(); + + try + { + input = evaluateUserInput(); + } + catch (const std::exception & e) + { + y2error( "Caught std::exception: %s", e.what() ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + catch (...) + { + y2error( "Caught unspecified exception." ); + y2error( "This is a libzypp problem. Do not file a bug against the UI!" ); + } + + _auto_activate_dialogs = true; + _wm_close_blocked = false; + y2milestone( "Package selection done - returning %s", input->toString().c_str() ); + + return input; +} + + +void YQUI::makeScreenShot( std::string stl_filename ) +{ + + // + // Grab the pixels off the screen + // + + QWidget * dialog = (QWidget *) YDialog::currentDialog()->widgetRep(); + QPixmap screenShot = QPixmap::grabWindow( dialog->winId() ); + XSync( dialog->x11Display(), false ); + QString fileName ( stl_filename.c_str() ); + bool interactive = false; + + if ( fileName.isEmpty() ) + { + interactive = true; + + // Open a file selection box. Figure out a reasonable default + // directory / file name. + + if ( screenShotNameTemplate.isEmpty() ) + { + // + // Initialize screen shot directory + // + + QString home = QDir::homeDirPath(); + char * ssdir = getenv("Y2SCREENSHOTS"); + QString dir = ssdir ? ssdir : "yast2-screen-shots"; + + if ( home == "/" ) + { + // Special case: $HOME is not set. This is normal in the inst-sys. + // In this case, rather than simply dumping all screen shots into + // /tmp which is world-writable, let's try to create a subdirectory + // below /tmp with restrictive permissions. + // If that fails, trust nobody - in particular, do not suggest /tmp + // as the default in the file selection box. + + dir = "/tmp/" + dir; + + if ( mkdir( dir, 0700 ) == -1 ) + dir = ""; + } + else + { + // For all others let's create a directory ~/yast2-screen-shots and + // simply ignore if this is already present. This gives the user a + // chance to create symlinks to a better location if he wishes so. + + dir = home + "/" + dir; + (void) mkdir( dir, 0750 ); + } + + screenShotNameTemplate = dir + "/%s-%03d.png"; + } + + + // + // Figure out a file name + // + + const char * baseName = moduleName(); + if ( ! baseName ) baseName = "scr"; + int no = screenShotNo[ baseName ]; + fileName.sprintf( screenShotNameTemplate, baseName, no ); + y2debug( "screenshot: %s", (const char *) fileName ); + + { + YQSignalBlocker sigBlocker( &_user_input_timer ); + + fileName = askForSaveFileName( fileName, QString( "*.png" ) , _( "Save screen shot to..." ) ); + } + + if ( fileName.isEmpty() ) + { + y2debug( "Save screen shot canceled by user" ); + return; + } + + screenShotNo.insert( baseName, ++no ); + } // if fileName.isEmpty() + + + // + // Actually save the screen shot + // + + y2debug( "Saving screen shot to %s", (const char *) fileName ); + bool success = screenShot.save( fileName, "PNG" ); + + if ( ! success ) + { + y2error( "Couldn't save screen shot %s", (const char *) fileName ); + + if ( interactive ) + { + QMessageBox::warning( 0, // parent + "Error", // caption + QString( "Couldn't save screen shot\nto %1" ).arg( fileName ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + } + + if ( recordingMacro() ) + { + macroRecorder->beginBlock(); + YDialog::currentDialog()->saveUserInput( macroRecorder ); + macroRecorder->recordMakeScreenShot( true, (const char *) fileName ); + macroRecorder->recordUserInput( YCPVoid() ); + macroRecorder->endBlock(); + } +} + + +void YQUI::askSaveLogs() +{ + QString fileName = askForSaveFileName( "/tmp/y2logs.tgz", // startWith + "*.tgz *.tar.gz", // filter + "Save y2logs to..." ); // headline + + if ( ! fileName.isEmpty() ) + { + QString saveLogsCommand = "/sbin/save_y2logs"; + + if ( access( saveLogsCommand.ascii(), X_OK ) == 0 ) + { + saveLogsCommand += " '" + fileName + "'"; + y2milestone( "Saving y2logs: %s", saveLogsCommand.ascii() ); + int result = system( saveLogsCommand.ascii() ); + + if ( result != 0 ) + { + y2error( "Error saving y2logs: \"%s\" exited with %d", + (const char *) saveLogsCommand, result ); + QMessageBox::warning( 0, // parent + "Error", // caption + QString( "Couldn't save y2logs to %1 - " + "exit code %2" ).arg( fileName ).arg( result ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + else + { + y2milestone( "y2logs saved to %s", (const char *) fileName ); + } + } + else + { + y2error( "Error saving y2logs: Command %s not found", + saveLogsCommand.ascii() ); + + QMessageBox::warning( 0, // parent + "Error", // caption + QString( "Couldn't save y2logs to %1:\n" + "Command %2 not found" ).arg( fileName ).arg( saveLogsCommand ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + } +} + + +void YQUI::askConfigureLogging() +{ + bool okButtonPressed = false; + QStringList items; + items << "Debug logging off" + << "Debug logging on"; + + QString result = QInputDialog::getItem( "YaST2 Logging", // caption + "Configure YaST2 Logging:", // label + items, + get_log_debug() ? 1 : 0, + false, // editable + &okButtonPressed, + _main_win ); // parent + + if ( okButtonPressed ) + { + set_log_debug( result.endsWith( "on" ) ); + y2milestone( "Changing logging: %s - %s", (const char *) result, + get_log_debug() ? "y2debug on" : "y2debug off" ); + } +} + + +void YQUI::toggleRecordMacro() +{ + if ( recordingMacro() ) + { + stopRecordMacro(); + normalCursor(); + + QMessageBox::information( 0, // parent + "YaST2 Macro Recorder", // caption + "Macro recording done.", // text + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + else + { + normalCursor(); + + QString filename = + QFileDialog::getSaveFileName( DEFAULT_MACRO_FILE_NAME, // startWith + "*.ycp", // filter + 0, // parent + 0, // (widget) name + "Select Macro File to Record to" ); // caption + + if ( ! filename.isEmpty() ) // file selection dialog has been cancelled + { + recordMacro( (const char *) filename ); + } + } +} + + +void YQUI::askPlayMacro() +{ + normalCursor(); + + QString filename = + QFileDialog::getOpenFileName( DEFAULT_MACRO_FILE_NAME, // startWith + "*.ycp", // filter + 0, // parent + 0, // (widget) name + "Select Macro File to Play" ); // caption + busyCursor(); + + if ( ! filename.isEmpty() ) // file selection dialog has been cancelled + { + playMacro( (const char *) filename ); + + // Do special magic to get out of any UserInput() loop right now + // without doing any harm - otherwise this would hang until the next + // mouse click on a PushButton etc. + + sendEvent( new YEvent() ); + + if ( _do_exit_loop ) + { + qApp->exit_loop(); + } + } +} + + + +YCPValue YQUI::askForExistingDirectory( const YCPString & startDir, + const YCPString & headline ) +{ + normalCursor(); + + QString dir_name = + QFileDialog::getExistingDirectory( fromUTF8( startDir->value() ), + _main_win, // parent + "dir_selector", // name + fromUTF8( headline->value() ) ); // caption + busyCursor(); + + if ( dir_name.isEmpty() ) // this includes dir_name.isNull() + return YCPVoid(); // nothing selected -> return 'nil' + + return YCPString( toUTF8( dir_name ) ); +} + + +YCPValue YQUI::askForExistingFile( const YCPString & startWith, + const YCPString & filter, + const YCPString & headline ) +{ + normalCursor(); + + QString file_name = + QFileDialog::getOpenFileName( fromUTF8( startWith->value() ), + fromUTF8( filter->value() ), + _main_win, // parent + "file_selector", // name + fromUTF8( headline->value() ) ); // caption + busyCursor(); + + if ( file_name.isEmpty() ) // this includes file_name.isNull() + return YCPVoid(); // nothing selected -> return 'nil' + + return YCPString( toUTF8( file_name ) ); +} + + +YCPValue YQUI::askForSaveFileName( const YCPString & startWith, + const YCPString & filter, + const YCPString & headline ) +{ + normalCursor(); + + QString file_name = askForSaveFileName( fromUTF8( startWith->value() ), + fromUTF8( filter->value() ), + fromUTF8( headline->value() ) ); + busyCursor(); + + if ( file_name.isEmpty() ) // this includes file_name.isNull() + return YCPVoid(); // nothing selected -> return 'nil' + + return YCPString( toUTF8( file_name ) ); +} + + + +QString YQUI::askForSaveFileName( const QString & startWith, + const QString & filter, + const QString & headline ) +{ + QString file_name; + bool try_again = false; + + do + { + // Leave the mouse cursor alone - this function might be called from + // some other widget, not only from UI::AskForSaveFileName(). + + file_name = QFileDialog::getSaveFileName( startWith, + filter, + _main_win, // parent + "file_selector", // name + headline ); // caption + + if ( file_name.isEmpty() ) // this includes file_name.isNull() + return QString::null; + + + if ( access( (const char *) file_name, F_OK ) == 0 ) // file exists? + { + QString msg; + + if ( access( (const char *) file_name, W_OK ) == 0 ) + { + // Confirm if the user wishes to overwrite an existing file + msg = ( _( "%1 exists! Really overwrite?" ) ).arg( file_name ); + } + else + { + // Confirm if the user wishes to overwrite a write-protected file %1 + msg = ( _( "%1 exists and is write-protected!\nReally overwrite?" ) ).arg( file_name ); + } + + int button_no = QMessageBox::information( _main_win, + // Window title for confirmation dialog + _( "Confirm" ), + msg, + _( "C&ontinue" ), + _( "&Cancel" ) ); + try_again = ( button_no != 0 ); + } + + } while ( try_again ); + + return file_name; +} + + +// EOF diff --git a/src/YQUI_core.cc b/src/YQUI_core.cc new file mode 100644 index 0000000..76c524b --- /dev/null +++ b/src/YQUI_core.cc @@ -0,0 +1,650 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQUI_core.cc + + Author: Stefan Hundhammer + +/-*/ + +#include // MAXHOSTNAMELEN +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#define y2log_component "qt-ui" +#include + +#include "YQUI.h" +#include "YQApplication.h" +#include "YQWidgetFactory.h" +#include "YQOptionalWidgetFactory.h" +#include "YEvent.h" +#include "YUISymbols.h" +#include "YQEBunny.h" +#include "utf8.h" + +#include "YQDialog.h" +#include "QY2Settings.h" + + +#define BUSY_CURSOR_TIMEOUT 200 // milliseconds +#define KYAST_EMBEDDING 0 + + +YQUI * YQUI::_ui = 0; + + +static void qMessageHandler( QtMsgType type, const char * msg ); + +YQUI::YQUI( int argc, char **argv, bool with_threads, const char * macro_file ) + : QObject() + , YUI( with_threads ) + , _main_win( NULL ) + , _main_dialog_id(0) + , _do_exit_loop( false ) + , _wm_close_blocked( false ) + , _auto_activate_dialogs( true ) +{ + y2debug( "YQUI constructor start" ); + + _ui = this; + _fatal_error = false; + _have_wm = true; + _fullscreen = false; + _decorate_toplevel_window = true; + _usingVisionImpairedPalette = false; + _leftHandedMouse = false; + _askedForLeftHandedMouse = false; + screenShotNameTemplate = ""; + + qInstallMsgHandler( qMessageHandler ); + + y2debug( "Creating QApplication" ); + new QApplication( argc, argv ); + + _normalPalette = qApp->palette(); + + // Qt keeps track to a global QApplication in qApp. + CHECK_PTR( qApp ); + + qApp->installEventFilter( this ); + processCommandLineArgs( argc, argv ); + calcDefaultSize(); + + + // Create main window for `opt(`defaultsize) dialogs. + // + // We have to use something else than QWidgetStack since QWidgetStack + // doesn't accept a WFlags arg which we badly need here. + + WFlags wflags = WType_TopLevel; + + if ( ! _decorate_toplevel_window ) + { + y2debug( "Suppressing WM decorations for toplevel window" ); + wflags |= WStyle_Customize | WStyle_NoBorder; + } + + // if we have a window already, delete it + if (_main_win) + delete _main_win; + + _main_win = new QVBox( 0, 0, wflags ); // parent, name, wflags + + + // Create widget stack for `opt(`defaultsize) dialogs + + _widget_stack = new QWidgetStack( _main_win ); + _widget_stack->setFocusPolicy( QWidget::StrongFocus ); + qApp->setMainWidget( _main_win ); + _main_win->installEventFilter( this ); + _main_win->resize( _default_size ); + + if ( _fullscreen || ! _have_wm ) + _main_win->move( 0, 0 ); + + + // Set window title + + QString title( "YaST2" ); + char hostname[ MAXHOSTNAMELEN+1 ]; + + if ( gethostname( hostname, sizeof( hostname )-1 ) == 0 ) + { + hostname[ sizeof( hostname ) -1 ] = '\0'; // make sure it's terminated + + if ( strlen( hostname ) > 0 ) + { + if ( ( strcmp( hostname, "(none)" ) != 0 && + strcmp( hostname, "linux" ) != 0 ) ) + { + title += "@"; + title += hostname; + } + } + } + + _main_win->setCaption( title ); + + + // Hide the main window for now. The first call to UI::OpenDialog() on an + // `opt(`defaultSize) dialog will trigger a showDialog() call that shows + // the main window - there is nothing to display yet. + + _main_win->hide(); + + + // Ugly hack as a workaround of bug #121872 (Segfault at program exit + // if no Qt style defined): + // + // Qt does not seem to be designed for use in plugin libs. It loads some + // add-on libs dynamically with dlopen() and unloads them at program exit + // (QGPluginManager). Unfortunately, since they all depend on the Qt master + // lib (libqt-mt) themselves, when they are unloading the last call to + // dlclose() for them causes the last reference to libqt-mt to vanish as + // well. Since libqt-mt is already in the process of destruction there is + // no more reference from the caller of libqt-mt, and the GLIBC decides + // that libqt-mt is not needed any more (zero references) and unmaps + // libqt-mt. When the static destructor of libqt-mt that triggered the + // cleanup in QGPluginManager returns, the code it is to return to is + // already unmapped, causing a segfault. + // + // Workaround: Keep one more reference to libqt-mt open - dlopen() it here + // and make sure there is no corresponding dlclose(). + + QString qt_lib_name = QString( QTLIBDIR "/libqt-mt.so.%1" ).arg( QT_VERSION >> 16 );; + void * qt_lib = dlopen( (const char *) qt_lib_name, RTLD_GLOBAL ); + y2milestone( "Forcing %s open %s", (const char *) qt_lib_name, + qt_lib ? "successful" : "failed" ); + + + // Init other stuff + + qApp->setFont( yqApp()->currentFont() ); + busyCursor(); + + connect( & _user_input_timer, SIGNAL( timeout() ), + this, SLOT ( userInputTimeout() ) ); + + connect( & _busy_cursor_timer, SIGNAL( timeout() ), + this, SLOT ( busyCursor() ) ); + + if ( macro_file ) + playMacro( macro_file ); + + + topmostConstructorHasFinished(); + + y2debug( "YQUI constructor end" ); +} + + +YQApplication * +YQUI::yqApp() +{ + return static_cast( app() ); +} + + +void YQUI::processCommandLineArgs( int argc, char **argv ) +{ + if ( argv ) + { + for( int i=0; i < argc; i++ ) + { + QString opt = argv[i]; + + y2milestone ("Qt argument: %s", argv[i]); + + // Normalize command line option - accept "--xy" as well as "-xy" + + if ( opt.startsWith( "--" ) ) + opt.remove(0, 1); + + if ( opt == QString( "-no-wm" ) ) _have_wm = false; + else if ( opt == QString( "-fullscreen" ) ) _fullscreen = true; + else if ( opt == QString( "-noborder" ) ) _decorate_toplevel_window = false; + else if ( opt == QString( "-auto-font" ) ) yqApp()->setAutoFonts( true ); + else if ( opt == QString( "-auto-fonts" ) ) yqApp()->setAutoFonts( true ); + // --macro is handled by YUI_component + else if ( opt == QString( "-help" ) ) + { + fprintf( stderr, + "Command line options for the YaST2 Qt UI:\n" + "\n" + "--nothreads run without additional UI threads\n" + "--no-wm assume no window manager is running\n" + "--fullscreen use full screen for `opt(`defaultsize) dialogs\n" + "--noborder no window manager border for `opt(`defaultsize) dialogs\n" + "--auto-fonts automatically pick fonts, disregard Qt standard settings\n" + "--help this help text\n" + "\n" + "--macro play a macro right on startup\n" + "\n" + "-no-wm, -noborder etc. are accepted as well as --no-wm, --noborder\n" + "to maintain backwards compatibility.\n" + "\n" + ); + + raiseFatalError(); + } + } + } + + // Qt handles command line option "-reverse" for Arabic / Hebrew +} + + + +YQUI::~YQUI() +{ + y2debug("Closing down Qt UI."); + + normalCursor(); + + // Intentionally NOT calling dlclose() to libqt-mt + // (see constructor for explanation) +} + + + +YWidgetFactory * +YQUI::createWidgetFactory() +{ + YQWidgetFactory * factory = new YQWidgetFactory(); + YUI_CHECK_NEW( factory ); + + return factory; +} + + + +YOptionalWidgetFactory * +YQUI::createOptionalWidgetFactory() +{ + YQOptionalWidgetFactory * factory = new YQOptionalWidgetFactory(); + YUI_CHECK_NEW( factory ); + + return factory; +} + + +YApplication * +YQUI::createApplication() +{ + YQApplication * app = new YQApplication(); + YUI_CHECK_NEW( app ); + + return app; +} + + +void YQUI::calcDefaultSize() +{ + QSize primaryScreenSize = qApp->desktop()->screenGeometry( qApp->desktop()->primaryScreen() ).size(); + QSize availableSize = qApp->desktop()->availableGeometry().size(); + + if ( _fullscreen ) + { + _default_size = availableSize; + + y2milestone( "-fullscreen: using %dx%d for `opt(`defaultsize)", + _default_size.width(), _default_size.height() ); + } + else if ( _have_wm ) + { + // Get _default_size via -geometry command line option (if set) + + QWidget * dummy = new QWidget(); + dummy->hide(); + qApp->setMainWidget( dummy ); + _default_size = dummy->size(); + + + // Set min defaultsize or figure one out if -geometry was not used + + if ( _default_size.width() < 800 || + _default_size.height() < 600 ) + { + if ( primaryScreenSize.width() >= 1024 && primaryScreenSize.height() >= 768 ) + { + // Scale down to 70% of screen size + + _default_size.setWidth ( max( (int) (availableSize.width() * 0.7), 800 ) ); + _default_size.setHeight( max( (int) (availableSize.height() * 0.7), 600 ) ); + } + else + { + _default_size = availableSize; + } + } + else + { + y2milestone( "Forced size (via -geometry): %dx%d", + _default_size.width(), _default_size.height() ); + } + } + else // ! _have_wm + { + _default_size = primaryScreenSize; + } + + + y2milestone( "Default size: %dx%d", _default_size.width(), _default_size.height() ); +} + + + +void YQUI::internalError( const char * msg ) +{ + normalCursor(); + int button = QMessageBox::critical( 0, "YaST2 Internal Error", msg, + QMessageBox::Abort | QMessageBox::Default, + 0 ); // button1 + busyCursor(); + + if ( button == QMessageBox::Abort ) + { + raiseFatalError(); + abort(); + + // exit() leaves a process running (WFM?), so this really seems to be + // the only way to make sure we are really going down. + } +} + + +void YQUI::idleLoop( int fd_ycp ) +{ + _leave_idle_loop = false; + + // process Qt events until fd_ycp is readable. + QSocketNotifier * notifier = new QSocketNotifier( fd_ycp, QSocketNotifier::Read ); + QObject::connect( notifier, SIGNAL( activated ( int ) ), + this, SLOT ( leaveIdleLoop( int ) ) ); + + notifier->setEnabled( true ); + + while ( !_leave_idle_loop ) + qApp->processOneEvent(); + + delete notifier; +} + + +void YQUI::leaveIdleLoop( int ) +{ + _leave_idle_loop = true; +} + + +void YQUI::sendEvent( YEvent * event ) +{ + if ( event ) + { + _event_handler.sendEvent( event ); + + if ( _do_exit_loop ) + qApp->exit_loop(); + } +} + + +YEvent * YQUI::userInput( unsigned long timeout_millisec ) +{ + YEvent * event = 0; + YQDialog * dialog = dynamic_cast ( YDialog::currentDialog( false ) ); + + if ( _user_input_timer.isActive() ) + _user_input_timer.stop(); + + if ( dialog ) + { + if ( timeout_millisec > 0 ) + _user_input_timer.start( timeout_millisec, true ); // single shot + + dialog->activate( true ); + + if ( qApp->focusWidget() ) + qApp->focusWidget()->setFocus(); + + normalCursor(); + _do_exit_loop = true; // should exit_loop() be called in sendEvent()? + + while ( ! pendingEvent() ) + { + qApp->enter_loop(); + } + + _do_exit_loop = false; + event = _event_handler.consumePendingEvent(); + dialog->activate( false ); + + // Display a busy cursor, but only if there is no other activity within + // BUSY_CURSOR_TIMEOUT milliseconds (avoid cursor flicker) + + _busy_cursor_timer.start( BUSY_CURSOR_TIMEOUT, true ); // single shot + } + + if ( _user_input_timer.isActive() ) + _user_input_timer.stop(); + + return event; +} + + +YEvent * YQUI::pollInput() +{ + YEvent * event = 0; + + if ( _user_input_timer.isActive() ) + _user_input_timer.stop(); + + if ( ! pendingEvent() ) + { + YQDialog * dialog = dynamic_cast ( YDialog::currentDialog( false ) ); + + if ( dialog ) + { + dialog->activate( true ); + qApp->processEvents(); + event = _event_handler.consumePendingEvent(); + dialog->activate( false ); + } + } + + if ( pendingEvent() ) + event = _event_handler.consumePendingEvent(); + + return event; +} + + +void YQUI::userInputTimeout() +{ + if ( ! pendingEvent() ) + sendEvent( new YTimeoutEvent() ); +} + + +YDialog * YQUI::createDialog( YWidgetOpt & opt ) +{ + bool has_defaultsize = opt.hasDefaultSize.value(); + QWidget * qt_parent = _main_win; + + // Popup dialogs get the topmost other popup dialog as their parent since + // some window managers (e.g., fvwm2 as used in the inst-sys) otherwise + // tend to confuse the stacking order of popup dialogs. + // + // This _popup_stack handling would be better placed in showDialog(), but we + // need the parent here for QWidget creation. libyui guarantees that each + // createDialog() will be followed by showDialog() for the same dialog + // without any chance for other dialogs to get in between. + + if ( ! has_defaultsize && ! _popup_stack.empty() ) + qt_parent = _popup_stack.back(); + + YQDialog * dialog = new YQDialog( opt, qt_parent, has_defaultsize ); + CHECK_PTR( dialog ); + + if ( ! has_defaultsize ) + _popup_stack.push_back( (QWidget *) dialog->widgetRep() ); + + return dialog; +} + + +void YQUI::showDialog( YDialog * dialog ) +{ + QWidget * qw = (QWidget *) dialog->widgetRep(); + + if ( ! qw ) + { + y2error( "No widgetRep() for dialog" ); + return; + } + + if ( dialog->hasDefaultSize() ) + { + _widget_stack->addWidget ( qw, ++_main_dialog_id ); + _widget_stack->raiseWidget( qw ); // maybe this is not necessary (?) + + if ( ! _main_win->isVisible() ) + { + // y2milestone( "Showing main window" ); + _main_win->resize( _default_size ); + + if ( ! _have_wm ) + _main_win->move( 0, 0 ); + + _main_win->show(); + qw->setFocus(); + } + } + else // non-defaultsize dialog + { + qw->show(); + } + + ( (YQDialog *) dialog)->ensureOnlyOneDefaultButton(); + qApp->processEvents(); +} + + +void YQUI::closeDialog( YDialog * dialog ) +{ + QWidget * qw = (QWidget *) dialog->widgetRep(); + + if ( ! qw ) + { + y2error( "No widgetRep() for dialog" ); + return; + } + + if ( dialog->hasDefaultSize() ) + { + _widget_stack->removeWidget( qw ); + + if ( --_main_dialog_id < 1 ) // nothing left on the stack + { + // y2milestone( "Hiding main window" ); + _main_win->hide(); + _main_dialog_id = 0; // this should not be necessary - but better be safe than sorry + } + else + { + // FIXME: This is anti-social behaviour - do this only in the inst-sys + _widget_stack->raiseWidget( _main_dialog_id ); + } + } + else // non-defaultsize dialog + { + qw->hide(); + + // Clean up the popup stack. libyui guarantees that a dialog will be + // deleted after closeDialog() so it is safe to pop that dialog from + // the popup stack here. + + if ( ! _popup_stack.empty() && _popup_stack.back() == qw ) + _popup_stack.pop_back(); + else + y2error( "Popup dialog stack corrupted!" ); + } +} + + +void YQUI::easterEgg() +{ + y2milestone( "Starting easter egg..." ); + + + YQEasterBunny::layEgg(); + y2milestone( "Done." ); + +#if 0 + // desktop()->repaint() has no effect - we need to do it the hard way. + system( "/usr/X11R6/bin/xrefresh" ); +#endif +} + + +QString YQUI::productName() const +{ + return fromUTF8( YUI::productName() ); +} + + +void +YQUI::setTextdomain( const char * domain ) +{ + bindtextdomain( domain, LOCALEDIR ); + bind_textdomain_codeset( domain, "utf8" ); + textdomain( domain ); + + // Make change known. + { + extern int _nl_msg_cat_cntr; + ++_nl_msg_cat_cntr; + } +} + + + +static void +qMessageHandler( QtMsgType type, const char * msg ) +{ + switch (type) + { + case QtDebugMsg: + y2debug ("qt-debug: %s\n", msg); + break; + case QtWarningMsg: + y2warning ("qt-warning: %s\n", msg); + break; + case QtFatalMsg: + y2internal ("qt-fatal: %s\n", msg); + exit (1); // qt does the same + } +} + + + +#include "YQUI.moc" diff --git a/src/YQUI_widgets.cc b/src/YQUI_widgets.cc new file mode 100644 index 0000000..04f2681 --- /dev/null +++ b/src/YQUI_widgets.cc @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YUIQt_widgets.cc + + Author: Stefan Hundhammer + +/-*/ + +#define y2log_component "qt-ui" +#include + +#include "YQUI.h" + +#include "YQDialog.h" +#include "YQPackageSelectorPlugin.h" + + + +YQPackageSelectorPlugin * YQUI::packageSelectorPlugin() +{ + static YQPackageSelectorPlugin * plugin = 0; + + if ( ! plugin ) + { + plugin = new YQPackageSelectorPlugin(); + + // This is a deliberate memory leak: If an application requires a + // PackageSelector, it is a package selection application by + // definition. In this case, the qt_pkg plugin is intentionally kept + // open to avoid repeated start-up cost of the plugin and libzypp. + } + + return plugin; +} + + + + +// EOF diff --git a/src/YQUI_x11.cc b/src/YQUI_x11.cc new file mode 100644 index 0000000..8408708 --- /dev/null +++ b/src/YQUI_x11.cc @@ -0,0 +1,335 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YUIQt_x11.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + + +#define y2log_component "qt-ui" +#include + +#include "YEvent.h" +#include "YQDialog.h" +#include "YQi18n.h" +#include "QY2Settings.h" +#include "YQUI.h" + +// Include low-level X headers AFTER Qt headers: +// X.h pollutes the global namespace (!!!) with pretty useless #defines +// like "Above", "Below" etc. that clash with some Qt headers. +#include + + +int YQUI::getDisplayWidth() +{ + return qApp->desktop()->width(); +} + + +int YQUI::getDisplayHeight() +{ + return qApp->desktop()->height(); +} + + +int YQUI::getDisplayDepth() +{ + return QColor::numBitPlanes(); +} + + +long YQUI::getDisplayColors() +{ + return 1L << QColor::numBitPlanes(); +} + + +int YQUI::getDefaultWidth() +{ + return _default_size.width(); +} + + +int YQUI::getDefaultHeight() +{ + return _default_size.height(); +} + + +int YQUI::defaultSize(YUIDimension dim) const +{ + if ( haveWM() ) + return dim == YD_HORIZ ? _default_size.width() : _default_size.height(); + else + return dim == YD_HORIZ ? qApp->desktop()->width() : qApp->desktop()->height(); +} + + +QWidget* YQUI::mainWidget() +{ + return _main_win; +}; + + +void YQUI::beep() +{ + qApp->beep(); +} + + +void +YQUI::busyCursor( void ) +{ + qApp->setOverrideCursor( Qt::busyCursor ); +} + + +void +YQUI::normalCursor( void ) +{ + if ( _busy_cursor_timer.isActive() ) + _busy_cursor_timer.stop(); + + while ( qApp->overrideCursor() ) + qApp->restoreOverrideCursor(); +} + + +void YQUI::toggleVisionImpairedPalette() +{ + if ( _usingVisionImpairedPalette ) + { + qApp->setPalette( normalPalette(), + true ); // informWidgets + + _usingVisionImpairedPalette = false; + } + else + { + qApp->setPalette( visionImpairedPalette(), + true ); // informWidgets + + _usingVisionImpairedPalette = true; + } +} + + +QPalette YQUI::visionImpairedPalette() +{ + const QColor dark ( 0x20, 0x20, 0x20 ); + + QColorGroup activeCg; // for the active window (the one with the keyboard focus) + + activeCg.setColor( QColorGroup::Background, Qt::black ); + activeCg.setColor( QColorGroup::Foreground, Qt::cyan ); + activeCg.setColor( QColorGroup::Text, Qt::cyan ); + activeCg.setColor( QColorGroup::Base, dark ); + activeCg.setColor( QColorGroup::Button, dark ); + activeCg.setColor( QColorGroup::ButtonText, Qt::green ); + activeCg.setColor( QColorGroup::Highlight, Qt::yellow ); + activeCg.setColor( QColorGroup::HighlightedText, Qt::black ); + + QColorGroup inactiveCg; // for other windows (those that don't have the keyboard focus) + + inactiveCg.setColor( QColorGroup::Background, Qt::black ); + inactiveCg.setColor( QColorGroup::Foreground, Qt::cyan ); + inactiveCg.setColor( QColorGroup::Text, Qt::cyan ); + inactiveCg.setColor( QColorGroup::Base, dark ); + inactiveCg.setColor( QColorGroup::Button, dark ); + inactiveCg.setColor( QColorGroup::ButtonText, Qt::green ); + + QColorGroup disabledCg; // for disabled widgets + + disabledCg.setColor( QColorGroup::Background, Qt::black ); + disabledCg.setColor( QColorGroup::Foreground, Qt::gray ); + disabledCg.setColor( QColorGroup::Text, Qt::gray ); + disabledCg.setColor( QColorGroup::Base, dark ); + disabledCg.setColor( QColorGroup::Button, dark ); + disabledCg.setColor( QColorGroup::ButtonText, Qt::gray ); + + QPalette pal( activeCg, disabledCg, inactiveCg ); + + return pal; +} + + +bool YQUI::close() +{ + sendEvent( new YCancelEvent() ); + return true; +} + + +bool YQUI::eventFilter( QObject * obj, QEvent * ev ) +{ + if ( ev->type() == QEvent::Close ) + { + // Handle WM_CLOSE - but only if it comes from a dialog that is managed by the UI, + // not from an independent Qt dialog (such as the package selector popups) + + QWidget * objDialog = 0; + + if ( obj && obj->isWidgetType() ) + { + objDialog = (QWidget *) obj; + objDialog = objDialog->topLevelWidget(); + } + + if ( objDialog && + ( objDialog == mainWidget() || + objDialog == (QObject *) YDialog::currentDialog()->widgetRep() ) ) + { + emit wmClose(); + + if ( ! _wm_close_blocked ) + { + // Don't simply close the application window, return from UserInput() + // with `id(`cancel) and let the YCP application decide how to handle + // that (e.g., ask for confirmation). + + y2debug( "Caught window close event - returning with `cancel" ); + sendEvent( new YCancelEvent() ); + } + + return true; // Event processed + } + } + else if ( ev->type() == QEvent::Show ) + { + if ( obj == _main_win ) + { + if ( _main_dialog_id > 0 ) + { + // Work around QWidgetStack bug: The last raiseWidget() call + // (from closeDialog() ) might have failed if the widget was + // invisible at that time, e.g., because the user had switched to + // some other virtual desktop (bugzilla bug #11310) + + _widget_stack->raiseWidget( _main_dialog_id ); + } + } + else + { + return showEventFilter( obj, ev ); + } + } + + return false; // Don't stop event processing +} + + +bool YQUI::showEventFilter( QObject * obj, QEvent * ev ) +{ + if ( ! haveWM() ) + { + // Make sure newly opened windows get the keyboard focus even without a + // window manager. Otherwise the app might be unusable without a mouse. + + QWidget * widget = dynamic_cast (obj); + + if ( widget ) + widget->setActiveWindow(); + } + + return false; // Don't stop event processing +} + + +/** + * UI-specific conversion from logical layout spacing units (80x25) + * to device dependent units (640x480). + **/ +int YQUI::deviceUnits( YUIDimension dim, float size ) +{ + if ( dim==YD_HORIZ ) size *= ( 640.0/80 ); + else size *= ( 480.0/25 ); + + return (int) ( size + 0.5 ); +} + + +/** + * Default conversion from device dependent layout spacing units (640x480) + * to logical layout units (80x25). + * + * This default function assumes 80x25 units. + * Derived UIs may want to reimplement this. + **/ +float YQUI::layoutUnits( YUIDimension dim, int device_units ) +{ + float size = (float) device_units; + + if ( dim==YD_HORIZ ) size *= ( 80/640.0 ); + else size *= ( 25/480.0 ); + + return size; +} + + +void YQUI::maybeLeftHandedUser() +{ + if ( _askedForLeftHandedMouse ) + return; + + + QString message = + _( "You clicked the right mouse button " + "where a left-click was expected." + "\n" + "Switch left and right mouse buttons?" + ); + int button = QMessageBox::question( 0, + // Popup dialog caption + _( "Unexpected Click" ), + message, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape ); + + if ( button == QMessageBox::Yes ) + { + + const char * command = + _leftHandedMouse ? + "xmodmap -e \"pointer = 1 2 3\"": // switch back to right-handed mouse + "xmodmap -e \"pointer = 3 2 1\""; // switch to left-handed mouse + + _leftHandedMouse = ! _leftHandedMouse; // might be set repeatedly! + _askedForLeftHandedMouse = false; // give the user a chance to switch back + y2milestone( "Switching mouse buttons: %s", command ); + + system( command ); + } + else if ( button == 1 ) // No + { + _askedForLeftHandedMouse = true; + } +} + + + +// EOF diff --git a/src/YQWidgetCaption.cc b/src/YQWidgetCaption.cc new file mode 100644 index 0000000..a188915 --- /dev/null +++ b/src/YQWidgetCaption.cc @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQWidgetCaption.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-ui" +#include + +#include "YQWidgetCaption.h" +#include "utf8.h" + + +YQWidgetCaption::YQWidgetCaption( QWidget * parent, + const string & text ) + : QLabel( fromUTF8( text ), parent ) +{ + setTextFormat( QLabel::PlainText ); + handleVisibility( text ); +} + + +YQWidgetCaption::YQWidgetCaption( QWidget * parent, const QString & text ) + : QLabel( text, parent ) +{ + setTextFormat( QLabel::PlainText ); + handleVisibility( text ); +} + + +YQWidgetCaption::~YQWidgetCaption() +{ + // NOP +} + + +void YQWidgetCaption::setText ( const string & newText ) +{ + setText( fromUTF8( newText ) ); +} + + +void YQWidgetCaption::setText ( const QString & newText ) +{ + QLabel::setText( newText ); + handleVisibility( newText.isEmpty() ); +} + + +void YQWidgetCaption::handleVisibility( const string & text ) +{ + handleVisibility( text.empty() ); +} + + +void YQWidgetCaption::handleVisibility( const QString & text ) +{ + handleVisibility( text.isEmpty() ); +} + + +void YQWidgetCaption::handleVisibility( bool textIsEmpty ) +{ + if ( textIsEmpty ) + { + if ( isShown() ) + hide(); + } + else + { + if ( ! isShown() ) + show(); + } +} + + +#include "YQWidgetCaption.moc" diff --git a/src/YQWidgetCaption.h b/src/YQWidgetCaption.h new file mode 100644 index 0000000..cc0d58b --- /dev/null +++ b/src/YQWidgetCaption.h @@ -0,0 +1,73 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQWidgetCaption.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQWidgetCaption_h +#define YQWidgetCaption_h + +#include +#include +using std::string; + + +/** + * Helper class for captions (labels) above a widget: Takes care of hiding + * itself when its text is empty and showing when its text becomes non-empty. + **/ +class YQWidgetCaption: public QLabel +{ + Q_OBJECT + +public: + + /** + * Constuctors. + * + * If the text is empty, the widget will be created, but hidden right + * away. It can later be made visible again with setText() with a non-empty + * text. + **/ + YQWidgetCaption( QWidget * parent, const string & text ); + YQWidgetCaption( QWidget * parent, const QString & text ); + + /** + * Destructor. + **/ + virtual ~YQWidgetCaption(); + + /** + * Change the text and handle visibility: + * If the new text is empty, hide this widget. + * If the new text is non-empty, show this widget. + **/ + virtual void setText ( const string & newText ); + virtual void setText ( const QString & newText ); + +private: + + /** + * Make the widget visible if the text is non-empty or hide it if it is + * empty. + **/ + void handleVisibility( const string & text ); + void handleVisibility( const QString & text ); + void handleVisibility( bool textIsEmpty ); +}; + + +#endif // YQWidgetCaption_h diff --git a/src/YQWidgetFactory.cc b/src/YQWidgetFactory.cc new file mode 100644 index 0000000..d9398cf --- /dev/null +++ b/src/YQWidgetFactory.cc @@ -0,0 +1,399 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQWidgetFactory.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include "YQWidgetFactory.h" +#include "YQUI.h" +#include "YUIException.h" +#include "YQPackageSelectorPlugin.h" + +#include + + +using std::string; + + +YQWidgetFactory::YQWidgetFactory() + : YWidgetFactory() +{ + // NOP +} + +YQWidgetFactory::~YQWidgetFactory() +{ + // NOP +} + + + + +// +// Dialogs +// + +YQDialog * +YQWidgetFactory::createMainDialog() +{ + return 0; // FIXME: TO DO +} + + + +YQDialog * +YQWidgetFactory::createPopupDialog() +{ + return 0; // FIXME: TO DO +} + + + + +// +// Layout Boxes +// + +YQLayoutBox * +YQWidgetFactory::createLayoutBox( YWidget * parent, YUIDimension dim ) +{ + YQLayoutBox * layoutBox = new YQLayoutBox( parent, dim ); + YUI_CHECK_NEW( layoutBox ); + + return layoutBox; +} + + + +// +// Common Leaf Widgets +// + +YQPushButton * +YQWidgetFactory::createPushButton( YWidget * parent, const string & label ) +{ + YQPushButton * pushButton = new YQPushButton( parent, label ); + YUI_CHECK_NEW( pushButton ); + + return pushButton; +} + + + +YQLabel * +YQWidgetFactory::createLabel( YWidget * parent, + const string & text, + bool isHeading, + bool isOutputField ) +{ + YQLabel * label = new YQLabel( parent, text, isHeading, isOutputField ); + YUI_CHECK_NEW( label ); + + return label; +} + + + +YQInputField * +YQWidgetFactory::createInputField( YWidget * parent, const string & label, bool passwordMode ) +{ + YQInputField * inputField = new YQInputField( parent, label, passwordMode ); + YUI_CHECK_NEW( inputField ); + + return inputField; +} + + + +YQCheckBox * +YQWidgetFactory::createCheckBox( YWidget * parent, const string & label, bool isChecked ) +{ + YQCheckBox * checkBox = new YQCheckBox( parent, label, isChecked ); + YUI_CHECK_NEW( checkBox ); + + return checkBox; +} + + + +YQRadioButton * +YQWidgetFactory::createRadioButton( YWidget * parent, const string & label, bool isChecked ) +{ + YQRadioButton * radioButton = new YQRadioButton( parent, label, isChecked ); + YUI_CHECK_NEW( radioButton ); + + // Register radio button with its button group. + // This has to be done after all constructors are done so virtual functions + // can be used. + + if ( radioButton->buttonGroup() ) + radioButton->buttonGroup()->addRadioButton( radioButton ); + + return radioButton; +} + + + +YQComboBox * +YQWidgetFactory::createComboBox( YWidget * parent, const string & label, bool editable ) +{ + YQComboBox * comboBox = new YQComboBox( parent, label, editable ); + YUI_CHECK_NEW( comboBox ); + + return comboBox; +} + + + +YQSelectionBox * +YQWidgetFactory::createSelectionBox( YWidget * parent, const string & label ) +{ + YQSelectionBox * selectionBox = new YQSelectionBox( parent, label ); + YUI_CHECK_NEW( selectionBox ); + + return selectionBox; +} + + + +YQTree * +YQWidgetFactory::createTree( YWidget * parent, const string & label ) +{ + YQTree * tree = new YQTree( parent, label ); + YUI_CHECK_NEW( tree ); + + return tree; +} + + + +YQTable * +YQWidgetFactory::createTable( YWidget * parent, YTableHeader * header ) +{ + YQTable * table = new YQTable( parent, header ); + YUI_CHECK_NEW( table ); + + return table; +} + + + +YQProgressBar * +YQWidgetFactory::createProgressBar( YWidget * parent, const string & label, int maxValue ) +{ + YQProgressBar * progressBar = new YQProgressBar( parent, label, maxValue ); + YUI_CHECK_NEW( progressBar ); + + return progressBar; +} + + + +YQRichText * +YQWidgetFactory::createRichText( YWidget * parent, const string & text, bool plainTextMode ) +{ + YQRichText * richText = new YQRichText( parent, text, plainTextMode ); + YUI_CHECK_NEW( richText ); + + return richText; +} + + + + +// +// Less Common Leaf Widgets +// + +YQIntField * +YQWidgetFactory::createIntField( YWidget * parent, const string & label, int minVal, int maxVal, int initialVal ) +{ + YQIntField * intField = new YQIntField( parent, label, minVal, maxVal, initialVal ); + YUI_CHECK_NEW( intField ); + + return intField; +} + + + +YQMenuButton * +YQWidgetFactory::createMenuButton( YWidget * parent, const string & label ) +{ + YQMenuButton * menuButton = new YQMenuButton( parent, label ); + YUI_CHECK_NEW( menuButton ); + + return menuButton; +} + + + +YQMultiLineEdit * +YQWidgetFactory::createMultiLineEdit( YWidget * parent, const string & label ) +{ + YQMultiLineEdit * multiLineEdit = new YQMultiLineEdit( parent, label ); + YUI_CHECK_NEW( multiLineEdit ); + + return multiLineEdit; +} + + + +YQImage * +YQWidgetFactory::createImage( YWidget * parent, const string & imageFileName, bool animated ) +{ + YQImage * image = new YQImage( parent, imageFileName, animated ); + YUI_CHECK_NEW( image ); + + return image; +} + + +YQLogView * +YQWidgetFactory::createLogView( YWidget * parent, const string & label, int visibleLines, int storedLines ) +{ + YQLogView * logView = new YQLogView( parent, label, visibleLines, storedLines ); + YUI_CHECK_NEW( logView ); + + return logView; +} + + + +YQMultiSelectionBox * +YQWidgetFactory::createMultiSelectionBox( YWidget * parent, const string & label ) +{ + YQMultiSelectionBox * multiSelectionBox = new YQMultiSelectionBox( parent, label ); + YUI_CHECK_NEW( multiSelectionBox ); + + return multiSelectionBox; +} + + + +YQPackageSelector * +YQWidgetFactory::createPackageSelector( YWidget * parent, long modeFlags ) +{ + YQUI::ui()->setAutoActivateDialogs( false ); + + YQPackageSelectorPlugin * plugin = YQUI::ui()->packageSelectorPlugin(); + + if ( plugin ) + return plugin->createPackageSelector( parent, modeFlags ); + else + return 0; +} + + +YWidget * +YQWidgetFactory::createPkgSpecial( YWidget * , const string & ) +{ + YUI_THROW( YUIUnsupportedWidgetException( "YQPkgSpecial" ) ); // NCurses only + return 0; +} + + +// +// Layout Helpers +// + +YQSpacing * +YQWidgetFactory::createSpacing( YWidget * parent, YUIDimension dim, bool stretchable, YLayoutSize_t size ) +{ + YQSpacing * spacing = new YQSpacing( parent, dim, stretchable, size ); + YUI_CHECK_NEW( spacing ); + + return spacing; +} + + +YQEmpty * +YQWidgetFactory::createEmpty( YWidget * parent ) +{ + YQEmpty * empty = new YQEmpty( parent ); + YUI_CHECK_NEW( empty ); + + return empty; +} + + + +YQAlignment * +YQWidgetFactory::createAlignment( YWidget * parent, + YAlignmentType horAlignment, + YAlignmentType vertAlignment ) +{ + YQAlignment * alignment = new YQAlignment( parent, horAlignment, vertAlignment ); + YUI_CHECK_NEW( alignment ); + + return alignment; +} + + +YQSquash * +YQWidgetFactory::createSquash( YWidget * parent, bool horSquash, bool vertSquash ) +{ + YQSquash * squash = new YQSquash( parent, horSquash, vertSquash ); + YUI_CHECK_NEW( squash ); + + return squash; +} + + + +YQFrame * +YQWidgetFactory::createFrame( YWidget * parent, const string & label ) +{ + YQFrame * frame = new YQFrame( parent, label ); + YUI_CHECK_NEW( frame ); + + return frame; +} + + + +YQCheckBoxFrame * +YQWidgetFactory::createCheckBoxFrame( YWidget * parent, const string & label, bool checked ) +{ + YQCheckBoxFrame * checkBoxFrame = new YQCheckBoxFrame( parent, label, checked ); + YUI_CHECK_NEW( checkBoxFrame ); + + return checkBoxFrame; +} + + + +YQRadioButtonGroup * +YQWidgetFactory::createRadioButtonGroup( YWidget * parent ) +{ + YQRadioButtonGroup * radioButtonGroup = new YQRadioButtonGroup( parent ); + YUI_CHECK_NEW( radioButtonGroup ); + + return radioButtonGroup; +} + + + +YQReplacePoint * +YQWidgetFactory::createReplacePoint( YWidget * parent ) +{ + YQReplacePoint * replacePoint = new YQReplacePoint( parent ); + YUI_CHECK_NEW( replacePoint ); + + return replacePoint; +} + + + diff --git a/src/YQWidgetFactory.h b/src/YQWidgetFactory.h new file mode 100644 index 0000000..a278c6e --- /dev/null +++ b/src/YQWidgetFactory.h @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQWidgetFactory.h + + Author: Stefan Hundhammer + +/-*/ + +#ifndef YQWidgetFactory_h +#define YQWidgetFactory_h + + +#include "YWidgetFactory.h" + +#include "YQAlignment.h" +#include "YQCheckBox.h" +#include "YQCheckBoxFrame.h" +#include "YQComboBox.h" +#include "YQDialog.h" +#include "YQEmpty.h" +#include "YQFrame.h" +#include "YQImage.h" +#include "YQInputField.h" +#include "YQIntField.h" +#include "YQLabel.h" +#include "YQLayoutBox.h" +#include "YQLogView.h" +#include "YQMenuButton.h" +#include "YQMultiLineEdit.h" +#include "YQMultiSelectionBox.h" +#include "YQPackageSelector.h" +#include "YQProgressBar.h" +#include "YQPushButton.h" +#include "YQRadioButton.h" +#include "YQRadioButtonGroup.h" +#include "YQReplacePoint.h" +#include "YQRichText.h" +#include "YQSelectionBox.h" +#include "YQSpacing.h" +#include "YQSquash.h" +#include "YQTable.h" +#include "YQTimeField.h" +#include "YQTree.h" + +using std::string; + + +/** + * Concrete widget factory for mandatory widgets. + **/ +class YQWidgetFactory: public YWidgetFactory +{ +public: + // Note: Using covariant return types for all createSomeWidget() methods + // (returning YQSomeWidget where the base class declares virtual methods that + // return YSomeWidget) + + + // + // Dialogs + // + + virtual YQDialog * createMainDialog(); + virtual YQDialog * createPopupDialog(); + + // + // Layout Boxes + // + + virtual YQLayoutBox * createLayoutBox( YWidget * parent, YUIDimension dim ); + + // + // Common Leaf Widgets + // + + virtual YQPushButton * createPushButton ( YWidget * parent, const string & label ); + virtual YQLabel * createLabel ( YWidget * parent, const string & text, bool isHeading = false, bool isOutputField = false ); + virtual YQInputField * createInputField ( YWidget * parent, const string & label, bool passwordMode = false ); + virtual YQCheckBox * createCheckBox ( YWidget * parent, const string & label, bool isChecked = false ); + virtual YQRadioButton * createRadioButton ( YWidget * parent, const string & label, bool isChecked = false ); + virtual YQComboBox * createComboBox ( YWidget * parent, const string & label, bool editable = false ); + virtual YQSelectionBox * createSelectionBox ( YWidget * parent, const string & label ); + virtual YQTree * createTree ( YWidget * parent, const string & label ); + virtual YQTable * createTable ( YWidget * parent, YTableHeader * header ); + virtual YQProgressBar * createProgressBar ( YWidget * parent, const string & label, int maxValue = 100 ); + virtual YQRichText * createRichText ( YWidget * parent, const string & text = string(), bool plainTextMode = false ); + + // + // Less Common Leaf Widgets + // + + virtual YQIntField * createIntField ( YWidget * parent, const string & label, int minVal, int maxVal, int initialVal ); + virtual YQMenuButton * createMenuButton ( YWidget * parent, const string & label ); + virtual YQMultiLineEdit * createMultiLineEdit ( YWidget * parent, const string & label ); + virtual YQImage * createImage ( YWidget * parent, const string & imageFileName, bool animated = false ); + virtual YQLogView * createLogView ( YWidget * parent, const string & label, int visibleLines, int storedLines = 0 ); + virtual YQMultiSelectionBox *createMultiSelectionBox( YWidget * parent, const string & label ); + + virtual YQPackageSelector * createPackageSelector ( YWidget * parent, long modeFlags = 0 ); + virtual YWidget * createPkgSpecial ( YWidget * parent, const string & name ); // NCurses only, will throw exception in the Qt UI + + // + // Layout Helpers + // + + virtual YQSpacing * createSpacing ( YWidget * parent, YUIDimension dim, bool stretchable = false, YLayoutSize_t size = 0.0 ); + virtual YQEmpty * createEmpty ( YWidget * parent ); + virtual YQAlignment * createAlignment ( YWidget * parent, YAlignmentType horAlignment, YAlignmentType vertAlignment ); + virtual YQSquash * createSquash ( YWidget * parent, bool horSquash, bool vertSquash ); + + // + // Visual Grouping + // + + virtual YQFrame * createFrame ( YWidget * parent, const string & label ); + virtual YQCheckBoxFrame * createCheckBoxFrame ( YWidget * parent, const string & label, bool checked ); + + // + // Logical Grouping + // + + virtual YQRadioButtonGroup *createRadioButtonGroup ( YWidget * parent ); + virtual YQReplacePoint * createReplacePoint ( YWidget * parent ); + + +protected: + + friend class YQUI; + + /** + * Constructor. + * + * Use YUI::widgetFactory() to get the singleton for this class. + **/ + YQWidgetFactory(); + + /** + * Destructory. + **/ + virtual ~YQWidgetFactory(); + +}; // class YWidgetFactory + + +#endif // YQWidgetFactory_h diff --git a/src/YQWizard.cc b/src/YQWizard.cc new file mode 100644 index 0000000..7ad6a66 --- /dev/null +++ b/src/YQWizard.cc @@ -0,0 +1,2053 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (c) SuSE Linux AG | +\----------------------------------------------------------------------/ + + File: YQWizard.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#include "YQWizard.h" +#define y2log_component "qt-wizard" +#include +#include "YCPValueWidgetID.h" + +// For the command parser + +#include + +#include +#include +#include +#include "ycp/YCPInteger.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "QY2ListView.h" + +#include "utf8.h" +#include "YQi18n.h" +#include "YQUI.h" +#include "YQApplication.h" +#include "YQDialog.h" +#include "YQAlignment.h" +#include "YQReplacePoint.h" +#include "YQEmpty.h" +#include "YQLabel.h" +#include "YQWizardButton.h" +#include "YQIconPool.h" +#include "YQWidgetFactory.h" +#include "YQSignalBlocker.h" +#include "QY2LayoutUtils.h" +#include "YEvent.h" + +using std::string; + + +#define PIXMAP_DIR THEMEDIR "/wizard/" + +#ifdef TEXTDOMAIN +# undef TEXTDOMAIN +#endif + +#define TEXTDOMAIN "packages-qt" + +#define ENABLE_GRADIENTS 1 + +#define USE_SEPARATOR 1 + +#define WORK_AREA_TOP_MARGIN 10 + +#if ENABLE_GRADIENTS +# define WORK_AREA_BOTTOM_MARGIN 8 +# define WORK_AREA_RIGHT_MARGIN 8 +#else +# define WORK_AREA_BOTTOM_MARGIN 8 +# define WORK_AREA_RIGHT_MARGIN 6 +#endif + +#define BUTTON_BOX_TOP_MARGIN 10 + +#define SEPARATOR_MARGIN 6 +#define STEPS_MARGIN 10 +#define STEPS_SPACING 2 +#define STEPS_HEADING_SPACING 8 +#define MENU_BAR_MARGIN 8 + +#define USE_FIXED_STEP_FONTS 0 +#define STEPS_FONT_FAMILY "Sans Serif" +#define STEPS_FONT_SIZE 11 +#define STEPS_HEADING_FONT_SIZE 11 + +#define USE_ICON_ON_HELP_BUTTON 0 + + +YQWizard::YQWizard( YWidget * parent, + YWidgetID * backButtonId, const string & backButtonLabel, + YWidgetID * abortButtonId, const string & abortButtonLabel, + YWidgetID * nextButtonId, const string & nextButtonLabel, + YWizardMode wizardMode ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YWizard( parent, + backButtonId, backButtonLabel, + abortButtonId, abortButtonLabel, + nextButtonId, nextButtonLabel, + wizardMode ) +{ + setWidgetRep( this ); + + _stepsEnabled = (wizardMode == YWizardMode_Steps); + _treeEnabled = (wizardMode == YWizardMode_Tree); + + _verboseCommands = false; + _protectNextButton = false; + _stepsDirty = false; + _direction = YQWizard::Forward; + + _sideBar = 0; + _stepsPanel = 0; + _stepsBox = 0; + _stepsGrid = 0; + _helpButton = 0; + _stepsButton = 0; + _treeButton = 0; + _releaseNotesButton = 0; + _treePanel = 0; + _tree = 0; + _helpPanel = 0; + _helpBrowser = 0; + _clientArea = 0; + _menuBarBox = 0; + _menuBar = 0; + _dialogIcon = 0; + _dialogHeading = 0; + _contents = 0; + _backButton = 0; + _backButtonSpacer = 0; + _abortButton = 0; + _nextButton = 0; + _sendButtonEvents = true; + + _stepsList.setAutoDelete( true ); + _stepsIDs.setAutoDelete( false ); // Only for one of both! + + YQUI::setTextdomain( TEXTDOMAIN ); + + + // + // Load graphics + // + +#if ENABLE_GRADIENTS + loadGradientPixmaps(); +#endif + + if ( _stepsEnabled ) + loadStepsIcons(); + + + // + // Create widgets + // + + + if ( ! _titleBarGradientPixmap.isNull() ) + { + layoutTitleBar( this ); + } + else + { + QWidget * spacer = addVSpacing( this, WORK_AREA_TOP_MARGIN ); + CHECK_PTR( spacer ); + +# if ENABLE_GRADIENTS + spacer->setPaletteBackgroundColor( _gradientTopColor ); +# endif + } + + QHBox * hBox = new QHBox( this ); + YUI_CHECK_NEW( hBox ); + + layoutSideBar( hBox ); + layoutWorkArea( hBox ); + + y2debug( "Constructor finished." ); +} + + + +YQWizard::~YQWizard() +{ + deleteSteps(); +} + + + +void YQWizard::layoutTitleBar( QWidget * parent ) +{ + if ( ! highColorDisplay() ) // 8 bit display or worse? + { + // No colorful title bar, just a spacing to match the one at the bottom. + addVSpacing( parent, WORK_AREA_BOTTOM_MARGIN ); + + return; + } + + + QHBox * titleBar = new QHBox( parent ); + YUI_CHECK_NEW( titleBar ); + +#if ENABLE_GRADIENTS + setGradient( titleBar, _titleBarGradientPixmap ); +#endif + + titleBar->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); // hor/vert + + // + // Left logo + // + + QLabel * left = new QLabel( titleBar ); + left->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + QPixmap leftLogo( PIXMAP_DIR "title-bar-left.png" ); + + if ( ! leftLogo.isNull() ) + { + left->setPixmap( leftLogo ); + left->setFixedSize( leftLogo.size() ); + left->setBackgroundOrigin( QWidget::ParentOrigin ); + } + + + // + // Center stretch space + // + + addHStretch( titleBar ); + + + // + // Right logo + // + + QLabel * right = new QLabel( titleBar ); + YUI_CHECK_NEW( right ); + + QPixmap rightLogo( PIXMAP_DIR "title-bar-right.png" ); + + if ( ! rightLogo.isNull() ) + { + right->setPixmap( rightLogo ); + right->setFixedSize( rightLogo.size() ); + right->setBackgroundOrigin( QWidget::ParentOrigin ); + } +} + + + +void YQWizard::layoutSideBar( QWidget * parent ) +{ + _sideBar = new QWidgetStack( parent ); + YUI_CHECK_NEW( _sideBar ); + _sideBar->setMinimumWidth( YQUI::ui()->defaultSize( YD_HORIZ ) / 5 ); + _sideBar->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Preferred ) ); // hor/vert + _sideBar->setMargin( 0 ); + + + layoutHelpPanel(); + + if ( _treeEnabled ) + { + layoutTreePanel(); + showTree(); + } + else if ( _stepsEnabled ) + { + layoutStepsPanel(); + showSteps(); + } +} + + + +void YQWizard::layoutStepsPanel() +{ + _stepsPanel = new QVBox( _sideBar ); + YUI_CHECK_NEW( _stepsPanel ); + + +#if ENABLE_GRADIENTS + if ( ! _titleBarGradientPixmap.isNull() ) + { + // Top gradient + + QLabel * topGradient = new QLabel( _stepsPanel ); + CHECK_PTR( topGradient ); + setGradient( topGradient, _topGradientPixmap ); + } +#endif + + + // Steps + + _sideBar->addWidget( _stepsPanel ); + + _stepsBox = new QVBox( _stepsPanel ); + YUI_CHECK_NEW( _stepsBox ); +#if ENABLE_GRADIENTS + _stepsBox->setPaletteBackgroundColor( _gradientCenterColor ); +#endif + _stepsBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) ); // hor/vert + + QWidget * stretch = addVStretch( _stepsPanel ); + YUI_CHECK_NEW( stretch ); +#if ENABLE_GRADIENTS + stretch->setPaletteBackgroundColor( _gradientCenterColor ); +#endif + + + // Steps panel bottom buttons ("Help", "Release Notes") + + QLabel * helpButtonBox = new QLabel( _stepsPanel ); + +#if ENABLE_GRADIENTS + YUI_CHECK_NEW( helpButtonBox ); + setGradient( helpButtonBox, _bottomGradientPixmap ); +#endif + + + + // Layouts for the buttons + + QVBoxLayout * vbox = new QVBoxLayout( helpButtonBox, 0, 0 ); // parent, margin, spacing + YUI_CHECK_NEW( vbox ); + vbox->addStretch( 99 ); + + + QHBoxLayout * hbox = new QHBoxLayout( vbox, 0 ); // parent, spacing + hbox->addStretch( 99 ); + + _releaseNotesButton = new QPushButton( _( "Release Notes..." ), helpButtonBox ); + hbox->addWidget( _releaseNotesButton ); + + + connect( _releaseNotesButton, SIGNAL( clicked() ), + this, SLOT ( releaseNotesClicked() ) ); + + _releaseNotesButton->hide(); // hidden until showReleaseNotesButton() is called + + hbox->addStretch( 99 ); + vbox->addStretch( 99 ); + + hbox = new QHBoxLayout( vbox, 0 ); // parent, spacing + hbox->addStretch( 99 ); + + // Help button - intentionally without keyboard shortcut + _helpButton = new QPushButton( _( "Help" ), helpButtonBox ); + YUI_CHECK_NEW( _helpButton ); + + hbox->addWidget( _helpButton ); + hbox->addStretch( 99 ); + + connect( _helpButton, SIGNAL( clicked() ), + this, SLOT ( showHelp() ) ); + +#if USE_ICON_ON_HELP_BUTTON + QPixmap pixmap = QPixmap( PIXMAP_DIR "help-button.png" ); + + if ( ! pixmap.isNull() ) + _helpButton->setPixmap( pixmap ); +#endif + + + vbox->addSpacing( WORK_AREA_BOTTOM_MARGIN ); +} + + + +void YQWizard::addStep( const QString & text, const QString & id ) +{ + if ( _stepsIDs[ id ] ) + { + y2error( "Step ID \"%s\" (\"%s\") already used for \"%s\"", + (const char *) id, + (const char *) text, + (const char *) _stepsIDs[ id ]->name() ); + return; + } + + if ( _stepsList.last() && _stepsList.last()->name() == text ) + { + // Consecutive steps with the same name will be shown as one single step. + // + // Since steps are always added at the end of the list, it is + // sufficient to check the last step of the list. If the texts are the + // same, the other with the same text needs to get another (additional) + // ID to make sure setCurrentStep() works as it should. + _stepsList.last()->addID( id ); + } + else + { + _stepsList.append( new YQWizard::Step( text, id ) ); + _stepsDirty = true; + } + + _stepsIDs.insert( id, _stepsList.last() ); +} + + + +void YQWizard::addStepHeading( const QString & text ) +{ + _stepsList.append( new YQWizard::StepHeading( text ) ); + _stepsDirty = true; +} + + + +void YQWizard::updateSteps() +{ + if ( ! _stepsBox ) + return; + + // + // Delete any previous step widgets + // + + if ( _stepsGrid ) + { + delete _stepsGrid->mainWidget(); + _stepsGrid = 0; + } + + + // + // Create a new parent widget for the steps + // + + QWidget * stepsParent = new QWidget( _stepsBox ); + YUI_CHECK_NEW( stepsParent ); + stepsParent->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) ); // hor/vert +#if ENABLE_GRADIENTS + stepsParent->setPaletteBackgroundColor( _gradientCenterColor ); +#endif + + // Create a grid layout for the steps + + _stepsGrid = new QGridLayout( stepsParent, // parent + _stepsList.count(), 4, // rows, cols + 0, STEPS_SPACING ); // margin, spacing + YUI_CHECK_NEW( _stepsGrid ); + + const int statusCol = 1; + const int nameCol = 2; + + _stepsGrid->setColStretch( 0, 99 ); // Left margin column - stretch + _stepsGrid->setColStretch( statusCol, 0 ); // Status column - don't stretch + _stepsGrid->setColStretch( nameCol, 0 ); // Name column - don't stretch + _stepsGrid->setColStretch( 3, 99 ); // Left margin column - stretch + + + // Work around Qt bug: Grid layout only works right if the parent widget isn't visible. + stepsParent->hide(); + + // + // Add left and right (but not top and bottom) margins + // + + int row = 0; + + QWidget * leftSpacer = addHSpacing( stepsParent, STEPS_MARGIN ); + YUI_CHECK_NEW( leftSpacer ); + _stepsGrid->addWidget( leftSpacer, row, 0 ); + + QWidget * rightSpacer = addHSpacing( stepsParent, STEPS_MARGIN ); + YUI_CHECK_NEW( rightSpacer ); + _stepsGrid->addWidget( rightSpacer, row, 3 ); + + + // + // Create widgets for all steps and step headings in the internal list + // + + YQWizard::Step * step = _stepsList.first(); + + while ( step ) + { + if ( step->isHeading() ) + { + if ( row > 0 ) + { + // Spacing + + QWidget * spacer = addVSpacing( stepsParent, STEPS_HEADING_SPACING ); + YUI_CHECK_NEW( spacer ); + _stepsGrid->addWidget( spacer, row++, nameCol ); + } + + // + // Heading + // + + QLabel * label = new QLabel( step->name(), stepsParent ); + YUI_CHECK_NEW( label ); + label->setAlignment( Qt::AlignLeft | Qt::AlignTop ); + +#if USE_FIXED_STEP_FONTS + QFont font( STEPS_FONT_FAMILY, STEPS_HEADING_FONT_SIZE ); + font.setWeight( QFont::Bold ); + label->setFont( font ); +#else + QFont font = YQUI::yqApp()->currentFont(); + + int size = font.pointSize(); + + if ( size > 1 ) + font.setPointSize( size + 2 ); + + font.setBold( true ); + label->setFont( font ); +#endif + + step->setNameLabel( label ); + _stepsGrid->addMultiCellWidget( label, + row, row, // from_row, to_row + statusCol, nameCol ); // from_col, to_col + } + else // No heading - ordinary step + { + // + // Step status + // + + QLabel * statusLabel = new QLabel( stepsParent ); + YUI_CHECK_NEW( statusLabel ); + + step->setStatusLabel( statusLabel ); + _stepsGrid->addWidget( statusLabel, row, statusCol ); + + + // + // Step name + // + + QLabel * nameLabel = new QLabel( step->name(), stepsParent ); + YUI_CHECK_NEW( nameLabel ); + nameLabel->setAlignment( Qt::AlignLeft | Qt::AlignTop ); + +#if USE_FIXED_STEP_FONTS + nameLabel->setFont( QFont( STEPS_FONT_FAMILY, STEPS_FONT_SIZE ) ); +#else + nameLabel->setFont( YQUI::yqApp()->currentFont() ); +#endif + + step->setNameLabel( nameLabel ); + _stepsGrid->addWidget( nameLabel, row, nameCol ); + } + + step = _stepsList.next(); + row++; + } + + _stepsGrid->activate(); + stepsParent->show(); + _stepsDirty = false; +} + + +void YQWizard::updateStepStates() +{ + if ( _stepsDirty ) + updateSteps(); + + YQWizard::Step * currentStep = findStep( _currentStepID ); + YQWizard::Step * step = _stepsList.first(); + + if ( currentStep ) + { + // Set status icon and color for the current step + setStepStatus( currentStep, _stepCurrentIcon, _stepCurrentColor ); + + + // + // Set all steps before the current to "done" + // + + while ( step && step != currentStep ) + { + setStepStatus( step, _stepDoneIcon, _stepDoneColor ); + step = _stepsList.next(); + } + + // Skip the current step - continue with the step after it + + if ( step ) + step = _stepsList.next(); + } + + // + // Set all steps after the current to "to do" + // + + while ( step ) + { + setStepStatus( step, _stepToDoIcon, _stepToDoColor ); + step = _stepsList.next(); + } +} + + +void YQWizard::setStepStatus( YQWizard::Step * step, const QPixmap & icon, const QColor & color ) +{ + if ( step ) + { + if ( step->nameLabel() ) + step->nameLabel()->setPaletteForegroundColor( color ); + + if ( step->statusLabel() ) + step->statusLabel()->setPixmap( icon ); + } +} + + +void YQWizard::setCurrentStep( const QString & id ) +{ + _currentStepID = id; + updateStepStates(); +} + + +void YQWizard::deleteSteps() +{ + _stepsList.clear(); + _stepsIDs.clear(); +} + + +YQWizard::Step * YQWizard::findStep( const QString & id ) +{ + if ( id.isEmpty() ) + return 0; + + return _stepsIDs[ id ]; +} + + +void YQWizard::layoutHelpPanel() +{ + _helpPanel = new QHBox( _sideBar ); + YUI_CHECK_NEW( _helpPanel ); + _sideBar->addWidget( _helpPanel ); + + addGradientColumn( _helpPanel ); + + QVBox * vbox = new QVBox( _helpPanel ); + YUI_CHECK_NEW( vbox ); + + + // Help browser + + _helpBrowser = new QTextBrowser( vbox ); + YUI_CHECK_NEW( _helpBrowser ); + + _helpBrowser->setMimeSourceFactory( 0 ); + _helpBrowser->installEventFilter( this ); + _helpBrowser->setTextFormat( Qt::RichText ); + _helpBrowser->setMargin( 4 ); + _helpBrowser->setResizePolicy( QScrollView::Manual ); + + + // Set help browser text color + QPixmap fgPixmap = QPixmap( PIXMAP_DIR "help-text-color.png" ); + if (! fgPixmap.isNull() ) + _helpBrowser->setPaletteForegroundColor( pixelColor( fgPixmap, 0, 0, paletteForegroundColor() ) ); + + + if ( highColorDisplay() ) + { + // Set fancy help browser background pixmap + + QPixmap bgPixmap( PIXMAP_DIR "help-background.png" ); + + if ( ! bgPixmap.isNull() ) + _helpBrowser->setPaletteBackgroundPixmap( bgPixmap ); + } + + + + // + // Button box with bottom gradient + // + + + QLabel * buttonBox = new QLabel( vbox ); + YUI_CHECK_NEW( buttonBox ); + + QPushButton * button; + QPixmap pixmap; + + if ( _treeEnabled ) + { + // "Tree" button - intentionally without keyboard shortcut + button = new QPushButton( _( "Tree" ), buttonBox ); + YUI_CHECK_NEW( button ); + _treeButton = button; + +#if USE_ICON_ON_HELP_BUTTON + pixmap = QPixmap( PIXMAP_DIR "tree-button.png" ); +#endif + } + else + if ( _stepsEnabled ) + { + // "Steps" button - intentionally without keyboard shortcut + button = new QPushButton( _( "Steps" ), buttonBox ); + YUI_CHECK_NEW( button ); + _stepsButton = button; + +#if USE_ICON_ON_HELP_BUTTON + pixmap = QPixmap( PIXMAP_DIR "steps-button.png" ); +#endif + } + else + { + // Create a dummy button just to find out how high it would become + button = new QPushButton( "Dummy", buttonBox ); + YUI_CHECK_NEW( button ); + } + + + if ( ! pixmap.isNull() ) + button->setPixmap( pixmap ); + + layoutSideBarButtonBox( buttonBox, button ); + + if ( _treeEnabled ) + { + connect( button, SIGNAL( clicked() ), + this, SLOT ( showTree() ) ); + } + else if ( _stepsEnabled ) + { + connect( button, SIGNAL( clicked() ), + this, SLOT ( showSteps() ) ); + } + else + { + // Hide the dummy button - the button box height is fixed now. + button->hide(); + } + + addGradientColumn( _helpPanel ); +} + + + +void YQWizard::layoutSideBarButtonBox( QWidget * parent, QPushButton * button ) +{ + QVBoxLayout * vbox = new QVBoxLayout( parent, 0, 0 ); // parent, margin, spacing + YUI_CHECK_NEW( vbox ); + vbox->addSpacing( BUTTON_BOX_TOP_MARGIN ); + + QHBoxLayout * hbox = new QHBoxLayout( vbox, 0 ); // parent, spacing + YUI_CHECK_NEW( hbox ); + + hbox->addStretch( 99 ); + hbox->addWidget( button ); + hbox->addStretch( 99 ); + + vbox->addSpacing( WORK_AREA_BOTTOM_MARGIN ); + + // For whatever strange reason, parent->sizeHint() does not return anything + // meaningful yet - not even after vbox->activate() or parent->adjustSize() + int height = button->sizeHint().height() + BUTTON_BOX_TOP_MARGIN + WORK_AREA_BOTTOM_MARGIN; + +#if ENABLE_GRADIENTS + if ( ! _bottomGradientPixmap.isNull() ) + setBottomCroppedGradient( parent, _bottomGradientPixmap, height ); +#endif + + parent->setFixedHeight( height ); +} + + + +void YQWizard::layoutTreePanel() +{ + _treePanel = new QHBox( _sideBar ); + YUI_CHECK_NEW( _treePanel ); + _sideBar->addWidget( _treePanel ); + + // Left margin (with gradients) + addGradientColumn( _treePanel ); + + QVBox * vbox = new QVBox( _treePanel ); + YUI_CHECK_NEW( vbox ); + + + // Selection tree + + _tree = new QY2ListView( vbox ); + YUI_CHECK_NEW( _tree ); + + _tree->addColumn( "" ); + _tree->header()->hide(); + _tree->setRootIsDecorated( true ); + _tree->setSortByInsertionSequence( true ); + + connect( _tree, SIGNAL( selectionChanged ( void ) ), + this, SLOT ( treeSelectionChanged ( void ) ) ); + + connect( _tree, SIGNAL( spacePressed ( QListViewItem * ) ), + this, SLOT ( sendTreeEvent ( QListViewItem * ) ) ); + + connect( _tree, SIGNAL( doubleClicked ( QListViewItem * ) ), + this, SLOT ( sendTreeEvent ( QListViewItem * ) ) ); + + + // Bottom gradient + + QLabel * buttonBox = new QLabel( vbox ); + YUI_CHECK_NEW( buttonBox ); + + + // "Help" button - intentionally without keyboard shortcut + QPushButton * button = new QPushButton( _( "Help" ), buttonBox ); + YUI_CHECK_NEW( button ); + +#if USE_ICON_ON_HELP_BUTTON + QPixmap pixmap( PIXMAP_DIR "help-button.png" ); + + if ( ! pixmap.isNull() ) + button->setPixmap( pixmap ); +#endif + + layoutSideBarButtonBox( buttonBox, button ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( showHelp() ) ); + + + // Right margin (with gradients) + addGradientColumn( _treePanel ); +} + + + +void YQWizard::addTreeItem( const QString & parentID, const QString & text, const QString & id ) +{ + if ( ! _tree ) + { + y2error( "YQWizard widget not created with `opt(`treeEnabled) !" ); + return; + } + + YQWizard::TreeItem * item = 0; + YQWizard::TreeItem * parent = 0; + + if ( ! parentID.isEmpty() ) + { + parent = findTreeItem( parentID ); + } + + if ( parent ) + { + item = new YQWizard::TreeItem( parent, text, id ); + YUI_CHECK_NEW( item ); + } + else + { + item = new YQWizard::TreeItem( _tree, text, id ); + YUI_CHECK_NEW( item ); + } + + if ( ! id.isEmpty() ) + _treeIDs.insert( id, item ); +} + + + +void YQWizard::deleteTreeItems() +{ + if ( _tree ) + _tree->clear(); + + _treeIDs.clear(); +} + + + +YQWizard::TreeItem * YQWizard::findTreeItem( const QString & id ) +{ + if ( id.isEmpty() ) + return 0; + + return _treeIDs[ id ]; +} + + +void YQWizard::selectTreeItem( const QString & id ) +{ + if ( _tree ) + { + YQWizard::TreeItem * item = findTreeItem( id ); + + if ( item ) + { + YQSignalBlocker sigBlocker( _tree ); + + _tree->setSelected( item, true ); + _tree->ensureItemVisible( item ); + } + } +} + + +void YQWizard::sendTreeEvent( QListViewItem * listViewItem ) +{ + if ( listViewItem ) + { + YQWizard::TreeItem * item = dynamic_cast ( listViewItem ); + + if ( item && ! item->id().isEmpty() ) + sendEvent( YCPString( toUTF8( item->id() ) ) ); + } +} + + +void YQWizard::treeSelectionChanged() +{ + if ( _tree ) + sendTreeEvent( _tree->selectedItem() ); +} + + +YCPString YQWizard::currentTreeSelection() +{ + if ( _tree ) + { + QListViewItem * sel = _tree->selectedItem(); + + if ( sel ) + { + YQWizard::TreeItem * item = dynamic_cast (sel); + + if ( item && ! item->id().isEmpty() ) + return YCPString( (const char *) item->id() ); + } + } + + return YCPString( "" ); +} + + + + +void YQWizard::layoutWorkArea( QHBox * parentHBox ) +{ + QVBox * workAreaVBox = new QVBox( parentHBox ); + YUI_CHECK_NEW( workAreaVBox ); + + // An extra QVBox inside the workAreaVBox is needed for frame and margin + + QVBox * workArea = new QVBox( workAreaVBox ); + YUI_CHECK_NEW( workArea ); + +#if ENABLE_GRADIENTS + workArea->setFrameStyle( QFrame::Box | QFrame::Plain ); + workArea->setMargin( 4 ); +#else + workArea->setFrameStyle( QFrame::Box | QFrame::Sunken ); + // workArea->setFrameStyle( QFrame::TabWidgetPanel | QFrame::Sunken ); +#endif + + + // + // Menu bar + // + + // Placed directly inside workArea the menu bar positions itself at (0,0) + // and so obscures any kind of frame there might be. + _menuBarBox = new QVBox( workArea ); + YUI_CHECK_NEW( _menuBarBox ); + + _menuBar = new QMenuBar( _menuBarBox ); + YUI_CHECK_NEW( _menuBar ); + + _menuBarBox->hide(); // will be made visible when menus are added + + + // + // Dialog icon and heading + // + + QHBox * headingHBox = new QHBox( workArea ); + YUI_CHECK_NEW( headingHBox ); + headingHBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); // hor/vert + + addHSpacing( headingHBox, SEPARATOR_MARGIN ); + + _dialogIcon = new QLabel( headingHBox ); + YUI_CHECK_NEW( _dialogIcon ); + _dialogIcon->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) ); // hor/vert + + addHSpacing( headingHBox ); + + _dialogHeading = new QLabel( headingHBox ); + YUI_CHECK_NEW( _dialogHeading ); + _dialogHeading->setFont( YQUI::yqApp()->headingFont() ); + _dialogHeading->setAlignment( Qt::AlignLeft | Qt::WordBreak ); + _dialogHeading->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); // hor/vert + +#if 0 + addHStretch( headingHBox ); +#endif + addVSpacing( workArea ); + +#if USE_SEPARATOR + + QHBox * hbox = new QHBox( workArea ); + + addHSpacing( hbox, SEPARATOR_MARGIN ); + + QFrame * separator = new QFrame( hbox ); + YUI_CHECK_NEW( separator ); + separator->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + + addHSpacing( hbox, SEPARATOR_MARGIN ); + addVSpacing( workArea ); +#endif + + // + // Client area (the part that belongs to the YCP application) + // + + layoutClientArea( workArea ); + + + // + // Button box + // + + layoutButtonBox( workAreaVBox ); + + + // + // Spacer (purely decorative) at the right of the client area + // + + addGradientColumn( parentHBox, WORK_AREA_RIGHT_MARGIN ); +} + + + +void YQWizard::layoutClientArea( QWidget * parent ) +{ + _clientArea = new QVBox( parent ); + YUI_CHECK_NEW( _clientArea ); + _clientArea->setMargin( 4 ); + +#if 0 + _clientArea->setPaletteBackgroundColor( QColor( 0x60, 0x60, 0x60 ) ); +#endif + + + // + // HVCenter for wizard contents + // + + _contents = new YQAlignment( this, _clientArea, YAlignCenter, YAlignCenter ); + YUI_CHECK_NEW( _contents ); + + _contents->setStretchable( YD_HORIZ, true ); + _contents->setStretchable( YD_VERT, true ); + _contents->installEventFilter( this ); + _contents->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + + // + // Replace point for wizard contents + // + + YReplacePoint * replacePoint = YUI::widgetFactory()->createReplacePoint( _contents ); + replacePoint->setId( new YCPValueWidgetID( YCPSymbol( YWizardContentsReplacePointID ) ) ); // `id(`contents) + + + // + // Initial YEmpty widget contents of replace point + // + + YUI::widgetFactory()->createEmpty( replacePoint ); + replacePoint->showChild(); +} + + + +void YQWizard::layoutButtonBox( QWidget * parent ) +{ + // + // Button box and layout + // + + QWidget * buttonBox = new QWidget( parent ); + YUI_CHECK_NEW( buttonBox ); + + // Using old-style layouts to enable a seamless background with the + // gradient pixmap: Any sub-widgets (QVBox, QHBox) would have to get yet + // another portion of that gradient as their backround pixmap, and it would + // be very hard to cover all cases - resizing, hiding individual buttons, etc. + + QVBoxLayout * vbox = new QVBoxLayout( buttonBox, 0, 0 ); // parent, margin, spacing + YUI_CHECK_NEW( vbox ); + + vbox->addSpacing( BUTTON_BOX_TOP_MARGIN ); + + + // + // QHBoxLayout for the buttons + // + + QHBoxLayout * hbox = new QHBoxLayout( vbox, 2 ); // parent, spacing + YUI_CHECK_NEW( hbox ); + + + // + // "Back" button + // + + _backButton = new YQWizardButton( this, buttonBox, backButtonLabel(), backButtonId() ); + YUI_CHECK_NEW( _backButton ); + + hbox->addWidget( (QWidget *) _backButton->widgetRep() ); + connect( _backButton, SIGNAL( clicked() ), + this, SLOT ( slotBackClicked() ) ); + + _backButtonSpacer = new QSpacerItem( 0, 0, // width, height + QSizePolicy::Expanding, // horizontal + QSizePolicy::Minimum ); // vertical + YUI_CHECK_NEW( _backButtonSpacer ); + hbox->addItem( _backButtonSpacer ); + + + if ( _backButton->text().isEmpty() ) + { + _backButton->hide(); + + // Minimize _backButtonSpacer + _backButtonSpacer->changeSize( 0, 0, // width, height + QSizePolicy::Minimum, // horizontal + QSizePolicy::Minimum ); // vertical + } + + + // + // "Abort" button + // + + _abortButton = new YQWizardButton( this, buttonBox, abortButtonLabel(), abortButtonId() ); + YUI_CHECK_NEW( _abortButton ); + + hbox->addWidget( (QWidget *) _abortButton->widgetRep() ); + connect( _abortButton, SIGNAL( clicked() ), + this, SLOT ( slotAbortClicked() ) ); + + + // Using spacer rather than addSpacing() since the default stretchability + // of a QSpacerItem is undefined, i.e. centering the middle button could + // not be guaranteed. + + QSpacerItem * spacer = new QSpacerItem( 0, 0, // width, height + QSizePolicy::Expanding, // horizontal + QSizePolicy::Minimum ); // vertical + YUI_CHECK_NEW( spacer ); + hbox->addItem( spacer ); + + + // + // "Next" button + // + + _nextButton = new YQWizardButton( this, buttonBox, nextButtonLabel(), nextButtonId() ); + YUI_CHECK_NEW( _nextButton ); + + hbox->addWidget( (QWidget *) _nextButton->widgetRep() ); + connect( _nextButton, SIGNAL( clicked() ), + this, SLOT ( slotNextClicked() ) ); + + + // + // Bottom margin and gradient + // + + vbox->addSpacing( WORK_AREA_BOTTOM_MARGIN ); + +#if ENABLE_GRADIENTS + setBottomCroppedGradient( buttonBox, _bottomGradientPixmap, buttonBox->sizeHint().height() ); +#endif + + buttonBox->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); // hor/vert +} + + + +void YQWizard::loadGradientPixmaps() +{ +#if ENABLE_GRADIENTS + if ( highColorDisplay() ) + { + _topGradientPixmap = QPixmap( PIXMAP_DIR "top-gradient.png" ); + _bottomGradientPixmap = QPixmap( PIXMAP_DIR "bottom-gradient.png" ); + _titleBarGradientPixmap = QPixmap( PIXMAP_DIR "title-bar-gradient.png" ); + _gradientCenterColor = pixelColor( _bottomGradientPixmap, 0, 0, paletteBackgroundColor() ); + _gradientTopColor = pixelColor( _topGradientPixmap, 0, 0 , paletteBackgroundColor() ); + } + else // 8 bit display or worse - don't use gradients + { + // Gradient pixmaps remain empty. The respecive widgets will retain the + // default widget background (grey, depending on the widget theme). + + // Use deault widget background (some shade of grey) for the center + // stretchable part of the side bar. + _gradientCenterColor = paletteBackgroundColor(); + _gradientTopColor = paletteBackgroundColor(); + } +#endif +} + + +void YQWizard::loadStepsIcons() +{ + _stepCurrentIcon = YQIconPool::stepCurrent(); + _stepToDoIcon = YQIconPool::stepToDo(); + _stepDoneIcon = YQIconPool::stepDone(); + + if ( highColorDisplay() ) + { + _stepCurrentColor = pixelColor( QPixmap( PIXMAP_DIR "color-step-current.png" ), 0, 0, paletteForegroundColor() ); + _stepToDoColor = pixelColor( QPixmap( PIXMAP_DIR "color-step-todo.png" ), 0, 0, paletteForegroundColor() ); + _stepDoneColor = pixelColor( QPixmap( PIXMAP_DIR "color-step-done.png" ), 0, 0, paletteForegroundColor() ); + } + else + { + _stepCurrentColor = paletteForegroundColor(); + _stepToDoColor = paletteForegroundColor(); + _stepDoneColor = paletteForegroundColor(); + } +} + + + +void YQWizard::setGradient( QWidget * widget, const QPixmap & pixmap ) +{ +#if ENABLE_GRADIENTS + if ( widget && ! pixmap.isNull() ) + { + widget->setFixedHeight( pixmap.height() ); + widget->setPaletteBackgroundPixmap( pixmap ); + } +#endif +} + + + +void YQWizard::setBottomCroppedGradient( QWidget * widget, const QPixmap & pixmap, int croppedHeight ) +{ +#if ENABLE_GRADIENTS + setGradient( widget, bottomCropPixmap( pixmap, croppedHeight ) ); +#endif +} + + + +QPixmap YQWizard::bottomCropPixmap( const QPixmap & full, int croppedHeight ) +{ + QPixmap pixmap; + +#if ENABLE_GRADIENTS + + if ( full.height() > croppedHeight ) + { + pixmap = QPixmap( full.width(), croppedHeight ); + + bitBlt( &pixmap, 0, 0, // dest, dest_x, dest_y + &full, 0, full.height() - croppedHeight - 1, // src, src_x, src_y + full.width(), croppedHeight ); // src_width, src_height + } + else + { + pixmap = full; + } +#endif + + return pixmap; +} + + + +QColor YQWizard::pixelColor( const QPixmap & pixmap, int x, int y, const QColor & defaultColor ) +{ + if ( pixmap.isNull() ) + return defaultColor; + + // QPixmap doesn't allow direct access to pixel values (which makes some + // sense since this requires a round-trip to the X server - pixmaps are X + // server resources), so we need to convert the QPixmap to a QImage to get + // that information. But since this conversion is expensive, we might save + // some performance if we only convert the part we really need - so let's + // cut out a tiny portion of the original pixmap and convert only that tiny + // portion. + + + QPixmap tiny( 1, 1 ); + + bitBlt( &tiny, 0, 0, // dest, dest_x, dest_y + &pixmap, x, y, // src, src_x, src_y + 1, 1 ); // src_width, src_height + + QImage image = tiny.convertToImage(); + + + return QColor( image.pixel( 0, 0 ) ); +} + + + +void YQWizard::addGradientColumn( QWidget * parent, int width ) +{ + if ( ! parent ) + return; + + QVBox * vbox = new QVBox( parent ); + YUI_CHECK_NEW( vbox ); + +#if ENABLE_GRADIENTS + QWidget * topGradient = addHSpacing( vbox, width ); + YUI_CHECK_NEW( topGradient ); + setGradient( topGradient, _topGradientPixmap ); + + QWidget * centerStretch = new QWidget( vbox ); + YUI_CHECK_NEW( centerStretch ); + centerStretch->setPaletteBackgroundColor( _gradientCenterColor ); + + + QWidget * bottomGradient = new QWidget( vbox ); + YUI_CHECK_NEW( bottomGradient ); + setGradient( bottomGradient, _bottomGradientPixmap ); +#else + vbox->setFixedWidth( width ); +#endif + +} + + +void YQWizard::destroyButtons() +{ + if ( _backButton ) + { + delete _backButton; + _backButton = 0; + } + + if ( _abortButton ) + { + delete _abortButton; + _abortButton = 0; + } + + if ( _nextButton ) + { + delete _nextButton; + _nextButton = 0; + } +} + + + +bool YQWizard::highColorDisplay() const +{ + return QColor::numBitPlanes() > 8; +} + + +void YQWizard::connectNotify ( const char * signal ) +{ + if ( QString( signal ).contains( "nextClicked()" ) ) + { + y2debug( "nextClicked connected, no longer directly sending button events" ); + _sendButtonEvents = false; + } +} + + +void YQWizard::disconnectNotify ( const char * signal ) +{ + if ( QString( signal ).contains( "nextClicked()" ) ) + { + y2debug( "nextClicked disconnected, directly sending button events again" ); + _sendButtonEvents = true; + } +} + + +void YQWizard::setDialogIcon( const char * iconName ) +{ + if ( _dialogIcon ) + { + if ( iconName && *iconName ) + { + QPixmap icon( iconName ); + + if ( icon.isNull() ) + y2warning( "Couldn't load dialog icon \"%s\"", iconName ); + else + { + _dialogIcon->setPixmap( icon ); + topLevelWidget()->setIcon( icon ); + } + } + else + { + _dialogIcon->clear(); + topLevelWidget()->setIcon( QPixmap() ); + } + } +} + + +void YQWizard::setDialogHeading( const QString & headingText ) +{ + if ( _dialogHeading ) + { + if ( headingText ) + _dialogHeading->setText( headingText ); + else + _dialogHeading->clear(); + } +} + +string YQWizard::debugLabel() +{ + if ( _dialogHeading ) + { + QString label = _dialogHeading->text(); + label.simplifyWhiteSpace(); // Replace any embedded newline with a single blank + + if ( ! label.isEmpty() ) + { + label.prepend( "YQWizard \"" ); + label.append( "\"" ); + + return toUTF8( label ); + } + } + + return "untitled YQWizard"; +} + +void YQWizard::setHelpText( QString helpText ) +{ + if ( _helpBrowser ) + { + if ( helpText ) + { + helpText.replace( "&product;", YQUI::ui()->productName() ); + _helpBrowser->setText( helpText ); + } + else + _helpBrowser->clear(); + } +} + + +void YQWizard::slotBackClicked() +{ + emit backClicked(); + + if ( _sendButtonEvents ) + sendEvent( _backButton->id() ); + + _direction = YQWizard::Backward; +} + + +void YQWizard::slotAbortClicked() +{ + emit abortClicked(); + + if ( _sendButtonEvents ) + sendEvent( _abortButton->id() ); +} + + +void YQWizard::slotNextClicked() +{ + emit nextClicked(); + + if ( _sendButtonEvents ) + sendEvent( _nextButton->id() ); + + _direction = YQWizard::Forward; +} + + +void YQWizard::showHelp() +{ + if ( _sideBar && _helpPanel ) + { + _sideBar->raiseWidget( _helpPanel ); + } +} + + +void YQWizard::releaseNotesClicked() +{ + if ( ! _releaseNotesButtonId.isNull() ) + { + y2milestone( "Release Notes button clicked" ); + sendEvent( _releaseNotesButtonId ); + } +} + + +void YQWizard::showSteps() +{ + if ( _sideBar && _stepsPanel ) + { + _sideBar->raiseWidget( _stepsPanel ); + } +} + + +void YQWizard::showTree() +{ + if ( _sideBar && _treePanel ) + { + _sideBar->raiseWidget( _treePanel ); + } +} + + + +void YQWizard::addMenu( const QString & text, + const QString & id ) +{ + if ( _menuBar ) + { + QPopupMenu * menu = new QPopupMenu( _menuBar ); + YUI_CHECK_NEW( menu ); + + _menuIDs.insert( id, menu ); + _menuBar->insertItem( text, menu ); + + connect( menu, SIGNAL( activated ( int ) ), + this, SLOT ( sendMenuEvent( int ) ) ); + + if ( _menuBarBox && _menuBarBox->isHidden() ) + { + _menuBarBox->show(); + _menuBarBox->setFixedHeight( _menuBar->sizeHint().height() + MENU_BAR_MARGIN ); + } + } +} + + +void YQWizard::addSubMenu( const QString & parentMenuID, + const QString & text, + const QString & id ) +{ + QPopupMenu * parentMenu = _menuIDs[ parentMenuID ]; + + if ( parentMenu ) + { + QPopupMenu * menu = new QPopupMenu( _menuBar ); + YUI_CHECK_NEW( menu ); + + _menuIDs.insert( id, menu ); + parentMenu->insertItem( text, menu ); + + connect( menu, SIGNAL( activated ( int ) ), + this, SLOT ( sendMenuEvent( int ) ) ); + } + else + { + y2error( "Can't find menu with ID %s", (const char *) parentMenuID ); + } +} + + +void YQWizard::addMenuEntry( const QString & parentMenuID, + const QString & text, + const QString & idString ) +{ + QPopupMenu * parentMenu = _menuIDs[ parentMenuID ]; + + if ( parentMenu ) + { + int id = _menuEntryIDs.size(); + _menuEntryIDs.push_back( idString ); + parentMenu->insertItem( text, id ); + } + else + { + y2error( "Can't find menu with ID %s", (const char *) parentMenuID ); + } +} + + +void YQWizard::addMenuSeparator( const QString & parentMenuID ) +{ + QPopupMenu * parentMenu = _menuIDs[ parentMenuID ]; + + if ( parentMenu ) + { + parentMenu->insertSeparator(); + } + else + { + y2error( "Can't find menu with ID %s", (const char *) parentMenuID ); + } +} + + +void YQWizard::deleteMenus() +{ + if ( _menuBar ) + { + _menuBarBox->hide(); + _menuBar->clear(); + _menuIDs.clear(); + _menuEntryIDs.clear(); + } +} + + +void YQWizard::sendMenuEvent( int numID ) +{ + if ( numID >= 0 && numID < (int) _menuEntryIDs.size() ) + { + sendEvent( YCPString( toUTF8( _menuEntryIDs[ numID ] ) ) ); + } + else + { + y2error( "Invalid menu ID: %d", numID ); + } +} + + +void YQWizard::sendEvent( YWidgetID * rawId ) +{ + if ( rawId ) + { + YCPValueWidgetID * id = dynamic_cast (rawId ); + + if ( id ) + sendEvent( id->value() ); + } +} + + +void YQWizard::sendEvent( YCPValue id ) +{ + // Wizard events are sent as menu events - the semantics are similar. + // + // Widget events wouldn't do since they use their widget's ID as the ID to + // return (which would be inappropriate since that would be the ID of the + // wizard widget). Another type of event (WizardEvent) could be introduced, + // but it would add little more information (if any) than MenuEvent. + // + // YQPackageSelector uses the same approach. After all, one widget that can + // return multiple IDs is roughly the semantics of MenuEvents. + + YQUI::ui()->sendEvent( new YMenuEvent( id ) ); +} + + + +int YQWizard::preferredWidth() +{ + return sizeHint().width(); +} + + +int YQWizard::preferredHeight() +{ + return sizeHint().height(); +} + + +void YQWizard::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); + resizeClientArea(); +} + + + +void YQWizard::resizeClientArea() +{ + // y2debug( "resizing client area" ); + QRect contentsRect = _clientArea->contentsRect(); + _contents->setSize( contentsRect.width(), contentsRect.height() ); +} + + + +bool YQWizard::eventFilter( QObject * obj, QEvent * ev ) +{ + if ( ev->type() == QEvent::Resize && obj == _contents ) + { + resizeClientArea(); + return true; // Event handled + } + + return QWidget::eventFilter( obj, ev ); +} + + +void YQWizard::setButtonLabel( YQWizardButton * button, const QString & newLabel ) +{ + if ( button ) + { + button->setLabel( newLabel ); + YDialog::currentDialog()->checkShortcuts(); + + if ( newLabel.isEmpty() ) + { + button->hide(); + + if ( button == _backButton && _backButtonSpacer ) + { + // Minimize _backButtonSpacer + + _backButtonSpacer->changeSize( 0, 0, // width, height + QSizePolicy::Minimum, // horizontal + QSizePolicy::Minimum ); // vertical + } + } + else + { + button->show(); + + if ( button == _backButton && _backButtonSpacer ) + { + // Restore _backButtonSpacer to normal size + + _backButtonSpacer->changeSize( 0, 0, // width, height + QSizePolicy::Expanding, // horizontal + QSizePolicy::Minimum ); // vertical + } + } + } +} + + +void YQWizard::setButtonID( YQWizardButton * button, const YCPValue & id ) +{ + if ( button ) + { + button->setId( new YCPValueWidgetID( id ) ); + } +} + + +void YQWizard::enableButton( YQWizardButton * button, bool enabled ) +{ + if ( button == _nextButton && _protectNextButton && ! enabled ) + return; + + if ( button ) + button->setEnabled( enabled ); +} + + +void YQWizard::setButtonFocus( YQWizardButton * button ) +{ + if ( button ) + button->setKeyboardFocus(); +} + + +void YQWizard::showReleaseNotesButton( string label, const YCPValue & id ) +{ + if ( ! _releaseNotesButton ) + { + y2error( "NULL Release Notes button" ); + if ( ! _stepsBox ) + y2error( "This works only if there is a \"steps\" panel!" ); + + return; + } + + label = YShortcut::cleanShortcutString( label ); // no way to check the shortcut, so strip it + _releaseNotesButton->setText( fromUTF8( label ) ); + _releaseNotesButtonId = id; + + + if ( _releaseNotesButton->isHidden() ) + _releaseNotesButton->show(); + +} + + +void YQWizard::hideReleaseNotesButton() +{ + if ( _releaseNotesButton && _releaseNotesButton->isShown() ) + _releaseNotesButton->hide(); +} + + +void YQWizard::retranslateInternalButtons() +{ + YQUI::setTextdomain( TEXTDOMAIN ); + + if ( _helpButton ) + // "Help" button - intentionally without keyboard shortcut + _helpButton->setText( _( "Help" ) ); + + if ( _stepsButton ) + // "Steps" button - intentionally without keyboard shortcut + _stepsButton->setText( _( "Steps" ) ); + + if ( _treeButton ) + // "Tree" button - intentionally without keyboard shortcut + _treeButton->setText( _( "Tree" ) ); +} + + +void YQWizard::ping() +{ + y2debug( "YQWizard is active" ); +} + + +bool YQWizard::isCommand( QString declaration, const YCPTerm & term ) +{ + declaration = declaration.simplifyWhiteSpace(); + + // Check command name + + QString command = declaration; + command.remove( QRegExp( "\\s*\\(.*$" ) ); // remove arguments + + if ( term->name().c_str() != command ) + return false; + + // + // Check arguments + // + + QString arg_decl = declaration; + arg_decl.remove( QRegExp( "^.*\\(" ) ); // remove "command (" + arg_decl.remove( QRegExp( "\\).*$" ) ); // remove ")" + + QStringList argDeclList = QStringList::split( ",", arg_decl ); + + // + // Check number of arguments + // + + if ( argDeclList.size() != (unsigned) term->size() ) + { + y2error( "Bad arguments for wizard command %s : %s", + (const char *) declaration, term->toString().c_str() ); + return false; + } + + + // + // Check each individual argument + // + + bool ok = true; + + for ( unsigned i=0; i < argDeclList.size() && ok; i++ ) + { + QString wanted = argDeclList[ i ].stripWhiteSpace(); + YCPValue seen = term->value( i ); + + if ( wanted == "string" ) ok = seen->isString(); + else if ( wanted == "boolean" ) ok = seen->isBoolean(); + else if ( wanted == "bool" ) ok = seen->isBoolean(); + else if ( wanted == "list" ) ok = seen->isList(); + else if ( wanted == "map" ) ok = seen->isMap(); + else if ( wanted == "integer" ) ok = seen->isInteger(); + else if ( wanted == "int" ) ok = seen->isInteger(); + else if ( wanted == "any" ) ok = true; + else + { + y2error( "Bad declaration for wizard command %s : Unknown type \"%s\"", + (const char *) declaration, (const char *) wanted ); + } + } + + if ( ! ok ) + { + y2error( "Bad arguments for wizard command %s : %s", + (const char *) declaration, term->toString().c_str() ); + } + + if ( ok && _verboseCommands ) + { + // Intentionally logging as milestone because a YCP app just explicitly + // requested this log level + y2milestone( "Recognized wizard command %s : %s", + (const char *) declaration, term->toString().c_str() ); + } + + return ok; +} + + +QString YQWizard::qStringArg( const YCPTerm & term, int argNo ) +{ + return fromUTF8( stringArg( term, argNo ).c_str() ); +} + + +string YQWizard::stringArg( const YCPTerm & term, int argNo ) +{ + if ( term->size() > argNo ) + { + YCPValue arg( term->value( argNo ) ); + + if ( arg->isString() ) + return arg->asString()->value(); + } + + y2error( "Couldn't convert arg #%d of '%s' to string", argNo, term->toString().c_str() ); + return ""; +} + + +bool YQWizard::boolArg( const YCPTerm & term, int argNo ) +{ + if ( term->size() > argNo ) + { + YCPValue arg( term->value( argNo ) ); + + if ( arg->isBoolean() ) + return arg->asBoolean()->value(); + } + + y2error( "Couldn't convert arg #%d of '%s' to bool", argNo, term->toString().c_str() ); + return false; +} + + +YCPValue YQWizard::anyArg( const YCPTerm & term, int argNo ) +{ + if ( term->size() > argNo ) + { + return term->value( argNo ); + } + + return YCPVoid(); +} + + + +YCPValue YQWizard::command( const YCPTerm & cmd ) +{ +#define OK YCPBoolean( true ); + + + if ( isCommand( "SetHelpText ( string )", cmd ) ) { setHelpText ( qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetDialogIcon ( string )", cmd ) ) { setDialogIcon ( qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetDialogHeading ( string )", cmd ) ) { setDialogHeading( qStringArg( cmd, 0 ) ); return OK; } + + if ( isCommand( "SetCurrentStep ( string )", cmd ) ) { setCurrentStep( qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "AddStep ( string, string )" , cmd ) ) { addStep( qStringArg( cmd, 0 ), qStringArg( cmd, 1 )); return OK; } + if ( isCommand( "AddStepHeading ( string )", cmd ) ) { addStepHeading( qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "DeleteSteps()" , cmd ) ) { deleteSteps(); return OK; } + if ( isCommand( "UpdateSteps()" , cmd ) ) { updateSteps(); return OK; } + + if ( isCommand( "SetAbortButtonLabel ( string )", cmd ) ) { setButtonLabel( _abortButton, qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetBackButtonLabel ( string )", cmd ) ) { setButtonLabel( _backButton, qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetNextButtonLabel ( string )", cmd ) ) { setButtonLabel( _nextButton, qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetCancelButtonLabel ( string )", cmd ) ) { setButtonLabel( _abortButton, qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetAcceptButtonLabel ( string )", cmd ) ) { setButtonLabel( _nextButton, qStringArg( cmd, 0 ) ); return OK; } + + if ( isCommand( "SetAbortButtonID ( any )" , cmd ) ) { setButtonID( _abortButton, anyArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetBackButtonID ( any )" , cmd ) ) { setButtonID( _backButton, anyArg( cmd, 0 ) ); return OK; } + if ( isCommand( "SetNextButtonID ( any )" , cmd ) ) { setButtonID( _nextButton, anyArg( cmd, 0 ) ); return OK; } + + if ( isCommand( "EnableBackButton ( bool )" , cmd ) ) { enableButton( _backButton, boolArg( cmd, 0 ) ); return OK; } + if ( isCommand( "EnableNextButton ( bool )" , cmd ) ) { enableButton( _nextButton, boolArg( cmd, 0 ) ); return OK; } + if ( isCommand( "EnableAbortButton ( bool )" , cmd ) ) { enableButton( _abortButton, boolArg( cmd, 0 ) ); return OK; } + if ( isCommand( "ProtectNextButton ( bool )" , cmd ) ) { _protectNextButton = boolArg( cmd, 0 ); return OK; } + + if ( isCommand( "SetFocusToNextButton ()" , cmd ) ) { setButtonFocus( _nextButton ); return OK; } + if ( isCommand( "SetFocusToBackButton ()" , cmd ) ) { setButtonFocus( _backButton ); return OK; } + + + if ( isCommand( "SetVerboseCommands ( bool )" , cmd ) ) { setVerboseCommands( boolArg( cmd, 0 ) ); return OK; } + + if ( isCommand( "DeleteTreeItems()" , cmd ) ) { deleteTreeItems(); return OK; } + if ( isCommand( "SelectTreeItem( string )" , cmd ) ) { selectTreeItem( qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "AddTreeItem( string, string, string )", cmd ) ) { addTreeItem ( qStringArg( cmd, 0 ), + qStringArg( cmd, 1 ), + qStringArg( cmd, 2 ) ); return OK; } + + if ( isCommand( "AddMenu ( string, string )" , cmd ) ) { addMenu ( qStringArg( cmd, 0 ), + qStringArg( cmd, 1 ) ); return OK; } + + if ( isCommand( "AddSubMenu ( string, string, string )" , cmd ) ) { addSubMenu ( qStringArg( cmd, 0 ), + qStringArg( cmd, 1 ), + qStringArg( cmd, 2 ) ); return OK; } + + if ( isCommand( "AddMenuEntry ( string, string, string )" , cmd ) ) { addMenuEntry ( qStringArg( cmd, 0 ), + qStringArg( cmd, 1 ), + qStringArg( cmd, 2 ) ); return OK; } + + if ( isCommand( "AddMenuSeparator ( string )" , cmd ) ) { addMenuSeparator( qStringArg( cmd, 0 ) ); return OK; } + if ( isCommand( "DeleteMenus ()" , cmd ) ) { deleteMenus(); return OK; } + if ( isCommand( "ShowReleaseNotesButton( string, any )" , cmd ) ) { showReleaseNotesButton( stringArg( cmd, 0 ), + anyArg ( cmd, 1 )); return OK; } + if ( isCommand( "HideReleaseNotesButton()" , cmd ) ) { hideReleaseNotesButton(); return OK; } + if ( isCommand( "RetranslateInternalButtons()" , cmd ) ) { retranslateInternalButtons() ; return OK; } + if ( isCommand( "Ping()" , cmd ) ) { ping() ; return OK; } + y2error( "Undefined wizard command: %s", cmd->toString().c_str() ); + return YCPBoolean( false ); + +#undef OK +} + + + +#include "YQWizard.moc" diff --git a/src/YQWizard.h b/src/YQWizard.h new file mode 100644 index 0000000..728ce82 --- /dev/null +++ b/src/YQWizard.h @@ -0,0 +1,720 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (c) SuSE Linux AG | +\----------------------------------------------------------------------/ + + File: YQWizard.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQWizard_h +#define YQWizard_h + +#include "YWizard.h" +#include +#include +#include +#include +#include +#include "QY2ListView.h" + +#include +#include + +class QGridLayout; +class QHBox; +class QLabel; +class QMenuBar; +class QPopupMenu; +class QPushButton; +class QSpacerItem; +class QTextBrowser; +class QToolButton; +class QWidgetStack; + +class YQAlignment; +class YQReplacePoint; +class YQWizardButton; +class QY2ListView; + + +class YQWizard : public QVBox, public YWizard +{ + Q_OBJECT + +protected: + class Step; + class TreeItem; + +public: + /** + * Constructor. + **/ + YQWizard( YWidget * parent, + YWidgetID * backButtonId, const string & backButtonLabel, + YWidgetID * abortButtonId, const string & abortButtonLabel, + YWidgetID * nextButtonId, const string & nextButtonLabel, + YWizardMode wizardMode = YWizardMode_Standard ); + + /** + * Destructor. + **/ + virtual ~YQWizard(); + + + enum Direction { Forward, Backward }; + + /** + * Returns the current direction of wizard operations - going forward or + * going backward. This can be used to maintain a consistent direction when + * assigning default buttons to a dialog. + **/ + Direction direction() const { return _direction; } + + /** + * Generic direct access to implementation-specific functions. + * See YQWizard.cc for details. + * + * Returns 'true' on success, 'false' on failure. + * Reimplemented from YWizard. + **/ + virtual YCPValue command( const YCPTerm & command ); + + /** + * Returns a descriptive label of this dialog instance for debugging. + * + * Reimplemented from YWidget. + **/ + virtual string debugLabel(); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Event filter - inherited from QWidget. + **/ + virtual bool eventFilter( QObject * obj, QEvent * ev ); + + /** + * Set a dialog icon. 0 is a valid value - it clears the current icon. + **/ + void setDialogIcon( const char * iconName ); + + /** + * Set a dialog heading. 0 is a valid value - it clears the old text. + **/ + void setDialogHeading( const QString & headingText ); + + /** + * Returns 'true' if this wizard was created with steps enabled, i.e. the + * side bar has a "steps" view. + **/ + bool stepsEnabled() const { return _stepsEnabled; } + + /** + * Add a step for the steps panel on the side bar. + * This only adds the step to the internal list of steps. + * The display is only updated upon calling updateSteps(). + **/ + void addStep( const QString & text, const QString & id ); + + /** + * Add a step heading for the steps panel on the side bar. + * This only adds the heading to the internal list of steps. + * The display is only updated upon calling updateSteps(). + **/ + void addStepHeading( const QString & text ); + + /** + * Delete all steps and step headings from the internal lists. + * The display is only updated upon calling updateSteps(). + **/ + void deleteSteps(); + + /** + * Set the current step. This also triggers updateSteps() if necessary. + **/ + void setCurrentStep( const QString & id ); + + /** + * Update the steps display: Reflect the internal steps and heading lists + * in the layout. + **/ + void updateSteps(); + + /** + * Returns 'true' if this wizard was created with a selection tree enabled, + * i.e. the side bar has a tree selection. + **/ + bool treeEnabled() const { return _treeEnabled; } + + /** + * Returns the wizard's "Next" (or "Accept") button. + **/ + YQWizardButton * nextButton() const { return _nextButton; } + + /** + * Returns the wizard's "Back" button. + **/ + YQWizardButton * backButton() const { return _backButton; } + + /** + * Returns the wizard's "Abort" button. + **/ + YQWizardButton * abortButton() const { return _abortButton; } + + + /** + * Set wizard command verbosity + **/ + void setVerboseCommands( bool verbose ) { _verboseCommands = verbose; } + + /** + * Add a tree item. If "parentID" is an empty string, it will be a root + * item. 'text' is the text that will be displayed in the tree, 'id' the ID + * with which this newly created item can be referenced - and that will be + * returned when the user clicks on a tree item. + **/ + void addTreeItem( const QString & parentID, + const QString & text, + const QString & id ); + + /** + * Select the tree item with the specified ID, if such an item exists. + **/ + void selectTreeItem( const QString & id ); + + /** + * Delete all tree items. + **/ + void deleteTreeItems(); + + + /** + * Add a menu to the menu bar. If the menu bar is not visible yet, it will + * be made visible. 'text' is the user-visible text for the menu bar + * (including keyboard shortcuts marked with '&'), 'id' is the menu ID for + * later addMenuEntry() etc. calls. + **/ + void addMenu( const QString & text, + const QString & id ); + + /** + * Add a submenu to the menu with ID 'parentMenuID'. + **/ + void addSubMenu( const QString & parentMenuID, + const QString & text, + const QString & id ); + + /** + * Add a menu entry to the menu with ID 'parentMenuID'. 'id' is what will + * be returned by UI::UserInput() etc. when a user activates this menu entry. + **/ + void addMenuEntry( const QString & parentMenuID, + const QString & text, + const QString & id ); + + /** + * Add a menu separator to a menu. + **/ + void addMenuSeparator( const QString & parentMenuID ); + + /** + * Delete all menus and hide the menu bar. + **/ + void deleteMenus(); + +signals: + + /** + * Emitted when the "Back" or "Cancel" button is clicked. + **/ + void backClicked(); + + /** + * Emitted when the "Abort" button is clicked. + **/ + void abortClicked(); + + /** + * Emitted when the "Next" or "OK" button is clicked. + * + * Notice: As long as this signal is connected, the wizard will no longer + * send button events to the UI. Rather, the connected QObject has to take + * care to propagate those events. + * This is used in YQPatternSelector, for example. + **/ + void nextClicked(); + + +public slots: + + /** + * Set the help text. 0 is a valid value - it clears the old text. + **/ + void setHelpText( QString helpText ); + + /** + * Adapt the size of the client area (the ReplacePoint(`id(`contents)) to + * fit in its current space. + **/ + void resizeClientArea(); + + /** + * Show the current help text. + * + * This is useful only if it is obscured by any wizard steps, but it can + * safely be called at any time. + **/ + void showHelp(); + + /** + * Show the current wizard steps, if there are any. If there are none, + * nothing happens. + **/ + void showSteps(); + + /** + * Show the current selection tree in the side panel, if there is any. If + * there is none, nothing happens. + **/ + void showTree(); + + /** + * Set a widget's background pixmap to a gradient pixmap and set the + * widget's height (fixed) to that pixmap's height. + **/ + static void setGradient( QWidget * widget, const QPixmap & pixmap ); + + /** + * Set a widget's background to the lower portion (the bottom + * 'croppedHeight' pixels) of a pixmap and set the widget's height (fixed) + * to that 'croppedHeight'. + **/ + static void setBottomCroppedGradient( QWidget * widget, + const QPixmap & pixmap, + int croppedHeight ); + + /** + * Bottom-crop a pixmap: Return a pixmap with the bottom 'croppedHeight' + * pixels. + **/ + static QPixmap bottomCropPixmap( const QPixmap & pixmap, int croppedHeight ); + + /** + * Return the color of pixel( x, y ) of a pixmap. + * If pixmap is null defaultColor is returned. + * This is a _very_ expensive operation! + **/ + static QColor pixelColor( const QPixmap & pixmap, int x, int y, const QColor & defaultColor ); + + +protected slots: + + /** + * Internal notification that the "Back" button has been clicked. + **/ + void slotBackClicked(); + + /** + * Internal notification that the "Abort" button has been clicked. + **/ + void slotAbortClicked(); + + /** + * Internal notification that the "Next" button has been clicked. + **/ + void slotNextClicked(); + + /** + * Propagate button clicked event of release notes button to the YCP + * application. + **/ + void releaseNotesClicked(); + + /** + * Internal notification that [Space] or [Return] has been pressed on a + * tree item. + * If the item has an ID, that ID will be returned to UI::UserInput(). + **/ + void sendTreeEvent( QListViewItem * item ); + + /** + * Internal notification that the tree selection has changed. + * + * If the currently selected item has an ID, that ID will be returned to + * UI::UserInput(). + **/ + void treeSelectionChanged(); + + /** + * Internal notification that a menu item with numeric ID 'numID' has been + * activated. + **/ + void sendMenuEvent( int numID ); + + + /** + * Retranslate internal buttons that are not accessible from the outside: + * - [Help] + * - [Steps] + * - [Tree] + **/ + void retranslateInternalButtons(); + +protected: + + // Layout functions + + void layoutTitleBar ( QWidget * parent ); + void layoutSideBar ( QWidget * parent ); + void layoutSideBarButtonBox ( QWidget * parent, QPushButton * button ); + void layoutStepsPanel(); + void layoutHelpPanel(); + void layoutTreePanel(); + void layoutWorkArea ( QHBox * parentHBox ); + void layoutClientArea( QWidget * parent ); + void layoutButtonBox( QWidget * parent ); + + + /** + * Load gradient pixmaps + **/ + void loadGradientPixmaps(); + + /** + * Load step status icons + **/ + void loadStepsIcons(); + + /** + * Destroy the button box's buttons + **/ + void destroyButtons(); + + /** + * Update all step - use appropriate icons and colors + **/ + void updateStepStates(); + + /** + * Add a (left or right) margin of the specified width to a widget, + * consisting of a fixed height top gradient , a flexible center part (in + * the gradient center color) and a fixed height bottom gradient. + * + * The bottom gradient widget is returned as a reference for other + * background pixmaps. + **/ + void addGradientColumn( QWidget * parent, int width = 8 ); + + /** + * Send a wizard event with the specified ID. + **/ + void sendEvent( YCPValue id ); + void sendEvent( YWidgetID * id ); + + /** + * Returns 'true' if the application is running on a high-color display, + * i.e., on an X visual with more than 8 bit depth. + **/ + bool highColorDisplay() const; + + /** + * Notification that a signal is being connected. + * + * Reimplemented from QObject. + **/ + void connectNotify ( const char * signal ); + + /** + * Notification that a signal is being disconnected. + * + * Reimplemented from QObject. + **/ + void disconnectNotify ( const char * signal ); + + // + // Wizard command mini-parser + // + + /** + * Check if 'term' matches wizard command 'declaration'. + * 'declaration' is a function prototype like this: + * + * myFunction ( string, boolean, string ) + * + * Void functions are declared without any parameters: + * + * myFunction () + * + * Function names must be unique. They cannot be overloaded. + **/ + bool isCommand( QString declaration, const YCPTerm & term ); + + /** + * Return argument number 'argNo' from 'term' as QString. + **/ + QString qStringArg( const YCPTerm & term, int argNo ); + + /** + * Return argument number 'argNo' from 'term' as std::string. + **/ + std::string stringArg( const YCPTerm & term, int argNo ); + + /** + * Return argument number 'argNo' from 'term' as bool. + **/ + bool boolArg( const YCPTerm & term, int argNo ); + + /** + * Return argument as type 'any' (plain YCPValue) + **/ + YCPValue anyArg( const YCPTerm & term, int argNo ); + + /** + * Set a button's label. + **/ + void setButtonLabel( YQWizardButton * button, const QString & newLabel ); + + /** + * Set a button's ID. + **/ + void setButtonID( YQWizardButton * button, const YCPValue & id ); + + /** + * Enable or disable a button. + **/ + void enableButton( YQWizardButton * button, bool enabled ); + + /** + * Set the keyboard focus to a button. + **/ + void setButtonFocus( YQWizardButton * button ); + + /** + * Set text color and status icon for one wizard step + **/ + void setStepStatus( YQWizard::Step * step, const QPixmap & icon, const QColor & color ); + + /** + * Find a step with the specified ID. Returns 0 if there is no such step. + **/ + YQWizard::Step * findStep( const QString & id ); + + /** + * Find a tree item with the specified ID. Tree items without IDs cannot be + * found at all. + * Returns the item or 0 if no such item found. + **/ + YQWizard::TreeItem * findTreeItem( const QString & id ); + + /** + * Returns the current tree selection or an empty string if nothing is + * selected or there is no tree. + * + * Reimplemented from YWizard. + **/ + YCPString currentTreeSelection(); + + /** + * Show a "Release Notes" button above the "Help" button in the steps panel + * with the specified label that will return the specified id to + * UI::UserInput() when clicked. + **/ + void showReleaseNotesButton( string label, const YCPValue & id ); + + /** + * Hide an existing "Release Notes" button. + **/ + void hideReleaseNotesButton(); + + /** + * NOP command just to check if a YQWizard is running + **/ + void ping(); + + + // + // Data members + // + + bool _stepsEnabled; + bool _treeEnabled; + bool _verboseCommands; + bool _protectNextButton; + bool _stepsDirty; + bool _sendButtonEvents; + Direction _direction; + + QPixmap _titleBarGradientPixmap; + QPixmap _topGradientPixmap; + QColor _gradientCenterColor; + QColor _gradientTopColor; + QPixmap _bottomGradientPixmap; + + QPixmap _stepCurrentIcon; + QPixmap _stepToDoIcon; + QPixmap _stepDoneIcon; + + QColor _stepCurrentColor; + QColor _stepToDoColor; + QColor _stepDoneColor; + + QString _currentStepID; + + + QWidgetStack * _sideBar; + QVBox * _stepsPanel; + QVBox * _stepsBox; + QGridLayout * _stepsGrid; + QPushButton * _releaseNotesButton; + YCPValue _releaseNotesButtonId; + QPushButton * _helpButton; + QHBox * _helpPanel; + QTextBrowser * _helpBrowser; + QPushButton * _stepsButton; + QPushButton * _treeButton; + QHBox * _treePanel; + QY2ListView * _tree; + + QVBox * _clientArea; + QWidget * _menuBarBox; + QMenuBar * _menuBar; + QLabel * _dialogIcon; + QLabel * _dialogHeading; + YQAlignment * _contents; + YQWizardButton * _backButton; + QSpacerItem * _backButtonSpacer; + YQWizardButton * _abortButton; + YQWizardButton * _nextButton; + + QPtrList _stepsList; + QDict _stepsIDs; + QDict _treeIDs; + QDict _menuIDs; + vector _menuEntryIDs; + + +protected: + + /** + * Helper class to represent a wizard step internally + **/ + class Step + { + public: + + Step( const QString & name = "", const QString & id = "" ) + : _name( name ) + , _statusLabel( 0 ) + , _nameLabel(0) + , _enabled( true ) + , _idList( id ) + {} + + /** + * Destructor. Intentionally not deleting the widgets. + **/ + virtual ~Step() {} + + virtual bool isHeading() const { return false; } + + QString name() const { return _name; } + QLabel * statusLabel() const { return _statusLabel; } + QLabel * nameLabel() const { return _nameLabel; } + bool isEnabled() const { return _enabled; } + const QStringList & id() const { return _idList; } + void addID( const QString & id ) { _idList.append( id ); } + virtual bool hasID( const QString & id ) { return _idList.find( id ) != _idList.end(); } + + void setStatusLabel( QLabel * label ) { _statusLabel = label; } + void setNameLabel ( QLabel * label ) { _nameLabel = label; } + void setEnabled( bool enabled ) { _enabled = enabled; } + + protected: + + QString _name; + QLabel * _statusLabel; + QLabel * _nameLabel; + bool _enabled; + QStringList _idList; + }; + + + /** + * Helper class to represent a wizard step heading internally + **/ + class StepHeading: public Step + { + public: + + StepHeading( const QString & name = "" ) + : Step( name, "" ) + {} + + virtual ~StepHeading() {} + virtual bool isHeading() const { return true; } + virtual bool hasID( const QString & id ) { return false; } + }; + + + /** + * Helper class for wizard tree item + **/ + class TreeItem: public QY2ListViewItem + { + public: + TreeItem( QY2ListView * parent, + const QString & text, + const QString & id ) + : QY2ListViewItem( parent, text ) + , _id( id ) + {} + + TreeItem( YQWizard::TreeItem * parent, + const QString & text, + const QString & id ) + : QY2ListViewItem( parent, text ) + , _id( id ) + {} + + QString text() const { return QListViewItem::text(0); } + QString id() const { return _id; } + + private: + QString _id; + }; + +}; // class YQWizard + + + +#endif // YQWizard_h diff --git a/src/YQWizardButton.cc b/src/YQWizardButton.cc new file mode 100644 index 0000000..cab8720 --- /dev/null +++ b/src/YQWizardButton.cc @@ -0,0 +1,118 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQWizardButton.cc + + Author: Stefan Hundhammer + +/-*/ + + +#include +#include +#define y2log_component "qt-ui" +#include + +#include "utf8.h" +#include "YQUI.h" +#include "YQWizardButton.h" +#include "YQWizard.h" + + +YQWizardButton::YQWizardButton( YQWizard * wizard, + QWidget * buttonParent, + const string & label, + YWidgetID * id ) + : YQGenericButton( wizard, label ) + , _wizard( wizard ) +{ + QPushButton * button = new QPushButton( fromUTF8( label ), buttonParent ); + CHECK_PTR( button ); + + setQPushButton( button ); + setWidgetRep( button ); + + if ( id ) + setId( id ); + + connect( button, SIGNAL( clicked() ), + this, SIGNAL( clicked() ) ); + + + // This widget itself will never be visible, only its button - which is not + // a child of this widget. + QWidget::hide(); +} + + +YQWizardButton::~YQWizardButton() +{ + // Don't delete qPushButton() here - its parent (buttonParent) will take + // care of that! +} + + +void YQWizardButton::hide() +{ + if ( qPushButton() ) + qPushButton()->hide(); +} + + +void YQWizardButton::show() +{ + if ( qPushButton() ) + qPushButton()->show(); +} + + +bool YQWizardButton::isShown() const +{ + if ( qPushButton() ) + return qPushButton()->isShown(); + else + return false; +} + + +bool YQWizardButton::isHidden() const +{ + return ! isShown(); +} + + +int YQWizardButton::preferredWidth() +{ + // This widget doesn't have a YWidget-based visual representation, it's + // only a YWidget for shortcut checking etc. + + return 0; +} + + +int YQWizardButton::preferredHeight() +{ + // This widget doesn't have a YWidget-based visual representation, it's + // only a YWidget for shortcut checking etc. + + return 0; +} + + +void YQWizardButton::setSize( int newWidth, int newHeight ) +{ + // NOP +} + + + +#include "YQWizardButton.moc" diff --git a/src/YQWizardButton.h b/src/YQWizardButton.h new file mode 100644 index 0000000..35b60cf --- /dev/null +++ b/src/YQWizardButton.h @@ -0,0 +1,116 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQWizardButton.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQWizardButton_h +#define YQWizardButton_h + +#include +#include "YQGenericButton.h" + +using std::string; +class YQDialog; +class YQWizard; +class YWidgetID; + + +class YQWizardButton : public YQGenericButton +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQWizardButton( YQWizard * wizard, + QWidget * buttonParent, + const string & label, + YWidgetID * id = 0 ); + + /** + * Destructor. + **/ + virtual ~YQWizardButton(); + + /** + * Returns a descriptive name of this widget class for logging, + * debugging etc. + **/ + virtual const char *widgetClass() const { return "YQWizardButton"; } + + /** + * Hide the associated QPushButton. + **/ + void hide(); + + /** + * Show the associated QPushButton - not this widget itself (!). + * This widget itself will never become visible. + **/ + void show(); + + /** + * Returns 'true' if the associated QPushButton (!) is shown. + **/ + bool isShown() const; + + /** + * Returns 'true' if the associated QPushButton (!) is hidden. + **/ + bool isHidden() const; + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Returns the wizard this wizard button belongs to. + **/ + YQWizard * wizard() const { return _wizard; } + +signals: + + /** + * Emitted when the button is clicked or otherwise activated. + **/ + void clicked(); + + +private: + + YQWizard * _wizard; +}; + +#endif // YQWizardButton_h diff --git a/src/YQi18n.h b/src/YQi18n.h new file mode 100644 index 0000000..8e798de --- /dev/null +++ b/src/YQi18n.h @@ -0,0 +1,38 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQi18n.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQi18n_h +#define YQi18n_h + +#include +#include + + +inline QString _( const char * msgid ) +{ + return ( !msgid || !*msgid ) ? "" : QString::fromUtf8( gettext(msgid ) ); +} + +inline QString _( const char * msgid1, const char * msgid2, unsigned long int n ) +{ + return QString::fromUtf8( ngettext(msgid1, msgid2, n ) ); +} + + +#endif // YQi18n_h diff --git a/src/lang_fonts b/src/lang_fonts new file mode 100644 index 0000000..d98e0f4 --- /dev/null +++ b/src/lang_fonts @@ -0,0 +1,36 @@ +# Language specific fonts for yast2-qt +# +# Used upon UI::SetLanguage( lang ) +# Fallback strategy for a locale "xy_AB.UTF8": +# +# font[xy_AB.UTF8] = ??? +# font[xy_AB] = ??? +# font[xy] = ??? +# font = ??? +# +# If none of those is found, "Sans Serif" is used. +# +# Don't enumerate all languages just for the fun of it, +# better specify a reasonable default with +# +# font = ??? + +font = "Sans Serif" +font[zh] ="Albany AMT,DejaVu Sans,SUSE Sans,FZSongTi,FZMingTiB,AR PL SungtiL GB,Gnu Unifont,Efont Biwidth,Sans Serif" +font[zh_CN] = "Albany AMT,DejaVu Sans,SUSE Sans,FZSongTi,FZMingTiB,AR PL SungtiL GB,Gnu Unifont,Efont Biwidth,Sans Serif" +font[zh_SG] = "Albany AMT,DejaVu Sans,SUSE Sans,FZSongTi,FZMingTiB,AR PL SungtiL GB,Gnu Unifont,Efont Biwidth,Sans Serif" +font[zh_TW] = "Albany AMT,DejaVu Sans,SUSE Sans,FZMingTiB,FZSongTi,AR PL Mingti2L Big5,AR PL SungtiL GB,Gnu Unifont,Efont Biwidth,Sans Serif" +font[zh_HK] = "Albany AMT,DejaVu Sans,SUSE Sans,FZMingTiB,FZSongTi,AR PL Mingti2L Big5,AR PL SungtiL GB,Gnu Unifont,Efont Biwidth,Sans Serif" +font[ja] = "Albany AMT,DejaVu Sans,SUSE Sans,HGPGothicB,IPAPGothic,IPAGothic,Sazanami Gothic,Efont Biwidth,Gnu Unifont,Sans Serif" + + +# For debugging + +font[xy_AB.UTF8] = "xy_AB_UTF8, Sans Serif" +font[xy_XY] = "xy_XY, Sans Serif" +font[xy] = "xy, Sans Serif" + +font[times] = "Times" +font[sans] = "Sans Serif" +font[helv] = "Helvetica" + diff --git a/src/pkg/Makefile.am b/src/pkg/Makefile.am new file mode 100644 index 0000000..11c199b --- /dev/null +++ b/src/pkg/Makefile.am @@ -0,0 +1,190 @@ +# +# Makefile.am for qt/src/pkg +# + +SUBDIRS = icons + +AM_CXXFLAGS = -DY2LOG=\"ui-qt\" \ + -DLOCALEDIR=\"${localedir}\" \ + -DQT_LOCALEDIR=\"$(QTDIR)/translations\" \ + -DICONDIR=\"${themedir}/current\" \ + -DTHEMEDIR=\"${themedir}/current\" \ + -DHELPIMAGEDIR=\"${imagedir}\" \ + -DQTLIBDIR=\"$(QTLIBDIR)\" \ + -Wno-format-nonliteral \ + -fmessage-length=0 + + +MOC = $(QTDIR)/bin/moc + +# plugin, libtool forces 'lib' prefix +# plugin_LTLIBRARIES = libpy2qt_pkg.la +plugin_LTLIBRARIES = libpy2qt_pkg.la +libpy2qt_pkg_la_LDFLAGS = -version-info 2:0 + +libpy2qt_pkg_la_LIBADD = \ + -L$(plugindir) -lpy2UI \ + -L$(QTLIBDIR) -lqt-mt \ + -lX11 -lXext -lSM -lICE \ + ${ZYPP_LIBS} + +noinst_HEADERS = $(wildcard *.h) + +libpy2qt_pkg_la_SOURCES = \ + YQPackageSelector.cc \ + YQPackageSelectorBase.cc \ + YQPackageSelectorHelp.cc \ + YQPatternSelector.cc \ + YQSimplePatchSelector.cc \ + \ + YQPkgChangeLogView.cc \ + YQPkgChangesDialog.cc \ + YQPkgConflictDialog.cc \ + YQPkgConflictList.cc \ + YQPkgDependenciesView.cc \ + YQPkgDescriptionDialog.cc \ + YQPkgDescriptionView.cc \ + YQPkgDiskUsageList.cc \ + YQPkgDiskUsageWarningDialog.cc \ + YQPkgFileListView.cc \ + YQPkgGenericDetailsView.cc \ + YQPkgRepoFilterView.cc \ + YQPkgRepoList.cc \ + YQPkgLangList.cc \ + YQPkgList.cc \ + YQPkgObjList.cc \ + YQPkgPatchFilterView.cc \ + YQPkgPatchList.cc \ + YQPkgPatternList.cc \ + YQPkgProductDialog.cc \ + YQPkgProductList.cc \ + YQPkgRpmGroupTagsFilterView.cc \ + YQPkgSearchFilterView.cc \ + YQPkgSelDescriptionView.cc \ + YQPkgSelList.cc \ + YQPkgSelMapper.cc \ + YQPkgStatusFilterView.cc \ + YQPkgTechnicalDetailsView.cc \ + YQPkgTextDialog.cc \ + YQPkgUpdateProblemFilterView.cc \ + YQPkgVersionsView.cc + + +BUILT_SOURCES = \ + YQPackageSelector.moc \ + YQPackageSelectorBase.moc \ + YQPatternSelector.moc \ + YQSimplePatchSelector.moc \ + YQPkgChangeLogView.moc \ + YQPkgChangesDialog.moc \ + YQPkgConflictDialog.moc \ + YQPkgConflictList.moc \ + YQPkgDependenciesView.moc \ + YQPkgDescriptionDialog.moc \ + YQPkgDescriptionView.moc \ + YQPkgDiskUsageList.moc \ + YQPkgDiskUsageWarningDialog.moc \ + YQPkgFileListView.moc \ + YQPkgGenericDetailsView.moc \ + YQPkgRepoFilterView.moc \ + YQPkgRepoList.moc \ + YQPkgLangList.moc \ + YQPkgList.moc \ + YQPkgObjList.moc \ + YQPkgPatchFilterView.moc \ + YQPkgPatchList.moc \ + YQPkgPatternList.moc \ + YQPkgProductDialog.moc \ + YQPkgProductDialog.moc \ + YQPkgProductList.moc \ + YQPkgRpmGroupTagsFilterView.moc \ + YQPkgSearchFilterView.moc \ + YQPkgSelDescriptionView.moc \ + YQPkgSelList.moc \ + YQPkgStatusFilterView.moc \ + YQPkgTechnicalDetailsView.moc \ + YQPkgTextDialog.moc \ + YQPkgUpdateProblemFilterView.moc \ + YQPkgVersionsView.moc + + +YQPackageSelector.o YQPackageSelector.lo: YQPackageSelector.moc +YQPackageSelectorBase.o YQPackageSelectorBase.lo: YQPackageSelectorBase.moc +YQPatternSelector.o YQPatternSelector.lo: YQPatternSelector.moc +YQSimplePatchSelector.o YQSimplePatchSelector.lo: YQSimplePatchSelector.moc + +YQPkgChangeLogView.o YQPkgChangeLogView.lo: YQPkgChangeLogView.moc +YQPkgChangesDialog.o YQPkgChangesDialog.lo: YQPkgChangesDialog.moc +YQPkgConflictDialog.o YQPkgConflictDialog.lo: YQPkgConflictDialog.moc +YQPkgConflictList.o YQPkgConflictList.lo: YQPkgConflictList.moc +YQPkgDependenciesView.o YQPkgDependenciesView.lo: YQPkgDependenciesView.moc +YQPkgDescriptionDialog.o YQPkgDescriptionDialog.lo: YQPkgDescriptionDialog.moc +YQPkgDescriptionView.o YQPkgDescriptionView.lo: YQPkgDescriptionView.moc +YQPkgDiskUsageList.o YQPkgDiskUsageList.lo: YQPkgDiskUsageList.moc +YQPkgDiskUsageWarningDialog.o YQPkgDiskUsageWarningDialog.lo: YQPkgDiskUsageWarningDialog.moc +YQPkgFileListView.o YQPkgFileListView.lo: YQPkgFileListView.moc +YQPkgGenericDetailsView.o YQPkgGenericDetailsView.lo: YQPkgGenericDetailsView.moc +YQPkgRepoFilterView.o YQPkgRepoFilterView.lo: YQPkgRepoFilterView.moc +YQPkgRepoList.o YQPkgRepoList.lo: YQPkgRepoList.moc +YQPkgLangList.o YQPkgLangList.lo: YQPkgLangList.moc +YQPkgList.o YQPkgList.lo: YQPkgList.moc +YQPkgObjList.o YQPkgObjList.lo: YQPkgObjList.moc +YQPkgPatchFilterView.o YQPkgPatchFilterView.lo: YQPkgPatchFilterView.moc +YQPkgPatchList.o YQPkgPatchList.lo: YQPkgPatchList.moc +YQPkgPatternList.o YQPkgPatternList.lo: YQPkgPatternList.moc +YQPkgProductDialog.o YQPkgProductDialog.lo: YQPkgProductDialog.moc +YQPkgProductList.o YQPkgProductList.lo: YQPkgProductList.moc +YQPkgRpmGroupTagsFilterView.o YQPkgRpmGroupTagsFilterView.lo: YQPkgRpmGroupTagsFilterView.moc +YQPkgSearchFilterView.o YQPkgSearchFilterView.lo: YQPkgSearchFilterView.moc +YQPkgSelDescriptionView.o YQPkgSelDescriptionView.lo: YQPkgSelDescriptionView.moc +YQPkgSelList.o YQPkgSelList.lo: YQPkgSelList.moc +YQPkgStatusFilterView.o YQPkgStatusFilterView.lo: YQPkgStatusFilterView.moc +YQPkgTechnicalDetailsView.o YQPkgTechnicalDetailsView.lo: YQPkgTechnicalDetailsView.moc +YQPkgTextDialog.o YQPkgTextDialog.lo: YQPkgTextDialog.moc +YQPkgUpdateProblemFilterView.o YQPkgUpdateProblemFilterView.lo: YQPkgUpdateProblemFilterView.moc +YQPkgVersionsView.o YQPkgVersionsView.lo: YQPkgVersionsView.moc + + +YQPackageSelector.moc: YQPackageSelector.h +YQPackageSelectorBase.moc: YQPackageSelectorBase.h +YQPatternSelector.moc: YQPatternSelector.h +YQSimplePatchSelector.moc: YQSimplePatchSelector.h + +YQPkgChangeLogView.moc: YQPkgChangeLogView.h +YQPkgChangesDialog.moc: YQPkgChangesDialog.h +YQPkgConflictDialog.moc: YQPkgConflictDialog.h +YQPkgConflictList.moc: YQPkgConflictList.h +YQPkgDependenciesView.moc: YQPkgDependenciesView.h +YQPkgDescriptionDialog.moc: YQPkgDescriptionDialog.h +YQPkgDescriptionView.moc: YQPkgDescriptionView.h +YQPkgDiskUsageList.moc: YQPkgDiskUsageList.h +YQPkgDiskUsageWarningDialog.moc: YQPkgDiskUsageWarningDialog.h +YQPkgFileListView.moc: YQPkgFileListView.h +YQPkgGenericDetailsView.moc: YQPkgGenericDetailsView.h +YQPkgRepoFilterView.moc: YQPkgRepoFilterView.h +YQPkgRepoList.moc: YQPkgRepoList.h +YQPkgLangList.moc: YQPkgLangList.h +YQPkgList.moc: YQPkgList.h +YQPkgObjList.moc: YQPkgObjList.h +YQPkgPatchFilterView.moc: YQPkgPatchFilterView.h +YQPkgPatchList.moc: YQPkgPatchList.h +YQPkgPatternList.moc: YQPkgPatternList.h +YQPkgProductDialog.moc: YQPkgProductDialog.h +YQPkgProductList.moc: YQPkgProductList.h +YQPkgRpmGroupTagsFilterView.moc: YQPkgRpmGroupTagsFilterView.h +YQPkgSearchFilterView.moc: YQPkgSearchFilterView.h +YQPkgSelDescriptionView.moc: YQPkgSelDescriptionView.h +YQPkgSelList.moc: YQPkgSelList.h +YQPkgStatusFilterView.moc: YQPkgStatusFilterView.h +YQPkgTechnicalDetailsView.moc: YQPkgTechnicalDetailsView.h +YQPkgTextDialog.moc: YQPkgTextDialog.h +YQPkgUpdateProblemFilterView.moc: YQPkgUpdateProblemFilterView.h +YQPkgVersionsView.moc: YQPkgVersionsView.h + + +%.moc: %.h + $(MOC) $< -o $@ + +CLEANFILES = *.moc + +INCLUDES = -I$(srcdir)/.. -I$(QTDIR)/include -I$(includedir) -I$(includedir)/yui ${ZYPP_CFLAGS} diff --git a/src/pkg/YQPackageSelector.cc b/src/pkg/YQPackageSelector.cc new file mode 100644 index 0000000..de1adf3 --- /dev/null +++ b/src/pkg/YQPackageSelector.cc @@ -0,0 +1,1459 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPackageSelector.cc + See also: YQPackageSelectorHelp.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define CHECK_DEPENDENCIES_ON_STARTUP 1 +#define DEPENDENCY_FEEDBACK_IF_OK 1 +#define AUTO_CHECK_DEPENDENCIES_DEFAULT true +#define ALWAYS_SHOW_PATCHES_VIEW_IF_PATCHES_AVAILABLE 0 +#define GLOBAL_UPDATE_CONFIRMATION_THRESHOLD 20 + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define y2log_component "qt-pkg" +#include + +#include "QY2LayoutUtils.h" + +#include "YQPackageSelector.h" +#include "YQPkgChangeLogView.h" +#include "YQPkgChangesDialog.h" +#include "YQPkgConflictDialog.h" +#include "YQPkgConflictList.h" +#include "YQPkgDependenciesView.h" +#include "YQPkgDescriptionView.h" +#include "YQPkgDiskUsageList.h" +#include "YQPkgDiskUsageWarningDialog.h" +#include "YQPkgFileListView.h" +#include "YQPkgRepoFilterView.h" +#include "YQPkgRepoList.h" +#include "YQPkgLangList.h" +#include "YQPkgList.h" +#include "YQPkgPatchFilterView.h" +#include "YQPkgPatchList.h" +#include "YQPkgPatternList.h" +#include "YQPkgProductDialog.h" +#include "YQPkgRpmGroupTagsFilterView.h" +#include "YQPkgSearchFilterView.h" +#include "YQPkgSelList.h" +#include "YQPkgStatusFilterView.h" +#include "YQPkgTechnicalDetailsView.h" +#include "YQPkgTextDialog.h" +#include "YQPkgUpdateProblemFilterView.h" +#include "YQPkgVersionsView.h" +#include "zypp/SysContent.h" + +#include "QY2ComboTabWidget.h" +#include "YQDialog.h" +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQi18n.h" + + +using std::max; +using std::string; +using std::map; +using std::pair; + +#define SPACING 6 +#define MARGIN 4 +#define DEFAULT_EXPORT_FILE_NAME "user-packages.xml" +#define FAST_SOLVER 1 + + + +YQPackageSelector::YQPackageSelector( YWidget * parent, + long modeFlags ) + : YQPackageSelectorBase( parent, modeFlags ) +{ + _showChangesDialog = true; + _autoDependenciesCheckBox = 0; + _detailsViews = 0; + _diskUsageList = 0; + _filters = 0; + _repoFilterView = 0; + _langList = 0; + _patternList = 0; + _pkgChangeLogView = 0; + _pkgDependenciesView = 0; + _pkgDescriptionView = 0; + _pkgFileListView = 0; + _pkgList = 0; + _pkgTechnicalDetailsView = 0; + _pkgVersionsView = 0; + _rpmGroupTagsFilterView = 0; + _searchFilterView = 0; + _selList = 0; + _statusFilterView = 0; + _updateProblemFilterView = 0; + _patchFilterView = 0; + _patchList = 0; + _excludeDevelPkgs = 0; + _excludeDebugInfoPkgs = 0; + + + if ( onlineUpdateMode() ) y2milestone( "Online update mode" ); + if ( updateMode() ) y2milestone( "Update mode" ); + + + basicLayout(); + addMenus(); // Only after all widgets are created! + makeConnections(); + emit loadData(); + + if ( _pkgList ) + _pkgList->clear(); + + if ( _patchFilterView && onlineUpdateMode() ) + { + if ( _filters && _patchFilterView && _patchList ) + { + _filters->showPage( _patchFilterView ); + _patchList->filter(); + } + } + else if ( _repoFilterView && repoMode() ) + { + if ( YQPkgRepoList::countEnabledRepositories() > 1 ) + { + _filters->showPage( _repoFilterView ); + _repoFilterView->filter(); + } + else if ( _searchFilterView ) + { + y2milestone( "No multiple repositories - falling back to search mode" ); + _filters->showPage( _searchFilterView ); + _searchFilterView->filter(); + QTimer::singleShot( 0, _searchFilterView, SLOT( setFocus() ) ); + } + } + else if ( _updateProblemFilterView ) + { + _filters->showPage( _updateProblemFilterView ); + _updateProblemFilterView->filter(); + + } + else if ( searchMode() && _searchFilterView ) + { + _filters->showPage( _searchFilterView ); + _searchFilterView->filter(); + QTimer::singleShot( 0, _searchFilterView, SLOT( setFocus() ) ); + } + else if ( summaryMode() && _statusFilterView ) + { + _filters->showPage( _statusFilterView ); + _statusFilterView->filter(); + } + else if ( _patternList ) + { + _filters->showPage( _patternList ); + _patternList->filter(); + } + else if ( _selList ) + { + _filters->showPage( _selList ); + _selList->filter(); + } + + + if ( _diskUsageList ) + _diskUsageList->updateDiskUsage(); + + y2milestone( "PackageSelector init done" ); + + +#if CHECK_DEPENDENCIES_ON_STARTUP + + if ( ! testMode() && ! onlineUpdateMode() ) + { + // Fire up the first dependency check in the main loop. + // Don't do this right away - wait until all initializations are finished. + QTimer::singleShot( 0, this, SLOT( resolveDependencies() ) ); + } +#endif +} + + +void +YQPackageSelector::basicLayout() +{ + layoutMenuBar( this ); + + QSplitter * outer_splitter = new QSplitter( QSplitter::Horizontal, this ); + CHECK_PTR( outer_splitter ); + + QWidget * left_pane = layoutLeftPane ( outer_splitter ); + QWidget * right_pane = layoutRightPane( outer_splitter ); + + outer_splitter->setResizeMode( left_pane, QSplitter::KeepSize ); + outer_splitter->setResizeMode( right_pane, QSplitter::Stretch ); +} + + +QWidget * +YQPackageSelector::layoutLeftPane( QWidget * parent ) +{ + QSplitter * splitter = new QSplitter( QSplitter::Vertical, parent ); + CHECK_PTR( splitter ); + splitter->setMargin( MARGIN ); + + QVBox * upper_vbox = new QVBox( splitter ); + CHECK_PTR( upper_vbox ); + layoutFilters( upper_vbox ); + addVSpacing( upper_vbox, MARGIN ); + + QVBox * lower_vbox = new QVBox( splitter ); + addVSpacing( lower_vbox, MARGIN ); + _diskUsageList = new YQPkgDiskUsageList( lower_vbox ); + CHECK_PTR( _diskUsageList ); + + splitter->setResizeMode( upper_vbox, QSplitter::Stretch ); + splitter->setResizeMode( lower_vbox, QSplitter::FollowSizeHint ); + + return splitter; +} + + +void +YQPackageSelector::layoutFilters( QWidget * parent ) +{ + _filters = new QY2ComboTabWidget( _( "Fi<er:" ), parent ); + CHECK_PTR( _filters ); + + + // + // Update problem view + // + + if ( updateMode() ) + { + if ( YQPkgUpdateProblemFilterView::haveProblematicPackages() + || testMode() ) + { + _updateProblemFilterView = new YQPkgUpdateProblemFilterView( parent ); + CHECK_PTR( _updateProblemFilterView ); + _filters->addPage( _( "Update Problems" ), _updateProblemFilterView ); + } + } + + + // + // Patches view + // + + if ( onlineUpdateMode() +#if ALWAYS_SHOW_PATCHES_VIEW_IF_PATCHES_AVAILABLE + || ! zyppPool().empty() +#endif + ) + addPatchFilterView(); + + + // + // Patterns view + // + + if ( ! zyppPool().empty() || testMode() ) + { + _patternList = new YQPkgPatternList( parent, true ); + CHECK_PTR( _patternList ); + _filters->addPage( _( "Patterns" ), _patternList ); + + connect( _patternList, SIGNAL( statusChanged() ), + this, SLOT ( autoResolveDependencies() ) ); + + connect( this, SIGNAL( refresh() ), + _patternList, SLOT ( updateItemStates() ) ); + + if ( _pkgConflictDialog ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _patternList, SLOT ( updateItemStates() ) ); + } + } + + + // + // Selections view + // + + if ( ! zyppPool().empty() || testMode() ) + { + + _selList = new YQPkgSelList( parent, true ); + CHECK_PTR( _selList ); + _filters->addPage( _( "Selections" ), _selList ); + + connect( _selList, SIGNAL( statusChanged() ), + this, SLOT ( autoResolveDependencies() ) ); + + connect( this, SIGNAL( refresh() ), + _selList, SLOT ( updateItemStates() ) ); + + if ( _pkgConflictDialog ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _selList, SLOT ( updateItemStates() ) ); + } + } + + + // + // RPM group tags view + // + + _rpmGroupTagsFilterView = new YQPkgRpmGroupTagsFilterView( parent ); + CHECK_PTR( _rpmGroupTagsFilterView ); + _filters->addPage( _( "Package Groups" ), _rpmGroupTagsFilterView ); + + connect( this, SIGNAL( loadData() ), + _rpmGroupTagsFilterView, SLOT ( filter() ) ); + + + // + // Languages view + // + + _langList = new YQPkgLangList( parent ); + CHECK_PTR( _langList ); + + _filters->addPage( _( "Languages" ), _langList ); + _langList->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ) ); // hor/vert + + connect( _langList, SIGNAL( statusChanged() ), + this, SLOT ( autoResolveDependencies() ) ); + + connect( this, SIGNAL( refresh() ), + _langList, SLOT ( updateItemStates() ) ); + + + // + // Repository view + // + + _repoFilterView = new YQPkgRepoFilterView( parent ); + CHECK_PTR( _repoFilterView ); + _filters->addPage( _( "Repositories" ), _repoFilterView ); + + + // + // Package search view + // + + _searchFilterView = new YQPkgSearchFilterView( parent ); + CHECK_PTR( _searchFilterView ); + _filters->addPage( _( "Search" ), _searchFilterView ); + + + // + // Status change view + // + + _statusFilterView = new YQPkgStatusFilterView( parent ); + CHECK_PTR( _statusFilterView ); + _filters->addPage( _( "Installation Summary" ), _statusFilterView ); + + +#if 0 + // DEBUG + + _filters->addPage( _( "Keywords" ), new QLabel( "Keywords\nfilter\n\nfor future use", 0 ) ); + _filters->addPage( _( "MIME Types" ), new QLabel( "MIME Types\nfilter\n\nfor future use" , 0 ) ); +#endif + +} + + +QWidget * +YQPackageSelector::layoutRightPane( QWidget * parent ) +{ + QVBox * right_pane_vbox = new QVBox( parent ); + CHECK_PTR( right_pane_vbox ); + right_pane_vbox->setMargin( MARGIN ); + + QSplitter * splitter = new QSplitter( QSplitter::Vertical, right_pane_vbox ); + CHECK_PTR( splitter ); + + QVBox * splitter_vbox = new QVBox( splitter ); + CHECK_PTR( splitter_vbox ); + layoutPkgList( splitter_vbox ); + addVSpacing( splitter_vbox, MARGIN ); + + layoutDetailsViews( splitter ); + + layoutButtons( right_pane_vbox ); + + return right_pane_vbox; +} + + +void +YQPackageSelector::layoutPkgList( QWidget * parent ) +{ + _pkgList= new YQPkgList( parent ); + CHECK_PTR( _pkgList ); + + connect( _pkgList, SIGNAL( statusChanged() ), + this, SLOT ( autoResolveDependencies() ) ); +} + + +void +YQPackageSelector::layoutDetailsViews( QWidget * parent ) +{ + bool haveInstalledPkgs = YQPkgList::haveInstalledPkgs(); + + QVBox * details_vbox = new QVBox( parent ); + CHECK_PTR( details_vbox ); + details_vbox->setMinimumSize( 0, 0 ); + + addVSpacing( details_vbox, 8 ); + + _detailsViews = new QTabWidget( details_vbox ); + CHECK_PTR( _detailsViews ); + _detailsViews->setMargin( MARGIN ); + + // _detailsViews->setTabPosition( QTabWidget::Bottom ); + + + // + // Description + // + + _pkgDescriptionView = new YQPkgDescriptionView( _detailsViews ); + CHECK_PTR( _pkgDescriptionView ); + + _detailsViews->addTab( _pkgDescriptionView, _( "D&escription" ) ); + _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgDescriptionView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + // + // Technical details + // + + _pkgTechnicalDetailsView = new YQPkgTechnicalDetailsView( _detailsViews ); + CHECK_PTR( _pkgTechnicalDetailsView ); + + _detailsViews->addTab( _pkgTechnicalDetailsView, _( "&Technical Data" ) ); + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgTechnicalDetailsView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + + // + // Dependencies + // + + _pkgDependenciesView = new YQPkgDependenciesView( _detailsViews ); + CHECK_PTR( _pkgDependenciesView ); + + _detailsViews->addTab( _pkgDependenciesView, _( "Dependencies" ) ); + _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgDependenciesView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + + + // + // Versions + // + + _pkgVersionsView = new YQPkgVersionsView( _detailsViews, + true ); // userCanSwitchVersions + CHECK_PTR( _pkgVersionsView ); + + _detailsViews->addTab( _pkgVersionsView, _( "&Versions" ) ); + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgVersionsView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + + // + // File List + // + + if ( haveInstalledPkgs ) // file list information is only available for installed pkgs + { + _pkgFileListView = new YQPkgFileListView( _detailsViews ); + CHECK_PTR( _pkgFileListView ); + + _detailsViews->addTab( _pkgFileListView, _( "File List" ) ); + _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgFileListView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + } + + + // + // Change Log + // + + if ( haveInstalledPkgs ) // change log information is only available for installed pkgs + { + _pkgChangeLogView = new YQPkgChangeLogView( _detailsViews ); + CHECK_PTR( _pkgChangeLogView ); + + _detailsViews->addTab( _pkgChangeLogView, _( "Change Log" ) ); + _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgChangeLogView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + } +} + + +void +YQPackageSelector::layoutButtons( QWidget * parent ) +{ + QHBox * button_box = new QHBox( parent ); + CHECK_PTR( button_box ); + button_box->setSpacing( SPACING ); + + // Button: Dependency check + // Translators: Please keep this short! + _checkDependenciesButton = new QPushButton( _( "Chec&k" ), button_box ); + CHECK_PTR( _checkDependenciesButton ); + _checkDependenciesButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + _normalButtonBackground = _checkDependenciesButton->paletteBackgroundColor(); + + connect( _checkDependenciesButton, SIGNAL( clicked() ), + this, SLOT ( manualResolvePackageDependencies() ) ); + + + // Checkbox: Automatically check dependencies for every package status change? + // Translators: Please keep this short! + _autoDependenciesCheckBox = new QCheckBox( _( "A&utocheck" ), button_box ); + CHECK_PTR( _autoDependenciesCheckBox ); + _autoDependenciesCheckBox->setChecked( AUTO_CHECK_DEPENDENCIES_DEFAULT ); + + addHStretch( button_box ); + + QPushButton * cancel_button = new QPushButton( _( "&Cancel" ), button_box ); + CHECK_PTR( cancel_button ); + cancel_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( cancel_button, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + + QPushButton * accept_button = new QPushButton( _( "&Accept" ), button_box ); + CHECK_PTR( accept_button ); + accept_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( accept_button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + button_box->setFixedHeight( button_box->sizeHint().height() ); +} + + +void +YQPackageSelector::layoutMenuBar( QWidget * parent ) +{ + _menuBar = new QMenuBar( parent ); + CHECK_PTR( _menuBar ); + + _fileMenu = 0; + _viewMenu = 0; + _pkgMenu = 0; + _patchMenu = 0; + _extrasMenu = 0; + _helpMenu = 0; + +} + + +void +YQPackageSelector::addMenus() +{ + // + // File menu + // + + _fileMenu = new QPopupMenu( _menuBar ); + CHECK_PTR( _fileMenu ); + _menuBar->insertItem( _( "&File" ), _fileMenu ); + + _fileMenu->insertItem( _( "&Import..." ), this, SLOT( pkgImport() ) ); + _fileMenu->insertItem( _( "&Export..." ), this, SLOT( pkgExport() ) ); + + _fileMenu->insertSeparator(); + + _fileMenu->insertItem( _( "E&xit -- Discard Changes" ), this, SLOT( reject() ) ); + _fileMenu->insertItem( _( "&Quit -- Save Changes" ), this, SLOT( accept() ) ); + + + if ( _pkgList ) + { + // + // View menu + // + + _viewMenu = new QPopupMenu( _menuBar ); + CHECK_PTR( _viewMenu ); + _menuBar->insertItem( _( "&View" ), _viewMenu ); + + // Translators: This is about packages ending in "-devel", so don't translate that "-devel"! + _viewShowDevelID = _viewMenu->insertItem( _( "Show -de&vel Packages" ), + this, SLOT( pkgExcludeRulesChanged( int ) ), Key_F7 ); + _viewMenu->setItemChecked( _viewShowDevelID, true ); + _excludeDevelPkgs = new YQPkgObjList::ExcludeRule( _pkgList, QRegExp( ".*-devel(-\\d+bit)?$" ), _pkgList->nameCol() ); + CHECK_PTR( _excludeDevelPkgs ); + _excludeDevelPkgs->enable( false ); + + // Translators: This is about packages ending in "-debuginfo", so don't translate that "-debuginfo"! + _viewShowDebugInfoID = _viewMenu->insertItem( _( "Show -&debuginfo Packages" ), + this, SLOT( pkgExcludeRulesChanged( int ) ), Key_F8 ); + _viewMenu->setItemChecked( _viewShowDebugInfoID, true ); + _excludeDebugInfoPkgs = new YQPkgObjList::ExcludeRule( _pkgList, QRegExp( ".*-debuginfo$" ), _pkgList->nameCol() ); + CHECK_PTR( _excludeDebugInfoPkgs ); + _excludeDebugInfoPkgs->enable( false ); + + + // + // Package menu + // + + _pkgMenu = new QPopupMenu( _menuBar ); + CHECK_PTR( _pkgMenu ); + _menuBar->insertItem( _( "&Package" ), _pkgMenu ); + + _pkgList->actionSetCurrentInstall->addTo( _pkgMenu ); + _pkgList->actionSetCurrentDontInstall->addTo( _pkgMenu ); + _pkgList->actionSetCurrentKeepInstalled->addTo( _pkgMenu ); + _pkgList->actionSetCurrentDelete->addTo( _pkgMenu ); + _pkgList->actionSetCurrentUpdate->addTo( _pkgMenu ); + _pkgList->actionSetCurrentTaboo->addTo( _pkgMenu ); + _pkgList->actionSetCurrentProtected->addTo( _pkgMenu ); + + _pkgMenu->insertSeparator(); + + _pkgList->actionInstallSourceRpm->addTo( _pkgMenu ); + _pkgList->actionDontInstallSourceRpm->addTo( _pkgMenu ); + + _pkgMenu->insertSeparator(); + QPopupMenu * submenu = _pkgList->addAllInListSubMenu( _pkgMenu ); + CHECK_PTR( submenu ); + + submenu->insertSeparator(); + _pkgList->actionInstallListSourceRpms->addTo( submenu ); + _pkgList->actionDontInstallListSourceRpms->addTo( submenu ); + + + // + // Submenu for all packages + // + + submenu = new QPopupMenu( _pkgMenu ); + CHECK_PTR( submenu ); + + // Translators: Unlike the "all in this list" submenu, this submenu + // refers to all packages globally, not only to those that are + // currently visible in the packages list. + _pkgMenu->insertItem( _( "All Packages" ), submenu ); + + submenu->insertItem( _( "Update if newer version available" ), + this, SLOT( globalUpdatePkg() ) ); + + submenu->insertItem( _( "Update unconditionally" ), + this, SLOT( globalUpdatePkgForce() ) ); + } + + + if ( _patchList ) + { + // + // Patch menu + // + + _patchMenu = new QPopupMenu( _menuBar ); + CHECK_PTR( _patchMenu ); + _menuBar->insertItem( _( "&Patch" ), _patchMenu ); + + _patchList->actionSetCurrentInstall->addTo( _patchMenu ); + _patchList->actionSetCurrentDontInstall->addTo( _patchMenu ); + _patchList->actionSetCurrentKeepInstalled->addTo( _patchMenu ); +#if ENABLE_DELETING_PATCHES + _patchList->actionSetCurrentDelete->addTo( _patchMenu ); +#endif + _patchList->actionSetCurrentUpdate->addTo( _patchMenu ); + _patchList->actionSetCurrentTaboo->addTo( _patchMenu ); + + _patchMenu->insertSeparator(); + _patchList->addAllInListSubMenu( _patchMenu ); + } + + + // + // Extras menu + // + + _extrasMenu = new QPopupMenu( _menuBar ); + CHECK_PTR( _extrasMenu ); + _menuBar->insertItem( _( "&Extras" ), _extrasMenu ); + + _extrasMenu->insertItem( _( "Show &Products" ), this, SLOT( showProducts() ) ); + _extrasMenu->insertItem( _( "Show &Automatic Package Changes" ), this, SLOT( showAutoPkgList() ), CTRL + Key_A ); + _extrasMenu->insertItem( _( "&Verify System" ), this, SLOT( verifySystem() ) ); + + _extrasMenu->insertSeparator(); + + // Translators: This is about packages ending in "-devel", so don't translate that "-devel"! + _extrasMenu->insertItem( _( "Install All Matching -&devel Packages" ), this, SLOT( installDevelPkgs() ) ); + + // Translators: This is about packages ending in "-debuginfo", so don't translate that "-debuginfo"! + _extrasMenu->insertItem( _( "Install All Matching -de&buginfo Packages" ), this, SLOT( installDebugInfoPkgs() ) ); + + _extrasMenu->insertSeparator(); + + if ( _pkgConflictDialog ) + _extrasMenu->insertItem( _( "Generate Dependency Resolver &Test Case" ), + _pkgConflictDialog, SLOT( askCreateSolverTestCase() ) ); + + if ( _actionResetIgnoredDependencyProblems ) + _actionResetIgnoredDependencyProblems->addTo( _extrasMenu ); + + +#ifdef FIXME + if ( _patchList ) + _patchList->actionShowRawPatchInfo->addTo( _extrasMenu ); +#endif + + + // + // Help menu + // + + _helpMenu = new QPopupMenu( _menuBar ); + CHECK_PTR( _helpMenu ); + _menuBar->insertSeparator(); + _menuBar->insertItem( _( "&Help" ), _helpMenu ); + + // Note: The help functions and their texts are moved out + // to a separate source file YQPackageSelectorHelp.cc + + // Menu entry for help overview + _helpMenu->insertItem( _( "&Overview" ), this, SLOT( help() ), Key_F1 ); + + // Menu entry for help about used symbols ( icons ) + _helpMenu->insertItem( _( "&Symbols" ), this, SLOT( symbolHelp() ), SHIFT + Key_F1 ); + + // Menu entry for keyboard help + _helpMenu->insertItem( _( "&Keys" ), this, SLOT( keyboardHelp() ) ); +} + + +void +YQPackageSelector::connectFilter( QWidget * filter, + QWidget * pkgList, + bool hasUpdateSignal ) +{ + if ( ! filter ) return; + if ( ! pkgList ) return; + + if ( _filters ) + { + connect( _filters, SIGNAL( currentChanged(QWidget *) ), + filter, SLOT ( filterIfVisible() ) ); + } + + connect( this, SIGNAL( refresh() ), + filter, SLOT ( filterIfVisible() ) ); + + connect( filter, SIGNAL( filterStart() ), + pkgList, SLOT ( clear() ) ); + + connect( filter, SIGNAL( filterMatch( ZyppSel, ZyppPkg ) ), + pkgList, SLOT ( addPkgItem ( ZyppSel, ZyppPkg ) ) ); + + connect( filter, SIGNAL( filterFinished() ), + pkgList, SLOT ( selectSomething() ) ); + + connect( filter, SIGNAL( filterFinished() ), + pkgList, SLOT ( logExcludeStatistics() ) ); + + + if ( hasUpdateSignal ) + { + connect( filter, SIGNAL( updatePackages() ), + pkgList, SLOT ( updateItemStates() ) ); + + if ( _diskUsageList ) + { + connect( filter, SIGNAL( updatePackages() ), + _diskUsageList, SLOT ( updateDiskUsage() ) ); + } + } +} + + +void +YQPackageSelector::makeConnections() +{ + connect( this, SIGNAL( resolvingStarted() ), + this, SLOT ( animateCheckButton() ) ); + + connect( this, SIGNAL( resolvingFinished() ), + this, SLOT ( restoreCheckButton() ) ); + + connectFilter( _updateProblemFilterView, _pkgList, false ); + connectFilter( _patternList, _pkgList ); + connectFilter( _selList, _pkgList ); + connectFilter( _repoFilterView, _pkgList, false ); + connectFilter( _rpmGroupTagsFilterView, _pkgList, false ); + connectFilter( _langList, _pkgList ); + connectFilter( _statusFilterView, _pkgList, false ); + connectFilter( _searchFilterView, _pkgList, false ); + + if ( _searchFilterView && _pkgList ) + { + connect( _searchFilterView, SIGNAL( message( const QString & ) ), + _pkgList, SLOT ( message( const QString & ) ) ); + } + + if ( _repoFilterView && _pkgList ) + { + connect( _repoFilterView, SIGNAL( filterNearMatch ( ZyppSel, ZyppPkg ) ), + _pkgList, SLOT ( addPkgItemDimmed ( ZyppSel, ZyppPkg ) ) ); + } + + if ( _pkgList && _diskUsageList ) + { + + connect( _pkgList, SIGNAL( statusChanged() ), + _diskUsageList, SLOT ( updateDiskUsage() ) ); + } + + connectPatchList(); + + + + // + // Connect package conflict dialog + // + + if ( _pkgConflictDialog ) + { + if (_pkgList ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _pkgList, SLOT ( updateItemStates() ) ); + } + + if ( _patternList ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _patternList, SLOT ( updateItemStates() ) ); + } + + if ( _selList ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _selList, SLOT ( updateItemStates() ) ); + } + + if ( _diskUsageList ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _diskUsageList, SLOT ( updateDiskUsage() ) ); + } + } + + + // + // Connect package versions view + // + + if ( _pkgVersionsView && _pkgList ) + { + connect( _pkgVersionsView, SIGNAL( candidateChanged( ZyppObj ) ), + _pkgList, SLOT ( updateItemData() ) ); + } + + + // + // Hotkey to enable "patches" filter view on the fly + // + + QAccel * accel = new QAccel( this ); + CHECK_PTR( accel ); + accel->connectItem( accel->insertItem( Key_F2 ), + this, SLOT( hotkeyInsertPatchFilterView() ) ); + + + // + // Update actions just before opening menus + // + + if ( _pkgMenu && _pkgList ) + { + connect( _pkgMenu, SIGNAL( aboutToShow() ), + _pkgList, SLOT ( updateActions() ) ); + } + + if ( _patchMenu && _patchList ) + { + connect( _patchMenu, SIGNAL( aboutToShow() ), + _patchList, SLOT ( updateActions() ) ); + } +} + + +void +YQPackageSelector::animateCheckButton() +{ + if ( _checkDependenciesButton ) + { + _checkDependenciesButton->setPaletteBackgroundColor( QColor( 0xE0, 0xE0, 0xF8 ) ); + _checkDependenciesButton->repaint(); + } +} + + +void +YQPackageSelector::restoreCheckButton() +{ + if ( _checkDependenciesButton ) + _checkDependenciesButton->setPaletteBackgroundColor( _normalButtonBackground ); +} + + +void +YQPackageSelector::autoResolveDependencies() +{ + if ( _autoDependenciesCheckBox && ! _autoDependenciesCheckBox->isChecked() ) + return; + + resolveDependencies(); +} + + +int +YQPackageSelector::manualResolvePackageDependencies() +{ + if ( ! _pkgConflictDialog ) + { + y2error( "No package conflict dialog existing" ); + return QDialog::Accepted; + } + + YQUI::ui()->busyCursor(); + int result = _pkgConflictDialog->solveAndShowConflicts(); + YQUI::ui()->normalCursor(); + +#if DEPENDENCY_FEEDBACK_IF_OK + + if ( result == QDialog::Accepted ) + { + QMessageBox::information( this, "", + _( "All package dependencies are OK." ), + QMessageBox::Ok ); + } +#endif + + return result; +} + + +void +YQPackageSelector::addPatchFilterView() +{ + if ( ! _patchFilterView ) + { + _patchFilterView = new YQPkgPatchFilterView( this ); + CHECK_PTR( _patchFilterView ); + _filters->addPage( _( "Patches" ), _patchFilterView ); + + _patchList = _patchFilterView->patchList(); + CHECK_PTR( _patchList ); + + connectPatchList(); + } +} + + +void +YQPackageSelector::hotkeyInsertPatchFilterView() +{ + if ( ! _patchFilterView ) + { + y2milestone( "Activating patches filter view" ); + + addPatchFilterView(); + connectPatchList(); + + _filters->showPage( _patchFilterView ); + _pkgList->clear(); + _patchList->filter(); + } +} + + +void +YQPackageSelector::connectPatchList() +{ + if ( _pkgList && _patchList ) + { + connectFilter( _patchList, _pkgList ); + + connect( _patchList, SIGNAL( filterMatch ( const QString &, const QString &, FSize ) ), + _pkgList, SLOT ( addPassiveItem( const QString &, const QString &, FSize ) ) ); + + connect( _patchList, SIGNAL( statusChanged() ), + this, SLOT ( autoResolveDependencies() ) ); + + if ( _pkgConflictDialog ) + { + connect( _pkgConflictDialog,SIGNAL( updatePackages() ), + _patchList, SLOT ( updateItemStates() ) ); + } + + connect( this, SIGNAL( refresh() ), + _patchList, SLOT ( updateItemStates() ) ); + + } +} + + +void +YQPackageSelector::pkgExport() +{ + QString filename = YQUI::ui()->askForSaveFileName( QString( DEFAULT_EXPORT_FILE_NAME ), // startsWith + QString( "*.xml;;*" ), // filter + _( "Save Package List" ) ); + + if ( ! filename.isEmpty() ) + { + zypp::syscontent::Writer writer; + const zypp::ResPool & pool = zypp::getZYpp()->pool(); + + // The ZYPP obfuscated C++ contest proudly presents: + + for_each( pool.begin(), pool.end(), + boost::bind( &zypp::syscontent::Writer::addIf, + boost::ref( writer ), + _1 ) ); + // Yuck. What a mess. + // + // Does anybody seriously believe this kind of thing is easier to read, + // let alone use? Get real. This is an argument in favour of all C++ + // haters. And it's one that is really hard to counter. + // + // -sh 2006-12-13 + + try + { + std::ofstream exportFile( toUTF8( filename ).c_str() ); + exportFile.exceptions( std::ios_base::badbit | std::ios_base::failbit ); + exportFile << writer; + + y2milestone( "Package list exported to %s", (const char *) filename ); + } + catch ( std::exception & exception ) + { + y2warning( "Error exporting package list to %s", (const char *) filename ); + + // The export might have left over a partially written file. + // Try to delete it. Don't care if it doesn't exist and unlink() fails. + (void) unlink( (const char *) filename ); + + // Post error popup + QMessageBox::warning( this, // parent + _( "Error" ), // caption + _( "Error exporting package list to %1" ).arg( filename ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + } +} + + +void +YQPackageSelector::pkgImport() +{ + QString filename = QFileDialog::getOpenFileName( DEFAULT_EXPORT_FILE_NAME, // startsWith + "*.xml+;;*", // filter + this, // parent + 0, // name + _( "Load Package List" ) ); // caption + + if ( ! filename.isEmpty() ) + { + y2milestone( "Importing package list from %s", (const char *) filename ); + + try + { + std::ifstream importFile( toUTF8( filename ).c_str() ); + zypp::syscontent::Reader reader( importFile ); + + // + // Put reader contents into maps + // + + typedef zypp::syscontent::Reader::Entry ZyppReaderEntry; + typedef std::pair ImportMapPair; + + map importPkg; + map importPatterns; + + for ( zypp::syscontent::Reader::const_iterator it = reader.begin(); + it != reader.end(); + ++ it ) + { + string kind = it->kind(); + + if ( kind == "package" ) importPkg.insert ( ImportMapPair( it->name(), *it ) ); + else if ( kind == "pattern" ) importPatterns.insert( ImportMapPair( it->name(), *it ) ); + } + + y2debug( "Found %zu packages and %zu patterns in %s", + importPkg.size(), + importPatterns.size(), + (const char *) filename ); + + + // + // Set status of all patterns and packages according to import map + // + + for ( ZyppPoolIterator it = zyppPatternsBegin(); + it != zyppPatternsEnd(); + ++it ) + { + ZyppSel selectable = *it; + importSelectable( *it, importPatterns.find( selectable->name() ) != importPatterns.end(), "pattern" ); + } + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppSel selectable = *it; + importSelectable( *it, importPkg.find( selectable->name() ) != importPkg.end(), "package" ); + } + + + // + // Display result + // + + emit refresh(); + + if ( _statusFilterView ) + { + // Switch to "Installation Summary" filter view + + _filters->showPage( _statusFilterView ); + _statusFilterView->filter(); + } + + } + catch ( const zypp::Exception & exception ) + { + y2warning( "Error reading package list from %s", (const char *) filename ); + + // Post error popup + QMessageBox::warning( this, // parent + _( "Error" ), // caption + _( "Error loading package list from %1" ).arg( filename ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + } +} + + +void +YQPackageSelector::importSelectable( ZyppSel selectable, + bool isWanted, + const char * kind ) +{ + ZyppStatus oldStatus = selectable->status(); + ZyppStatus newStatus = oldStatus; + + if ( isWanted ) + { + // + // Make sure this selectable does not get installed + // + + switch ( oldStatus ) + { + case S_Install: + case S_AutoInstall: + case S_KeepInstalled: + case S_Protected: + case S_Update: + case S_AutoUpdate: + newStatus = oldStatus; + break; + + case S_Del: + case S_AutoDel: + newStatus = S_KeepInstalled; + y2debug( "Keeping %s %s", kind, selectable->name().c_str() ); + break; + + case S_NoInst: + case S_Taboo: + + if ( selectable->hasCandidateObj() ) + { + newStatus = S_Install; + y2debug( "Adding %s %s", kind, selectable->name().c_str() ); + } + else + { + y2debug( "Can't add %s %s: No candidate", + kind, selectable->name().c_str() ); + } + break; + } + } + else // ! isWanted + { + // + // Make sure this selectable does not get installed + // + + switch ( oldStatus ) + { + case S_Install: + case S_AutoInstall: + case S_KeepInstalled: + case S_Protected: + case S_Update: + case S_AutoUpdate: + newStatus = S_Del; + y2debug( "Deleting %s %s", kind, selectable->name().c_str() ); + break; + + case S_Del: + case S_AutoDel: + case S_NoInst: + case S_Taboo: + newStatus = oldStatus; + break; + } + } + + if ( oldStatus != newStatus ) + selectable->set_status( newStatus ); +} + + +void +YQPackageSelector::globalUpdatePkg( bool force ) +{ + if ( ! _pkgList ) + return; + + int count = _pkgList->globalSetPkgStatus( S_Update, force, + true ); // countOnly + y2milestone( "%d pkgs found for update", count ); + + if ( count >= GLOBAL_UPDATE_CONFIRMATION_THRESHOLD ) + { + if ( QMessageBox::question( this, "", // caption + // Translators: %1 is the number of affected packages + _( "%1 packages will be updated" ).arg( count ), + _( "&Continue" ), _( "C&ancel" ), + 0, // defaultButtonNumber (from 0) + 1 ) // escapeButtonNumber + == 1 ) // "Cancel"? + { + return; + } + } + + (void) _pkgList->globalSetPkgStatus( S_Update, force, + false ); // countOnly + + if ( _statusFilterView ) + { + _filters->showPage( _statusFilterView ); + _statusFilterView->clear(); + _statusFilterView->showTransactions(); + _statusFilterView->filter(); + } +} + + +void +YQPackageSelector::showProducts() +{ + YQPkgProductDialog::showProductDialog(); +} + +void +YQPackageSelector::installDevelPkgs() +{ + installSubPkgs( "-devel" ); +} + + +void +YQPackageSelector::installDebugInfoPkgs() +{ + installSubPkgs( "-debuginfo" ); +} + + +void +YQPackageSelector::pkgExcludeRulesChanged( int menuItemID ) +{ + if ( _viewMenu && _pkgList ) + { + _viewMenu->setItemChecked( menuItemID, ! _viewMenu->isItemChecked( menuItemID ) ); + + if ( _excludeDevelPkgs ) + _excludeDevelPkgs->enable( ! _viewMenu->isItemChecked( _viewShowDevelID ) ); + + if ( _excludeDebugInfoPkgs ) + _excludeDebugInfoPkgs->enable( ! _viewMenu->isItemChecked( _viewShowDebugInfoID ) ); + + _pkgList->applyExcludeRules(); + } +} + + +void +YQPackageSelector::installSubPkgs( const QString suffix ) +{ + // Find all matching packages and put them into a QMap + + QMap subPkgs; + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + QString name = (*it)->name().c_str(); + + if ( name.endsWith( suffix ) ) + { + subPkgs[ name ] = *it; + + y2debug( "Found subpackage: %s", (const char *) name ); + } + } + + + // Now go through all packages and look if there is a corresponding subpackage in the QMap + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + QString name = (*it)->name().c_str(); + + if ( subPkgs.contains( name + suffix ) ) + { + QString subPkgName( name + suffix ); + ZyppSel subPkg = subPkgs[ subPkgName ]; + + switch ( (*it)->status() ) + { + case S_AutoDel: + case S_NoInst: + case S_Protected: + case S_Taboo: + case S_Del: + // Don't install the subpackage + y2milestone( "Ignoring unwanted subpackage %s", (const char *) subPkgName ); + break; + + case S_AutoInstall: + case S_Install: + case S_KeepInstalled: + + // Install the subpackage, but don't try to update it + + if ( ! subPkg->installedObj() ) + { + subPkg->set_status( S_Install ); + y2milestone( "Installing subpackage %s", (const char *) subPkgName ); + } + break; + + + case S_Update: + case S_AutoUpdate: + + // Install or update the subpackage + + if ( ! subPkg->installedObj() ) + { + subPkg->set_status( S_Install ); + y2milestone( "Installing subpackage %s", (const char *) subPkgName ); + } + else + { + subPkg->set_status( S_Update ); + y2milestone( "Updating subpackage %s", (const char *) subPkgName ); + } + break; + + // Intentionally omitting 'default' branch so the compiler can + // catch unhandled enum states + } + } + } + + + if ( _filters && _statusFilterView ) + { + _filters->showPage( _statusFilterView ); + _statusFilterView->filter(); + } + + YQPkgChangesDialog::showChangesDialog( _( "Added Subpackages:" ), + QRegExp( ".*" + suffix + "$" ), + _( "&OK" ), + QString::null, // rejectButtonLabel + true ); // showIfEmpty +} + + +#include "YQPackageSelector.moc" diff --git a/src/pkg/YQPackageSelector.h b/src/pkg/YQPackageSelector.h new file mode 100644 index 0000000..289a3e6 --- /dev/null +++ b/src/pkg/YQPackageSelector.h @@ -0,0 +1,335 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPackageSelector.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPackageSelector_h +#define YQPackageSelector_h + +#include +#include +#include + +#include "YQPackageSelectorBase.h" +#include "YQPkgObjList.h" + +class QCheckBox; +class QComboBox; +class QLabel; +class QListView; +class QProgressBar; +class QPushButton; +class QSplitter; +class QTabWidget; +class QPopupMenu; +class QMenuBar; + +class QY2ComboTabWidget; + +class YQPkgChangeLogView; +class YQPkgDependenciesView; +class YQPkgDescriptionView; +class YQPkgDiskUsageList; +class YQPkgFileListView; +class YQPkgRepoFilterView; +class YQPkgLangList; +class YQPkgList; +class YQPkgPatternList; +class YQPkgRpmGroupTagsFilterView; +class YQPkgSearchFilterView; +class YQPkgSelList; +class YQPkgStatusFilterView; +class YQPkgTechnicalDetailsView; +class YQPkgUpdateProblemFilterView; +class YQPkgVersionsView; +class YQPkgPatchFilterView; +class YQPkgPatchList; + +class YQPackageSelector : public YQPackageSelectorBase +{ + Q_OBJECT + +public: + + YQPackageSelector( YWidget * parent, long modeFlags = 0 ); + + +public slots: + + /** + * Resolve package dependencies manually. + * + * Returns QDialog::Accepted or QDialog::Rejected. + **/ + int manualResolvePackageDependencies(); + + /** + * Automatically resolve package dependencies if desired + * (if the "auto check" checkbox is on). + **/ + void autoResolveDependencies(); + + /** + * Export all current selection/package states + **/ + void pkgExport(); + + /** + * Import selection/package states + **/ + void pkgImport(); + + /** + * Install any -devel package for packages that are installed or marked for + * installation + **/ + void installDevelPkgs(); + + /** + * Install any -debuginfo package for packages that are installed or marked + * for installation + **/ + void installDebugInfoPkgs(); + + /** + * Install any subpackage that ends with 'suffix' for packages that are + * installed or marked for installation + **/ + void installSubPkgs( const QString suffix ); + + /** + * Enable or disable the package exclude rules (show or suppress -debuginfo + * or -devel packages) according to the current menu settings and apply the + * exclude rules. + **/ + void pkgExcludeRulesChanged( int menuItemID ); + + /** + * Display (generic) online help. + **/ + void help(); + + /** + * Display online help about symbols (package status icons). + **/ + void symbolHelp(); + + /** + * Display online help about magic keys. + **/ + void keyboardHelp(); + + +signals: + + /** + * Emitted once (!) when the dialog is about to be shown, when all widgets + * are created and all signal/slot connections are set up - when it makes + * sense to load data. + **/ + void loadData(); + + /** + * Emitted when the internal data base might have changed and a refresh of + * all displayed data might be necessary - e.g., when saved (exported) pkg + * states are reimported. + **/ + void refresh(); + + +protected slots: + + /** + * Animate the "Check" button when dependency resolving is in progress, + * i.e. change its background color + **/ + void animateCheckButton(); + + /** + * Restore the normal background color of the "Check" button. + **/ + void restoreCheckButton(); + + /** + * Add the "Patches" filter view, if it is not already there. + **/ + void addPatchFilterView(); + + /** + * Add the "Patches" filter view upon hotkey (F2). + **/ + void hotkeyInsertPatchFilterView(); + + /** + * Set the status of all installed packages (all in the pool, not only + * those currently displayed in the package list) to "update", if there is + * a candidate package that is newer than the installed package. + **/ + void globalUpdatePkg() { globalUpdatePkg( false ); } + + /** + * Set the status of all installed packages (all in the pool, not only + * those currently displayed in the package list) to "update", even if the + * candidate package is not newer than the installed package. + **/ + void globalUpdatePkgForce() { globalUpdatePkg( true ); } + + /** + * Show all products in a popup dialog. + **/ + void showProducts(); + + + +protected: + + // Layout methods - create and layout widgets + + void basicLayout(); + + QWidget * layoutLeftPane ( QWidget * parent ); + QWidget * layoutRightPane ( QWidget * parent ); + void layoutFilters ( QWidget * parent ); + void layoutPkgList ( QWidget * parent ); + void layoutDetailsViews ( QWidget * parent ); + void layoutButtons ( QWidget * parent ); + void layoutMenuBar ( QWidget * parent ); + + /** + * Establish Qt signal / slot connections. + * + * This really needs to be a separate method to make sure all affected + * wigets are created at this point. + **/ + void makeConnections(); + + /** + * Add pulldown menus to the menu bar. + * + * This really needs to be a separate method to make sure all affected + * wigets are created at this point. + **/ + void addMenus(); + + /** + * Connect a filter view that provides the usual signals with a package + * list. By convention, filter views provide the following signals: + * filterStart() + * filterMatch() + * filterFinished() + * updatePackages() (optional) + **/ + void connectFilter( QWidget * filter, + QWidget * pkgList, + bool hasUpdateSignal = true ); + + /** + * Connect the patch list. Caution: Possible bootstrap problem! + **/ + void connectPatchList(); + + /** + * Set the status of all installed packages (all in the pool, not only + * those currently displayed in the package list) to "update" and switch to + * the "Installation Summary" view afterwards. + * + * 'force' indicates if this should also be done if the the candidate + * package is not newer than the installed package. + **/ + void globalUpdatePkg( bool force ); + + /** + * Import one selectable: Set its status according to 'isWanted' + * based on its old status. + * 'kind' is 'package' or 'pattern' (used only for debug logging). + **/ + void importSelectable( ZyppSel selectable, + bool isWanted, + const char * kind ); + + + + /** + * Return HTML code describing a symbol (an icon). + **/ + QString symHelp( const QString & imgFileName, + const QString & summary, + const QString & explanation ); + + + /** + * Return HTML code describing a key. + **/ + QString keyHelp( const QString & key, + const QString & summary, + const QString & explanation ); + + /** + * Basic HTML formatting: Embed text into

    ...

    + **/ + static QString para( const QString & text ); + + /** + * Basic HTML formatting: Embed text into
  • ...
  • + **/ + static QString listItem( const QString & text ); + + + // Data members + + QCheckBox * _autoDependenciesCheckBox; + QPushButton * _checkDependenciesButton; + QTabWidget * _detailsViews; + QY2ComboTabWidget * _filters; + YQPkgChangeLogView * _pkgChangeLogView; + YQPkgDependenciesView * _pkgDependenciesView; + YQPkgDescriptionView * _pkgDescriptionView; + YQPkgFileListView * _pkgFileListView; + YQPkgRepoFilterView * _repoFilterView; + YQPkgLangList * _langList; + YQPkgList * _pkgList; + YQPkgPatternList * _patternList; + YQPkgRpmGroupTagsFilterView * _rpmGroupTagsFilterView; + YQPkgSearchFilterView * _searchFilterView; + YQPkgSelList * _selList; + YQPkgStatusFilterView * _statusFilterView; + YQPkgTechnicalDetailsView * _pkgTechnicalDetailsView; + YQPkgUpdateProblemFilterView * _updateProblemFilterView; + YQPkgVersionsView * _pkgVersionsView; + YQPkgPatchFilterView * _patchFilterView; + YQPkgPatchList * _patchList; + + QMenuBar * _menuBar; + QPopupMenu * _fileMenu; + QPopupMenu * _viewMenu; + QPopupMenu * _pkgMenu; + QPopupMenu * _patchMenu; + QPopupMenu * _extrasMenu; + QPopupMenu * _helpMenu; + + int _viewShowDevelID; + int _viewShowDebugInfoID; + + YQPkgObjList::ExcludeRule * _excludeDevelPkgs; + YQPkgObjList::ExcludeRule * _excludeDebugInfoPkgs; + + QColor _normalButtonBackground; +}; + + + +#endif // YQPackageSelector_h diff --git a/src/pkg/YQPackageSelectorBase.cc b/src/pkg/YQPackageSelectorBase.cc new file mode 100644 index 0000000..1baeebe --- /dev/null +++ b/src/pkg/YQPackageSelectorBase.cc @@ -0,0 +1,434 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPackageSelectorBase.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include + +#define y2log_component "qt-pkg" +#include + +#include +#include "QY2LayoutUtils.h" + +#include "YQPackageSelectorBase.h" +#include "YQPkgChangesDialog.h" +#include "YQPkgConflictDialog.h" +#include "YQPkgDiskUsageList.h" +#include "YQPkgDiskUsageWarningDialog.h" +#include "YQPkgTextDialog.h" +#include "YQPkgObjList.h" + +#include "YQDialog.h" +#include "utf8.h" +#include "YQApplication.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQi18n.h" + + +using std::max; +using std::string; + + +YQPackageSelectorBase::YQPackageSelectorBase( YWidget * parent, + long modeFlags ) + : QVBox( (QWidget *) parent->widgetRep() ) + , YPackageSelector( parent, modeFlags ) +{ + setWidgetRep( this ); + + _showChangesDialog = false; + _pkgConflictDialog = 0; + _diskUsageList = 0; + _pkgConflictDialog = 0; + + YQUI::setTextdomain( "packages-qt" ); + setFont( YQUI::yqApp()->currentFont() ); + YQUI::ui()->blockWmClose(); // Automatically undone after UI::RunPkgSelection() + + _pkgConflictDialog = new YQPkgConflictDialog( this ); + CHECK_PTR( _pkgConflictDialog ); + + QString label = _( "Reset &Ignored Dependency Conflicts" ); + _actionResetIgnoredDependencyProblems = new QAction( label, // text + label, // menu text + (QKeySequence) 0, // accel + this ); // parent + CHECK_PTR( _actionResetIgnoredDependencyProblems ); + + connect( _actionResetIgnoredDependencyProblems, SIGNAL( activated() ), + this, SLOT ( resetIgnoredDependencyProblems() ) ); + + zyppPool().saveState(); + zyppPool().saveState(); + zyppPool().saveState(); + zyppPool().saveState(); + zyppPool().saveState(); + + + // + // Handle WM_CLOSE like "Cancel" + // + + connect( YQUI::ui(), SIGNAL( wmClose() ), + this, SLOT ( reject() ) ); + + y2milestone( "PackageSelectorBase init done" ); +} + + +YQPackageSelectorBase::~YQPackageSelectorBase() +{ + y2milestone( "Destroying PackageSelector" ); +} + + +int +YQPackageSelectorBase::resolveDependencies() +{ + if ( ! _pkgConflictDialog ) + { + y2error( "No package conflict dialog existing" ); + return QDialog::Accepted; + } + + + YQUI::ui()->busyCursor(); + emit resolvingStarted(); + + int result = _pkgConflictDialog->solveAndShowConflicts(); + + emit resolvingFinished(); + YQUI::ui()->normalCursor(); + + return result; +} + + +int +YQPackageSelectorBase::verifySystem() +{ + if ( ! _pkgConflictDialog ) + { + y2error( "No package conflict dialog existing" ); + return QDialog::Accepted; + } + + + YQUI::ui()->busyCursor(); + int result = _pkgConflictDialog->verifySystem(); + YQUI::ui()->normalCursor(); + + if ( result == QDialog::Accepted ) + { + QMessageBox::information( this, "", + _( "System dependencies verify OK." ), + QMessageBox::Ok ); + } + + return result; +} + + +int +YQPackageSelectorBase::checkDiskUsage() +{ + if ( ! _diskUsageList ) + { + return QDialog::Accepted; + } + + if ( ! _diskUsageList->overflowWarning.inRange() ) + return QDialog::Accepted; + + QString msg = + // Translators: RichText ( HTML-like ) format + "

    " + _( "Error: Out of disk space!" ) + "

    " + + _( "

    " + "You can choose to install anyway if you know what you are doing, " + "but you risk getting a corrupted system that requires manual repairs. " + "If you are not absolutely sure how to handle such a case, " + "press Cancel now and deselect some packages." + "

    " ); + + return YQPkgDiskUsageWarningDialog::diskUsageWarning( msg, + 100, _( "C&ontinue Anyway" ), _( "&Cancel" ) ); + +} + + + +void +YQPackageSelectorBase::showAutoPkgList() +{ + resolveDependencies(); + + // Show which packages are installed/deleted automatically + QString msg = + "

    " + // Dialog header + + _( "Automatic Changes" ) + + "

    " + // Detailed explanation ( automatic word wrap! ) + + "

    " + + _( "In addition to your manual selections, the following packages" + " have been changed to resolve dependencies:" ) + + "

    "; + + YQPkgChangesDialog::showChangesDialog( msg, + _( "&OK" ), + QString::null, // rejectButtonLabel + true ); // showIfEmpty +} + + + +void +YQPackageSelectorBase::reject() +{ + bool changes = + zyppPool().diffState() || + zyppPool().diffState() || + zyppPool().diffState() || + zyppPool().diffState() || + zyppPool().diffState(); + + if ( changes ) + { + if ( zyppPool().diffState() ) + y2milestone( "diffState() reports changed packages" ); + + if ( zyppPool().diffState() ) + y2milestone( "diffState() reports changed patterns" ); + + if ( zyppPool().diffState() ) + y2milestone( "diffState() reports changed selections" ); + + if ( zyppPool().diffState() ) + y2milestone( "diffState() reports changed languages" ); + + if ( zyppPool().diffState() ) + y2milestone( "diffState() reports changed patches" ); + } + + if ( ! changes || + ( QMessageBox::warning( this, "", + _( "Abandon all changes?" ), + _( "&OK" ), _( "&Cancel" ), "", + 1, // defaultButtonNumber (from 0) + 1 ) // escapeButtonNumber + == 0 ) // Proceed upon button #0 ( OK ) + ) + { + zyppPool().restoreState(); + zyppPool().restoreState(); + zyppPool().restoreState(); + zyppPool().restoreState(); + zyppPool().restoreState(); + + y2milestone( "Closing PackageSelector with \"Cancel\"" ); + YQUI::ui()->sendEvent( new YCancelEvent() ); + } +} + + +void +YQPackageSelectorBase::accept() +{ + bool confirmedAllLicenses; + + do + { + // Force final dependency resolving + if ( resolveDependencies() == QDialog::Rejected ) + return; + + confirmedAllLicenses = showPendingLicenseAgreements(); + + } while ( ! confirmedAllLicenses ); // Some packages will be set to S_TABOO - need another solver run + + if ( _showChangesDialog ) + { + // Show which packages are installed/deleted automatically + QString msg = + "

    " + // Dialog header + + _( "Automatic Changes" ) + + "

    " + // Detailed explanation ( automatic word wrap! ) + + "

    " + + _( "In addition to your manual selections, the following packages" + " have been changed to resolve dependencies:" ) + + "

    "; + + if ( YQPkgChangesDialog::showChangesDialog( msg, _( "C&ontinue" ), _( "&Cancel" ) ) + == QDialog::Rejected ) + return; + } + + // Check disk usage + if ( checkDiskUsage() == QDialog::Rejected ) + return; + + y2milestone( "Closing PackageSelector with \"Accept\"" ); + YQUI::ui()->sendEvent( new YMenuEvent( YCPSymbol( "accept" ) ) ); +} + + +bool +YQPackageSelectorBase::showPendingLicenseAgreements() +{ + y2milestone( "Showing all pending license agreements" ); + + bool allConfirmed = true; + + if ( onlineUpdateMode() ) + allConfirmed = showPendingLicenseAgreements( zyppPatchesBegin(), zyppPatchesEnd() ); + + allConfirmed = showPendingLicenseAgreements( zyppPkgBegin(), zyppPkgEnd() ) && allConfirmed; + + return allConfirmed; +} + + +bool +YQPackageSelectorBase::showPendingLicenseAgreements( ZyppPoolIterator begin, ZyppPoolIterator end ) +{ + bool allConfirmed = true; + + for ( ZyppPoolIterator it = begin; it != end; ++it ) + { + ZyppSel sel = (*it); + + switch ( sel->status() ) + { + case S_Install: + case S_AutoInstall: + case S_Update: + case S_AutoUpdate: + + if ( sel->candidateObj() ) + { + string licenseText = sel->candidateObj()->licenseToConfirm(); + + if ( ! licenseText.empty() ) + { + y2milestone( "Resolvable %s has a license agreement", sel->name().c_str() ); + + if( ! sel->hasLicenceConfirmed() ) + { + y2debug( "Showing license agreement for resolvable %s", sel->name().c_str() ); + allConfirmed = YQPkgObjListItem::showLicenseAgreement( sel ) && allConfirmed; + } + else + { + y2milestone( "Resolvable %s's license is already confirmed", sel->name().c_str() ); + } + } + } + break; + + default: + break; + } + } + + return allConfirmed; +} + + +void +YQPackageSelectorBase::notImplemented() +{ + QMessageBox::information( this, "", + _( "Not implemented yet. Sorry." ), + QMessageBox::Ok ); +} + + +void +YQPackageSelectorBase::resetIgnoredDependencyProblems() +{ + YQPkgConflictDialog::resetIgnoredDependencyProblems(); +} + + +void +YQPackageSelectorBase::keyPressEvent( QKeyEvent * event ) +{ + if ( event ) + { + unsigned special_combo = ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton ); + + if ( ( event->state() & special_combo ) == special_combo ) + { + if ( event->key() == Qt::Key_A ) + { + showAutoPkgList(); + event->accept(); + return; + } + } + else if ( event->key() == Qt::Key_F5 ) // No matter if Ctrl/Alt/Shift pressed + { + YQUI::ui()->easterEgg(); + return; + } + } + + QWidget::keyPressEvent( event ); +} + + +int YQPackageSelectorBase::preferredWidth() +{ + return max( 640, sizeHint().width() ); +} + + +int YQPackageSelectorBase::preferredHeight() +{ + return max( 480, sizeHint().height() ); +} + + +void +YQPackageSelectorBase::setSize( int newWidth, int newHeight ) +{ + resize( newWidth, newHeight ); +} + + +void +YQPackageSelectorBase::setEnabling( bool enabled ) +{ + QWidget::setEnabled( enabled ); +} + + +bool +YQPackageSelectorBase::setKeyboardFocus() +{ + setFocus(); + + return true; +} + + +#include "YQPackageSelectorBase.moc" diff --git a/src/pkg/YQPackageSelectorBase.h b/src/pkg/YQPackageSelectorBase.h new file mode 100644 index 0000000..01cc975 --- /dev/null +++ b/src/pkg/YQPackageSelectorBase.h @@ -0,0 +1,204 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPackageSelectorBase.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPackageSelectorBase_h +#define YQPackageSelectorBase_h + +#include +#include "YPackageSelector.h" +#include "YQZypp.h" + + +class QY2ComboTabWidget; +class QAction; + +class YQPkgConflictDialog; +class YQPkgDiskUsageList; + + +/** + * Abstract base class for package selectors. + **/ +class YQPackageSelectorBase : public QVBox, public YPackageSelector +{ + Q_OBJECT + +protected: + + /** + * Constructor + * + * Will initialize package and selection managers and create conflict + * dialogs. + **/ + YQPackageSelectorBase( YWidget * parent, long modeFlags = 0 ); + + /** + * Destructor + **/ + virtual ~YQPackageSelectorBase(); + + +public: + /** + * Set enabled/disabled state. + * + * Reimplemented from YWidget. + **/ + virtual void setEnabling( bool enabled ); + + /** + * Preferred width of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredWidth(); + + /** + * Preferred height of the widget. + * + * Reimplemented from YWidget. + **/ + virtual int preferredHeight(); + + /** + * Set the new size of the widget. + * + * Reimplemented from YWidget. + **/ + virtual void setSize( int newWidth, int newHeight ); + + /** + * Accept the keyboard focus. + * + * Reimplemented from YWidget. + **/ + virtual bool setKeyboardFocus(); + + +public slots: + + /** + * Resolve dependencies (unconditionally) for all resolvables. + * + * Returns QDialog::Accepted or QDialog::Rejected. + **/ + int resolveDependencies(); + + /** + * Verifies dependencies of the currently installed system. + * + * Returns QDialog::Accepted or QDialog::Rejected. + **/ + int verifySystem(); + + /** + * Check for disk overflow and post a warning dialog if necessary. + * The user can choose to override this warning. + * + * Returns QDialog::Accepted if no warning is necessary or if the user + * wishes to override the warning, QDialog::Rejected otherwise. + **/ + int checkDiskUsage(); + + /** + * Display a list of automatically selected packages + * (excluding packages contained in any selections that are to be installed) + **/ + void showAutoPkgList(); + + /** + * Close processing and abandon changes + **/ + void reject(); + + /** + * Close processing and accept changes + **/ + void accept(); + + /** + * Inform user about a feature that is not implemented yet. + * This should NEVER show up in the final version. + **/ + void notImplemented(); + + +signals: + + /** + * Emitted when package resolving is started. + * This can be used for some kind of "busy display". + **/ + void resolvingStarted(); + + /** + * Emitted when package resolving is finished. + **/ + void resolvingFinished(); + + +protected slots: + + /** + * Reset all previously ignored dependency problems. + **/ + void resetIgnoredDependencyProblems(); + + +protected: + + /** + * Show all license agreements the user has not confirmed yet + * (for all packages that will be installed, and in YOU mode also for + * patches). + * + * Returns 'true' if all licenses were confirmed, 'false' if one or more + * licenses were not confirmed (in which case some packages might be set to + * S_TABOO, which might require another resolver run). + **/ + bool showPendingLicenseAgreements(); + + /** + * Show all license agreements in a resolvable range. To be used with + * zyppPkgBegin() and zyppPkgEnd() or with zyppPatchesBegin() and + * zyppPatchesEnd(). + **/ + bool showPendingLicenseAgreements( ZyppPoolIterator begin, + ZyppPoolIterator end ); + + /** + * Event handler for keyboard input - for debugging and testing. + * + * Reimplemented from QWidget. + **/ + virtual void keyPressEvent( QKeyEvent * ev ); + + + // Data members + + bool _showChangesDialog; + YQPkgConflictDialog * _pkgConflictDialog; + YQPkgDiskUsageList * _diskUsageList; + QAction * _actionResetIgnoredDependencyProblems; +}; + + + +#endif // YQPackageSelectorBase_h diff --git a/src/pkg/YQPackageSelectorHelp.cc b/src/pkg/YQPackageSelectorHelp.cc new file mode 100644 index 0000000..6e1d93d --- /dev/null +++ b/src/pkg/YQPackageSelectorHelp.cc @@ -0,0 +1,374 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPackageSelectorHelp.cc + See also: YQPackageSelector.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include + +#define y2log_component "qt-pkg" +#include + +#include "YQPackageSelector.h" +#include "YQPkgTextDialog.h" + +#include "utf8.h" +#include "YQi18n.h" + + +void +YQPackageSelector::help() +{ + // Translators: Headline for help about the package manager in general + + QString html = YQPkgTextDialog::htmlHeading( _( "The YaST2 Package Manager" ) ); + + // Translators: Automatic word-wrapping. + html += para( _( "Note: This is a just a short overview." + " Refer to the manual for details." ) ); + + if ( onlineUpdateMode() ) + { + // Help specific to online update mode + + html += para( _( "In this dialog, select patches to download and install." ) ); + html += para( _( "The list on the left side contains available patches" + " along with the respective patch kind (security, recommended, or optional)" + " and the (estimated) download size." ) ); + html += para( _( "This list normally contains only those patches that are not installed on your system yet." + " You can change that with the Include Installed Patches check box below the list." ) ); + html += para( _( "The Patch Description field contains a longer explanation of the currently" + " selected patch. Click a patch in the list to view its description here." ) ); + html += para( _( "The package list on the right side shows the contents of the currently selected patch, i.e.," + " the packages it contains. You cannot install or delete individual packages from a patch," + " only the patch as a whole. This is intentional to avoid system inconsistencies." ) ); + + // Translators: Please keep the reference to "filter views" to distinguish between "filter views" that + // affect the amount of visible packages in the package list and "details views" ( below the package list ) + // that show details about the ( one ) currently selected package in the package list. + + html += para( _( "In addition to Patches, you can also select one of the other filter views" + " from Filter at the upper left:" ) ); + html += "

      "; + } + else // ! _onlineUpdateMode + { + // Help specific to normal (non-online-update) mode + + html += para( _( "In this dialog, select which packages to install, update, or delete." + " You can select individual packages or entire package \"selections\"." ) ); + html += para( _( "Click the status icon for a package or selection to change the status" + " or right-click it to open a context menu." ) ); + html += para( _( "Use the Check Dependencies button to resolve package dependencies." + " Some packages require other packages to be installed." + " Some packages can only be installed if certain other packages are not installed, too." + " This check will automatically mark required packages for installation" + " and it will warn you if there are dependency conflicts." ) ); + html += para( _( "When you leave this dialog with Accept, this check will automatically be performed." ) ); + + // Translators: Please keep the reference to "filter views" to distinguish between "filter views" that + // affect the amount of visible packages in the package list and "details views" (below the package list) + // that show details about the (one) currently selected package in the package list. + + html += para( _( "Select one of the available filter views with the Filter combo-box" + " at the upper left:" ) ); + html += "
        "; + + html += listItem( para( _( "Selections shows some predefined sets of packages that logically belong together." ) ) + + para( _( "Use the check box next to the selection to select it as a whole." + " You can also select or deselect individual packages in the package list at the right." ) ) ); + + } + + // Help common to all modes: Description of the various filter views + + + html += listItem( para( _( "Package Groups shows packages by category. You can expand and collapse tree items" + " to refine or generalize categories. Click any category to display the packages" + " in that category in the package list on the right side." ) ) + + para( _( " Hint: There is a \"zzz All\" entry at the very end of the list that will show" + " all packages. This may take a few seconds on slow machines." ) ) ); + + html += listItem( para( _( "Search allows you to search for packages that meet various criteria." + " This is usually the easiest way to find a package if you know its name." ) )+ + para( _( "Hint: You can also use this to find out what package contains a certain library. " + " Search in the Provides RPM field." ) ) ); + + html += listItem( para( _( "Installation Summary by default shows the changes to your system -- what packages" + " will be installed, deleted, or updated." ) ) + + para( _( "It is generally a good idea to use Check Dependencies then switch to" + " Installation Summary before clicking Accept. This way you can see" + " all changes that will be made to your system." ) ) + + para( _( "You can also explicitly select what packages with what status to see here;" + " use the check boxes at the left side." ) ) + + para( _( "Hint: You can also reverse the effect of this filter." + " You can see what packages remain the same on your system. Simply check Keep" + " and uncheck everything else." ) ) ); + + html += "
      "; + + YQPkgTextDialog::showText( this, html ); +} + + +void +YQPackageSelector::symbolHelp() +{ + // Make sure all images used here are specified in + // helpimages_DATA in include/Makefile.am ! + + // Translators: Headline for help about package status icons + QString html = YQPkgTextDialog::htmlHeading( _( "Symbols Overview" ) ); + + html += "
      "; + html += ""; + + html += symHelp( "noinst.xpm", + // Translators: Package status short ( ! ) description + _( "Do not install" ), + // Translators: Automatic word-wrapping. + _( "This package is not installed and it will not be installed." ) ); + + html += symHelp( "install.xpm", + // Translators: Package status short ( ! ) description + _( "Install" ), + // Translators: Automatic word-wrapping. + _( "This package will be installed. It is not installed yet." ) ); + + html += symHelp( "keepinstalled.xpm", + // Translators: Package status short ( ! ) description + _( "Keep" ), + // Translators: Automatic word-wrapping. + _( "This package is already installed. Leave it untouched." ) ); + + html += symHelp( "update.xpm", + // Translators: Package status short ( ! ) description + _( "Update" ), + // Translators: Automatic word-wrapping. + _( "This package is already installed. Update it or reinstall it" + " (if the versions are the same)." ) ); + + html += symHelp( "del.xpm", + // Translators: Package status short ( ! ) description + _( "Delete" ), + // Translators: Automatic word-wrapping. + _( "This package is already installed. Delete it." ) ); + + html += symHelp( "taboo.xpm", + // Translators: Package status short ( ! ) description + _( "Taboo" ), + // Translators: Automatic word-wrapping. + _( "This package is not installed and should not be installed under any circumstances, " + " especially not because of unresolved dependencies that other packages" + " might have or get." ) + + " " + + _( "Packages set to \"taboo\" are treated as if they did not exist on any installation media." ) ); + + html += symHelp( "protected.xpm", + // Translators: Package status short ( ! ) description + _( "Protected" ), + // Translators: Automatic word-wrapping. + _( "This package is installed and should not be modified, " + " especially not because of unresolved dependencies that other packages" + " might have or get." ) + + " " + + _( "Use this status for third-party packages that should not be overwritten by newer versions" + " that may come with the distribution." ) ); + + html += symHelp( "autoinstall.xpm", + // Translators: Package status short ( ! ) description + _( "Autoinstall" ), + // Translators: Automatic word-wrapping. + _( "This package will be installed automatically because some other package needs it." ) + + " " + + _( "Hint: You may have to use \"taboo\" to get rid of such a package." ) ); + + html += symHelp( "autoupdate.xpm", + // Translators: Package status short ( ! ) description + _( "Autoupdate" ), + // Translators: Automatic word-wrapping. + _( "This package is already installed, but some other package" + " needs a newer version, so it will automatically be updated." ) ); + + html += symHelp( "autodel.xpm", + // Translators: Package status short ( ! ) description + _( "Autodelete" ), + // Translators: Automatic word-wrapping. + _( "This package is already installed, but package dependencies require that it is deleted." ) + + _( "This can happen, for example, if some other package obsoletes this one." ) ); + + // Translators: This is added to the explanation of a status. Use of + // "non-breakable space" ( HTML   ) is recommended ( if the line doesn't + // get too long ) to avoid line-break in the middle of this explanaton. + QString bySelection = " " + _( "(by selection)" ); + + html += symHelp( "sel_autoinstall.xpm", + // Translators: Package status short ( ! ) description + _( "Autoinstall" ) + bySelection, + // Translators: Automatic word-wrapping. + _( "This package will be installed automatically because it is contained in a" + " predefined software selection (e.g., \"Multimedia\", \"Development\")." ) ); + + html += symHelp( "sel_autoupdate.xpm", + // Translators: Package status short ( ! ) description + _( "Autoupdate" ) + bySelection, + // Translators: Automatic word-wrapping. + _( "This package is already installed, but there is a newer version." + " It is contained in a predefined software selection (e.g., \"Multimedia\"," + " \"Development\") that you requested to update, so this package will" + " automatically be updated." ) ); + + html += symHelp( "sel_autodel.xpm", + // Translators: Package status short ( ! ) description + _( "Autodelete" ) + bySelection, + // Translators: Automatic word-wrapping. + _( "This package is already installed, but some predefined software selection" + " (e.g., \"Multimedia\", \"Development\") requires that it is deleted." ) ); + + html += "/
      "; + + YQPkgTextDialog::showText( this, html ); +} + + +QString +YQPackageSelector::symHelp( const QString & imgFileName, + const QString & summary, + const QString & explanation ) +{ + QString imgPath = HELPIMAGEDIR; + QString html = ""; + html += "" + + "" + + "" + + ""; + + return html; +} + + +void +YQPackageSelector::keyboardHelp() +{ + // Translators: Headline for help about "magic keys" in the package manager + QString html = YQPkgTextDialog::htmlHeading( _( "Special Keys Overview" ) ); + + // Translators: Additional hint that will be added to any of the following keyboard actions. + // Automatic word wrapping. + QString goto_next = "
      " + _( "In any case, go to the next list item." ); + + html += "
      "; + html += "
      " + summary + "" + explanation + "
      "; + + html += keyHelp( "+", + // Translators: Keyboard action short ( ! ) description + _( "Add" ), + // Translators: Automatic word-wrapping. + _( "Get this package. Install it if it is not installed yet." + " Update it to the latest version if it is installed " + " and there is a newer version." ) + + goto_next ); + + html += keyHelp( "-", + // Translators: Keyboard action short ( ! ) description + _( "Remove" ), + // Translators: Automatic word-wrapping. + _( "Get rid of this package. Mark it as \"do not install\" " + "if it is not installed yet. Delete it if it is installed." ) + + goto_next ); + + html += keyHelp( ">", + // Translators: Keyboard action short ( ! ) description + _( "Update" ), + // Translators: Automatic word-wrapping. + _( "Update this package if it is installed and there is a newer version." + " Ignore packages that are not installed." ) + + goto_next ); + + + html += keyHelp( "<", + // Translators: Keyboard action short ( ! ) description + _( "Undo Update" ), + // Translators: Automatic word-wrapping. + _( "Undo the effect of \">\" above: Set package to \"keep\"" + " if it is currently set to \"update\". Ignore all other packages." ) + + goto_next ); + + html += keyHelp( "!", + // Translators: Keyboard action short ( ! ) description + _( "Taboo" ), + // Translators: Automatic word-wrapping. + _( "Set this package to \"taboo\" if it is not installed:" + " make sure this package does not get installed, especially not" + " because of unresolved dependencies that other packages might have or get. " ) + + " " + + _( "Packages set to \"taboo\" are treated as if they did not exist on any installation media." ) + + "
      " + + goto_next ); + + html += keyHelp( "*", + // Translators: Keyboard action short ( ! ) description + _( "Protect" ), + // Translators: Automatic word-wrapping. + _( "Set this package to \"protected\" if it is installed:" + " make sure this package will not be modified, especially not" + " because of unresolved dependencies that other packages might have or get. " ) + + " " + + _( "Use this for third-party packages that should not be overwritten by newer versions" + " that may come with the distribution." ) + + "
      " + + goto_next ); + + html += "/
      "; + + YQPkgTextDialog::showText( this, html ); +} + + +QString +YQPackageSelector::keyHelp( const QString & key, + const QString & summary, + const QString & explanation ) +{ + QString html = ""; + html += + "" + + "" + + "" + + ""; + + return html; +} + + +QString +YQPackageSelector::para( const QString & text ) +{ + return "

      " + text + "

      "; +} + + +QString +YQPackageSelector::listItem( const QString & text ) +{ + return "
    • " + text + "
    • "; +} + + diff --git a/src/pkg/YQPatternSelector.cc b/src/pkg/YQPatternSelector.cc new file mode 100644 index 0000000..caf79c0 --- /dev/null +++ b/src/pkg/YQPatternSelector.cc @@ -0,0 +1,361 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPatternSelector.cc + See also: YQPatternSelectorHelp.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include +#include +#include +#include +#include + +#define y2log_component "qt-pkg" +#include + +#include "QY2LayoutUtils.h" + +#include "YQPatternSelector.h" +#include "YQPkgConflictDialog.h" +#include "YQPkgSelDescriptionView.h" +#include "YQPkgDiskUsageList.h" +#include "YQPkgPatternList.h" +#include "YQPkgSelList.h" +#include "YQWizard.h" +#include "YQDialog.h" + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQi18n.h" + +#define ALWAYS_SOLVE_IMMEDIATELY 1 + +using std::max; +using std::string; + +#define SPACING 6 +#define MARGIN 6 + + +YQPatternSelector::YQPatternSelector( YWidget * parent, long modeFlags ) + : YQPackageSelectorBase( parent, modeFlags ) +{ + _patternList = 0; + _selList = 0; + _descriptionView = 0; + _wizard = findWizard(); + + basicLayout(); + makeConnections(); + + if ( _patternList ) + { + _patternList->fillList(); + _patternList->selectSomething(); + } + else if ( _selList ) + { + _selList->fillList(); + _selList->selectSomething(); + } + + if ( zyppPool().empty() && + zyppPool().empty() ) + { + y2warning( "Neither patterns nor selections in ZyppPool" ); + } + + + if ( _diskUsageList ) + _diskUsageList->updateDiskUsage(); +} + + + +YQWizard * +YQPatternSelector::findWizard() const +{ + YQWizard * wizard = 0; + + YQDialog * dialog = dynamic_cast ( YDialog::currentDialog() ); + + if ( dialog ) + wizard = dialog->findWizard(); + + return wizard; +} + + + +void +YQPatternSelector::basicLayout() +{ + QSplitter * outer_splitter = new QSplitter( QSplitter::Horizontal, this ); + CHECK_PTR( outer_splitter ); + + QWidget * left_pane = layoutLeftPane ( outer_splitter ); + QWidget * right_pane = layoutRightPane( outer_splitter ); + + int left_pane_width = (int) ( 0.3 * YQUI::ui()->defaultSize( YD_HORIZ ) ); + left_pane->resize( QSize( left_pane_width, left_pane->height() ) ); + + outer_splitter->setResizeMode( left_pane, QSplitter::KeepSize ); + outer_splitter->setResizeMode( right_pane, QSplitter::Stretch ); + + if ( ! _wizard ) + layoutButtons( this ); +} + + + +QWidget * +YQPatternSelector::layoutLeftPane( QWidget * parent ) +{ + QVBox * vbox = new QVBox( parent ); + CHECK_PTR( vbox ); + vbox->setMargin( MARGIN ); + + if ( ! zyppPool().empty() ) + { + // + // Patterns list + // + + _patternList = new YQPkgPatternList( vbox, + false, // no autoFill - need to connect to details view first + false ); // no autoFilter - filterMatch() is not connected + CHECK_PTR( _patternList ); + _patternList->header()->hide(); + } + + if ( ! _patternList ) + { + // + // Fallback: selections list + // + + /** + * Create a selections list even if there are no selections, otherwise + * the layout will look very weird. An empty selections list still + * looks better than a lot of grey empty space. + **/ + + y2warning( "No patterns in ZyppPool - using selections instead" ); + _selList = new YQPkgSelList( vbox, + false, // no autoFill - need to connect to details view first + false ); // no autoFilter - filterMatch() is not connected + CHECK_PTR( _selList ); + _selList->header()->hide(); + } + + if ( _wizard ) // No button box - add "Details..." button here + { + // + // "Details" button + // + + addVSpacing( vbox, SPACING ); + + QHBox * hbox = new QHBox( vbox ); + CHECK_PTR( hbox ); + + QPushButton * details_button = new QPushButton( _( "&Details..." ), hbox ); + CHECK_PTR( details_button ); + + connect( details_button, SIGNAL( clicked() ), + this, SLOT ( detailedPackageSelection() ) ); + + addHStretch( hbox ); + } + + return vbox; +} + + + +QWidget * +YQPatternSelector::layoutRightPane( QWidget * parent ) +{ + QSplitter * splitter = new QSplitter( QSplitter::Vertical, parent ); + CHECK_PTR( splitter ); + splitter->setMargin( MARGIN ); + + + // + // Selection / Pattern description + // + + QVBox * upper_vbox = new QVBox( splitter ); + CHECK_PTR( upper_vbox ); + + _descriptionView = new YQPkgSelDescriptionView( upper_vbox ); + CHECK_PTR( _descriptionView ); + + addVSpacing( upper_vbox, MARGIN ); + + + // + // Disk usage + // + + QVBox * lower_vbox = new QVBox( splitter ); + CHECK_PTR( lower_vbox ); + addVSpacing( lower_vbox, MARGIN ); + + _diskUsageList = new YQPkgDiskUsageList( lower_vbox ); + CHECK_PTR( _diskUsageList ); + + splitter->setResizeMode( upper_vbox, QSplitter::Stretch ); + splitter->setResizeMode( lower_vbox, QSplitter::FollowSizeHint ); + + return splitter; +} + + + +void +YQPatternSelector::layoutButtons( QWidget * parent ) +{ + QHBox * button_box = new QHBox( parent ); + CHECK_PTR( button_box ); + button_box->setMargin ( MARGIN ); + button_box->setSpacing( SPACING ); + + + QPushButton * details_button = new QPushButton( _( "&Details..." ), button_box ); + CHECK_PTR( details_button ); + details_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( details_button, SIGNAL( clicked() ), + this, SLOT ( detailedPackageSelection() ) ); + + + addHStretch( button_box ); + + QPushButton * cancel_button = new QPushButton( _( "&Cancel" ), button_box ); + CHECK_PTR( cancel_button ); + cancel_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( cancel_button, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + + QPushButton * accept_button = new QPushButton( _( "&Accept" ), button_box ); + CHECK_PTR( accept_button ); + accept_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( accept_button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + button_box->setFixedHeight( button_box->sizeHint().height() ); +} + + + +void +YQPatternSelector::makeConnections() +{ + if ( _patternList ) + { +#if ALWAYS_SOLVE_IMMEDIATELY + connect( _patternList, SIGNAL( statusChanged() ), + this, SLOT ( resolveDependencies() ) ); + + if ( _pkgConflictDialog ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _patternList, SLOT ( updateItemStates() ) ); + } +#endif + + if ( _descriptionView ) + { + connect( _patternList, SIGNAL( selectionChanged( ZyppSel ) ), + _descriptionView, SLOT ( showDetails ( ZyppSel ) ) ); + } + + if ( _diskUsageList ) + { + connect( _patternList, SIGNAL( updatePackages() ), + _diskUsageList, SLOT ( updateDiskUsage() ) ); + } + + } + + if ( _selList ) + { +#if ALWAYS_SOLVE_IMMEDIATELY + connect( _selList, SIGNAL( statusChanged() ), + this, SLOT ( resolveDependencies() ) ); + + if ( _pkgConflictDialog ) + { + connect( _pkgConflictDialog, SIGNAL( updatePackages() ), + _selList, SLOT ( updateItemStates() ) ); + } + +#endif + + if ( _descriptionView ) + { + connect( _selList, SIGNAL( selectionChanged( ZyppSel ) ), + _descriptionView, SLOT ( showDetails ( ZyppSel ) ) ); + } + + if ( _diskUsageList ) + { + connect( _selList, SIGNAL( updatePackages() ), + _diskUsageList, SLOT ( updateDiskUsage() ) ); + } + } + + y2milestone( "Connection set up" ); + + + if ( _wizard ) + { + connect( _wizard, SIGNAL( nextClicked() ), + this, SLOT ( accept() ) ); + + connect( _wizard, SIGNAL( backClicked() ), + this, SLOT ( reject() ) ); + + connect( _wizard, SIGNAL( abortClicked() ), + this, SLOT ( reject() ) ); + } +} + + +void +YQPatternSelector::detailedPackageSelection() +{ + y2milestone( "\"Details..\" button clicked" ); + YQUI::ui()->sendEvent( new YMenuEvent( YCPSymbol( "details" ) ) ); +} + + +void +YQPatternSelector::debugTrace() +{ + y2warning( "debugTrace" ); +} + + + +#include "YQPatternSelector.moc" diff --git a/src/pkg/YQPatternSelector.h b/src/pkg/YQPatternSelector.h new file mode 100644 index 0000000..b91bea2 --- /dev/null +++ b/src/pkg/YQPatternSelector.h @@ -0,0 +1,94 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPatternSelector.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPatternSelector_h +#define YQPatternSelector_h + +#include +#include +#include + +#include "YQPackageSelectorBase.h" + + +class QPushButton; + +class YQPkgSelDescriptionView; +class YQPkgSelList; +class YQPkgPatternList; +class YQWizard; + + +class YQPatternSelector: public YQPackageSelectorBase +{ + Q_OBJECT + +public: + + YQPatternSelector( YWidget * parent, long modeFlags ); + + +protected slots: + + /** + * User clicked on "Details..." - start the detailed package selection. + * This will return from UI::RunPkgSelection() with `details . + **/ + void detailedPackageSelection(); + + /** + * Debugging + **/ + void debugTrace(); + + +protected: + + // Layout methods - create and layout widgets + + void basicLayout(); + QWidget * layoutLeftPane ( QWidget * parent ); + QWidget * layoutRightPane ( QWidget * parent ); + void layoutButtons ( QWidget * parent ); + + /** + * Find the wizard in the current dialog, if there is any. + * Returns 0 if there is none. + **/ + YQWizard * findWizard() const; + + /** + * Establish Qt signal / slot connections. + **/ + void makeConnections(); + + + // Data members + + + + YQPkgSelList * _selList; + YQPkgPatternList * _patternList; + YQPkgSelDescriptionView * _descriptionView; + YQWizard * _wizard; +}; + + + +#endif // YQPatternSelector_h diff --git a/src/pkg/YQPkgChangeLogView.cc b/src/pkg/YQPkgChangeLogView.cc new file mode 100644 index 0000000..b5c44a9 --- /dev/null +++ b/src/pkg/YQPkgChangeLogView.cc @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgChangeLogView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define y2log_component "qt-pkg" +#include + +#include +#include "YQPkgChangeLogView.h" +#include "YQPkgDescriptionDialog.h" +#include "YQi18n.h" +#include "utf8.h" + + + +YQPkgChangeLogView::YQPkgChangeLogView( QWidget * parent ) + : YQPkgGenericDetailsView( parent ) +{ +} + + +YQPkgChangeLogView::~YQPkgChangeLogView() +{ + // NOP +} + + +void +YQPkgChangeLogView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( ! selectable ) + { + clear(); + return; + } + + QString html = htmlHeading( selectable, + true ); // showVersion + + ZyppPkg installed = tryCastToZyppPkg( selectable->installedObj() ); + + if ( installed ) + { + html += changeLogTable( installed->changelog() ); + } + else + { + html += "

      " + _( "Information only available for installed packages." ) + "

      "; + } + + setTextFormat( Qt::RichText ); + setText( html ); +} + + + +QString YQPkgChangeLogView::changeLogTable( const zypp::Changelog & changeLog ) const +{ + QString html; + + for ( zypp::Changelog::const_iterator it = changeLog.begin(); + it != changeLog.end(); + ++it ) + { + QString changes = htmlEscape( fromUTF8( (*it).text() ) ); + changes.replace( "\n", "
      " ); + changes.replace( " ", " " ); + + html += row( + cell( (*it).date() ) + + cell( (*it).author() ) + + "
      " // cell() calls htmlEscape() ! + ); + } + + return html.isEmpty() ? "" : table( html ); +} + + +#include "YQPkgChangeLogView.moc" diff --git a/src/pkg/YQPkgChangeLogView.h b/src/pkg/YQPkgChangeLogView.h new file mode 100644 index 0000000..dad3517 --- /dev/null +++ b/src/pkg/YQPkgChangeLogView.h @@ -0,0 +1,66 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgChangeLogView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgChangeLogView_h +#define YQPkgChangeLogView_h + +#include +#include "YQPkgGenericDetailsView.h" + + +using std::list; +using std::string; + + +/** + * @short Display a pkg's file list + **/ +class YQPkgChangeLogView : public YQPkgGenericDetailsView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgChangeLogView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgChangeLogView(); + + /** + * Show details for the specified package: + * In this case the package description. + * Overwritten from YQPkgGenericDetailsView. + **/ + virtual void showDetails( ZyppSel selectable ); + +protected: + + /** + * Format a change log list in HTML + **/ + QString changeLogTable( const zypp::Changelog & changeLog ) const; +}; + + +#endif // ifndef YQPkgChangeLogView_h diff --git a/src/pkg/YQPkgChangesDialog.cc b/src/pkg/YQPkgChangesDialog.cc new file mode 100644 index 0000000..6f55ea2 --- /dev/null +++ b/src/pkg/YQPkgChangesDialog.cc @@ -0,0 +1,246 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgChangesDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include +#include +#include +#include +#include + +#include "YQZypp.h" +#include +#include + +#include "YQPkgChangesDialog.h" +#include "YQPkgList.h" +#include "QY2LayoutUtils.h" +#include "YQi18n.h" +#include "YQUI.h" + +using std::set; +using std::string; + + +#define SPACING 2 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgChangesDialog::YQPkgChangesDialog( QWidget * parent, + const QString & message, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ) + : QDialog( parent ) +{ + // Dialog title + setCaption( _( "Changed Packages" ) ); + + // Enable dialog resizing even without window manager + setSizeGripEnabled( true ); + + // Limit dialog size to available screen size + setMaximumSize( qApp->desktop()->availableGeometry().size() ); + + // Layout for the dialog ( can't simply insert a QVBox ) + + QVBoxLayout * layout = new QVBoxLayout( this, MARGIN, SPACING ); + CHECK_PTR( layout ); + + + // HBox for icon and message + + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + layout->addWidget( hbox ); + + + // Icon + + addHSpacing( hbox ); + QLabel * iconLabel = new QLabel( hbox ); + CHECK_PTR( iconLabel ); + iconLabel->setPixmap( QApplication::style().stylePixmap( QStyle::SP_MessageBoxInformation ) ); + iconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) ); // hor/vert + addHSpacing( hbox ); + + // Label for the message + + QLabel * label = new QLabel( message, hbox ); + CHECK_PTR( label ); + label->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); // hor/vert + + + // Pkg list + + _pkgList = new YQPkgList( this ); + CHECK_PTR( _pkgList ); + _pkgList->setEditable( false ); + + layout->addWidget( _pkgList ); + + + // Button box + + hbox = new QHBox( this ); + CHECK_PTR( hbox ); + hbox->setSpacing( SPACING ); + hbox->setMargin ( MARGIN ); + layout->addWidget( hbox ); + + addHStretch( hbox ); + + + // Accept button - usually "OK" or "Continue" + + QPushButton * button = new QPushButton( acceptButtonLabel, hbox ); + CHECK_PTR( button ); + button->setDefault( true ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + addHStretch( hbox ); + + + if ( ! rejectButtonLabel.isEmpty() ) + { + // Reject button ( if desired ) - usually "Cancel" + + button = new QPushButton( rejectButtonLabel, hbox ); + CHECK_PTR( button ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + addHStretch( hbox ); + } +} + + +void +YQPkgChangesDialog::filter( bool byAuto, bool byApp, bool byUser ) +{ + filter( QRegExp( "" ), byAuto, byApp, byUser ); +} + + +void +YQPkgChangesDialog::filter( const QRegExp & regexp, bool byAuto, bool byApp, bool byUser ) +{ + YQUI::ui()->busyCursor(); + _pkgList->clear(); + + set ignoredNames; + + if ( ! byUser || ! byApp ) + ignoredNames = zypp::ui::userWantedPackageNames(); + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppSel selectable = *it; + + if ( selectable->toModify() ) + { + zypp::ResStatus::TransactByValue modifiedBy = selectable->modifiedBy(); + + if ( ( modifiedBy == zypp::ResStatus::SOLVER ) && byAuto || + ( modifiedBy == zypp::ResStatus::APPL_LOW || + modifiedBy == zypp::ResStatus::APPL_HIGH ) && byApp || + ( modifiedBy == zypp::ResStatus::USER ) && byUser ) + { + if ( regexp.isEmpty() || regexp.search( selectable->name().c_str() ) >= 0 ) + { + if ( ! contains( ignoredNames, selectable->name() ) ) + _pkgList->addPkgItem( selectable, tryCastToZyppPkg( selectable->theObj() ) ); + } + } + } + } + + YQUI::ui()->normalCursor(); +} + + +bool +YQPkgChangesDialog::isEmpty() const +{ + return _pkgList->firstChild() == 0; +} + + +QSize +YQPkgChangesDialog::sizeHint() const +{ + return limitToScreenSize( this, QDialog::sizeHint() ); +} + + +bool +YQPkgChangesDialog::showChangesDialog( const QString & message, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel, + bool showIfListEmpty ) +{ + YQPkgChangesDialog dialog( 0, + message, + acceptButtonLabel, + rejectButtonLabel ); + dialog.filter(); + + if ( dialog.isEmpty() && ! showIfListEmpty ) + return true; + + dialog.exec(); + + return dialog.result() == QDialog::Accepted; +} + + +bool +YQPkgChangesDialog::showChangesDialog( const QString & message, + const QRegExp & regexp, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel, + bool showIfListEmpty ) +{ + YQPkgChangesDialog dialog( 0, + message, + acceptButtonLabel, + rejectButtonLabel ); + dialog.filter( regexp, true, true, true ); + + if ( dialog.isEmpty() && ! showIfListEmpty ) + return true; + + dialog.exec(); + + return dialog.result() == QDialog::Accepted; +} + + + + +#include "YQPkgChangesDialog.moc" diff --git a/src/pkg/YQPkgChangesDialog.h b/src/pkg/YQPkgChangesDialog.h new file mode 100644 index 0000000..d3a28dd --- /dev/null +++ b/src/pkg/YQPkgChangesDialog.h @@ -0,0 +1,137 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgChangesDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgChangesDialog_h +#define YQPkgChangesDialog_h + +#include +#include + + +class YQPkgList; + + +/** + * Changes dialog: Show a dialog with a list of packages that are changed. + * By default, only packages with an "auto" status ( not set via selections ) + * are displayed. + **/ +class YQPkgChangesDialog : public QDialog +{ + Q_OBJECT + +public: + + /** + * Static convenience method: Post a changes dialog with text + * 'message', a list of changed packages and one ( default ) or two buttons. + * + * Returns 'true' if the user accepted ( i.e. clicked the 'accept' button ) + * and 'false' if the user rejected ( i.e. clicked the 'reject' button or + * the window manager close button ). + * + * If the list is empty ( i.e., there are no packages with an "auto" + * status ), the dialog is not shown at all ( and returns 'true' ) - unless + *'showIfListEmpty' is 'true'. + **/ + static bool showChangesDialog( const QString & message, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel = QString::null, + bool showIfListEmpty = false ); + + + /** + * Static convenience method: Post a changes dialog with text 'message', a + * list of changed packages whose names match the specified regular + * expression 'regexp' and one ( default ) or two buttons. + * + * Returns 'true' if the user accepted ( i.e. clicked the 'accept' button ) + * and 'false' if the user rejected ( i.e. clicked the 'reject' button or + * the window manager close button ). + * + * If the list is empty ( i.e., there are no packages with an "auto" + * status ), the dialog is not shown at all ( and returns 'true' ) - unless + *'showIfListEmpty' is 'true'. + **/ + static bool showChangesDialog( const QString & message, + const QRegExp & regexp, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel = QString::null, + bool showIfListEmpty = false ); + + /** + * Returns the preferred size. + * + * Reimplemented from QWidget to limit the dialog to the screen dimensions. + **/ + virtual QSize sizeHint () const; + +protected: + + /** + * Constructor: Creates a changes dialog with text 'message' on + * top, a list packages with an "auto" status that is not set via selections + * and one ( default ) or two buttons. + * + * Not meant for public use. Applications should use the static + * 'showChangesDialog' method instead. + * + * This constructor does not call filter() yet - this is the caller's + * responsibility. + **/ + YQPkgChangesDialog( QWidget * parent, + const QString & message, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel = QString::null ); + + /** + * Apply the filter criteria: Fill the pkg list with pkgs that have a + * "modify" status ( install, update, delete ) set by automatic ( i.e. via the + * dependency solver ), by application ( i.e. via software selections ) or + * manually by the user. + **/ + void filter( bool byAuto = true, + bool byApp = false, + bool byUser = false ); + + /** + * Apply the filter criteria: Fill the pkg list with pkgs that have a + * "modify" status ( install, update, delete ) set by automatic ( i.e. via the + * dependency solver ), by application ( i.e. via software selections ) or + * manually by the user and whose name matches 'regexp'. + **/ + void filter( const QRegExp & regexp, + bool byAuto = true, + bool byApp = false, + bool byUser = false ); + + /** + * Returns 'true' if the pkg list is empty. + * This is only meaningful after calling 'filter()' ! + **/ + bool isEmpty() const; + + + // Data members + + YQPkgList * _pkgList; +}; + + +#endif // ifndef YQPkgChangesDialog_h diff --git a/src/pkg/YQPkgConflictDialog.cc b/src/pkg/YQPkgConflictDialog.cc new file mode 100644 index 0000000..d3280f9 --- /dev/null +++ b/src/pkg/YQPkgConflictDialog.cc @@ -0,0 +1,413 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgConflictDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "YQPkgConflictDialog.h" +#include "YQPkgConflictList.h" +#include "YQDialog.h" + +#include "QY2LayoutUtils.h" +#include "YQUI.h" +#include "YQi18n.h" +#include "utf8.h" + + +#define SPACING 6 // between subwidgets +#define MARGIN 4 // around the widget + + +// The busy dialog ("Checking Dependencies") will only be shown if solving +// (on average) takes longer than this many seconds. The first one will be +// shown in any case. + +#define SUPPRESS_BUSY_DIALOG_SECONDS 1.5 + + +YQPkgConflictDialog::YQPkgConflictDialog( QWidget * parent ) + : QDialog( parent ) +{ + _solveCount = 0; + _totalSolveTime = 0.0; + + + // Set the dialog title. + // + // "Dependency conflict" is already used as the conflict list header just + // some pixels below that, so don't use this twice. This dialog title may + // or may not be visible, depending on whether or not there is a window + // manager running (and configured to show any dialog titles). + + setCaption( _( "Warning" ) ); + + // Enable dialog resizing even without window manager + setSizeGripEnabled( true ); + + + // Layout for the dialog (can't simply insert a QVbox) + + QVBoxLayout * layout = new QVBoxLayout( this, MARGIN, SPACING ); + CHECK_PTR( layout ); + + // Conflict list + + _conflictList = new YQPkgConflictList( this ); + CHECK_PTR( _conflictList ); + layout->addWidget( _conflictList ); + layout->addSpacing(8); + + connect( _conflictList, SIGNAL( updatePackages() ), + this, SIGNAL( updatePackages() ) ); + + + // Button box + + QHBox * buttonBox = new QHBox( this ); + CHECK_PTR( buttonBox ); + buttonBox->setSpacing( SPACING ); + buttonBox->setMargin ( MARGIN ); + layout->addWidget( buttonBox ); + + + // "OK" button + + QPushButton * button = new QPushButton( _( "&OK -- Try Again" ), buttonBox ); + CHECK_PTR( button ); + button->setDefault( true ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( solveAndShowConflicts() ) ); + + addHStretch( buttonBox ); + + + // "Expert" menu button + + button = new QPushButton( _( "&Expert" ), buttonBox ); + CHECK_PTR( button ); + + addHStretch( buttonBox ); + + + // "Expert" menu + + _expertMenu = new QPopupMenu( button ); + CHECK_PTR( _expertMenu ); + button->setPopup( _expertMenu ); + + _expertMenu->insertItem( _( "&Save This List to a File..." ), + _conflictList, SLOT( askSaveToFile() ) ); + + + // "Cancel" button + + button = new QPushButton( _( "&Cancel" ), buttonBox ); + CHECK_PTR( button ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + + // Busy popup + + _busyPopup = new QLabel( " " + _( "Checking Dependencies..." ) + " ", parent, 0, + WStyle_Customize | WStyle_DialogBorder | WStyle_Dialog ); + + CHECK_PTR( _busyPopup ); + _busyPopup->setCaption( "" ); + _busyPopup->resize( _busyPopup->sizeHint() ); + YQDialog::center( _busyPopup, parent ); + + + // Here comes a real nasty hack. + // + // The busy popup is needed to indicate that the application is (you + // guessed right) busy. But as long as it is busy, it doesn't process X + // events, either, and I didn't manage to convince Qt to please paint this + // popup before the solver's calculations (which take quite a while) start + // - all combinations of show(), repaint(), XSync(), XFlush(), + // processEvents() etc. failed. + // + // So, let's do it the hard way: Give this popup a background pixmap into + // which we render the text to display. The X server draws background + // pixmaps immediately, so we don't have to wait until the X server, the + // window manager and this application are finished negotiating all their + // various events. + + // Create a pixmap. Make it large enough so it isn't replicated (i.e. the + // text is displayed several times) if some window manager chooses not to + // honor the size hints (KDM for example uses double the height we + // request). + + QSize size = _busyPopup->sizeHint(); + QPixmap pixmap( 3 * size.width(), 3 * size.height() ); + + // Clear the pixmap with the widget's normal background color. + pixmap.fill( _busyPopup->paletteBackgroundColor() ); + + // Render the text - aligned top and left because otherwise it will of + // course be centered inside the pixmap which is usually much larger than + // the popup, thus the text would be cut off. + QPainter painter( &pixmap ); + painter.drawText( pixmap.rect(), AlignLeft | AlignTop, _busyPopup->text() ); + painter.end(); + + _busyPopup->setPaletteBackgroundPixmap( pixmap ); + + // If the application manages to render the true contents of the label we + // just misused so badly, the real label will interfere with the background + // pixmap with (maybe) a few pixels offset (bug #25647). Fast or + // multiprocessor machines tend to have this problem. + // So let's get rid of the label text and solely rely on the background + // pixmap. + _busyPopup->setText( "" ); + + // Make sure the newly emptied text doesn't cause the busy dialog to be + // resized to nil (or a window manager dependent minimum size). + _busyPopup->setFixedSize( _busyPopup->size() ); +} + + +YQPkgConflictDialog::~YQPkgConflictDialog() +{ + // NOP +} + + +QSize +YQPkgConflictDialog::sizeHint() const +{ + return limitToScreenSize( this, 550, 450 ); +} + + +int +YQPkgConflictDialog::solveAndShowConflicts() +{ + prepareSolving(); + + y2debug( "Solving..." ); + QTime solveTime; + solveTime.start(); + + // Solve. + + bool success = zypp::getZYpp()->resolver()->resolvePool(); + + _totalSolveTime += solveTime.elapsed() / 1000.0; + + y2debug( "Solving done in %f s - average: %f s", + solveTime.elapsed() / 1000.0, averageSolveTime() ); + + return processSolverResult( success ); +} + + +int +YQPkgConflictDialog::verifySystem() +{ + prepareSolving(); + + y2debug( "Verifying system..." ); + QTime solveTime; + solveTime.start(); + + bool success = zypp::getZYpp()->resolver()->verifySystem( true ); // considerNewHardware + + y2debug( "System verified in %f s", solveTime.elapsed() / 1000.0 ); + + return processSolverResult( success ); +} + + +void +YQPkgConflictDialog::prepareSolving() +{ + CHECK_PTR( _conflictList ); + YQUI::ui()->busyCursor(); + + if ( isVisible() ) + { + // This is not only the starting point for all the dependency solving + // magic, it is also used internally when clicking the "OK - Try again" + // button. Thus, before doing anything else, check if the conflict list + // still contains anything, and if so, apply any conflict resolutions + // the user selected - but only if this dialog is already visible. + + _conflictList->applyResolutions(); + } + + + // Initialize for next round of solving. + _conflictList->clear(); + + if ( _solveCount++ == 0 || averageSolveTime() > SUPPRESS_BUSY_DIALOG_SECONDS ) + { + YQDialog::center( _busyPopup, parentWidget() ); + _busyPopup->show(); + + // No _busyPopup->repaint() - that doesn't help anyway: Qt doesn't do + // any actual painting until the window is mapped. We just rely on the + // background pixmap we provided in the constructor. + + // Make sure show() gets processed - usually, a window manager catches + // the show() (XMap) events, positions and maybe resizes the window and + // only then sends off an event that makes the window appear. This + // event needs to be processed. + qApp->processEvents(); + } +} + + +int +YQPkgConflictDialog::processSolverResult( bool success ) +{ + if ( _busyPopup->isVisible() ) + _busyPopup->hide(); + + // Package states may have changed: The solver may have set packages to + // autoInstall or autoUpdate. Make those changes known. + emit updatePackages(); + + YQUI::ui()->normalCursor(); + int result = QDialog::Accepted; + + if ( success ) // Solving went without any complaints? + { + result = QDialog::Accepted; + + if ( isVisible() ) + accept(); // Pop down the dialog. + } + else // There were solving problems. + { + y2debug( "Dependency conflict!" ); + YQUI::ui()->busyCursor(); + + _conflictList->fill( zypp::getZYpp()->resolver()->problems() ); + YQUI::ui()->normalCursor(); + + if ( ! isVisible() ) + { + // Pop up the dialog and run a local event loop. + result = exec(); + } + } + + return result; // QDialog::Accepted or QDialog::Rejected +} + + +void +YQPkgConflictDialog::resetIgnoredDependencyProblems() +{ + zypp::getZYpp()->resolver()->undo(); +} + + +double +YQPkgConflictDialog::averageSolveTime() const +{ + if ( _solveCount < 1 ) + return 0.0; + + return _totalSolveTime / _solveCount; +} + + +void +YQPkgConflictDialog::askCreateSolverTestCase() +{ + QString testCaseDir = "/var/log/YaST2/solverTestcase"; + // Heading for popup dialog + QString heading = QString( "

      %1

      " ).arg( _( "Create Dependency Resolver Test Case" ) ); + + QString msg = + _( "

      Use this to generate extensive logs to help tracking down bugs in the dependency resolver." + "The logs will be stored in directory
      %1

      " ).arg( testCaseDir ); + + int button_no = QMessageBox::information( 0, // parent + _( "Solver Test Case" ), // caption + heading + msg, + _( "C&ontinue" ), // button #0 + _( "&Cancel" ) ); // button #1 + + if ( button_no == 1 ) // Cancel + return; + + y2milestone( "Generating solver test case START" ); + bool success = zypp::getZYpp()->resolver()->createSolverTestcase( testCaseDir.ascii() ); + y2milestone( "Generating solver test case END" ); + + if ( success ) + { + msg = + _( "

      Dependency resolver test case written to
      %1

      " + "

      Prepare y2logs.tgz tar archive to attach to Bugzilla?

      " ).arg( testCaseDir ), + button_no = QMessageBox::question( 0, // parent + _( "Success" ), // caption + msg, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape ); + + if ( button_no & QMessageBox::Yes ) // really binary (not logical) '&' - QMessageBox::Default is still in there + YQUI::ui()->askSaveLogs(); + } + else // no success + { + QMessageBox::warning( 0, // parent + _( "Error" ), // caption + _( "

      Error creating dependency resolver test case

      " + "

      Please check disk space and permissions for %1

      " ).arg( testCaseDir ), + QMessageBox::Ok | QMessageBox::Default, + QMessageBox::NoButton, + QMessageBox::NoButton ); + } +} + +void +YQPkgConflictDialog::keyPressEvent( QKeyEvent * event ) +{ + if ( event && event->key() == Qt::Key_Print ) + { + YQUI::ui()->makeScreenShot( "" ); + return; + } + QWidget::keyPressEvent( event ); +} + + + +#include "YQPkgConflictDialog.moc" diff --git a/src/pkg/YQPkgConflictDialog.h b/src/pkg/YQPkgConflictDialog.h new file mode 100644 index 0000000..df6b5b0 --- /dev/null +++ b/src/pkg/YQPkgConflictDialog.h @@ -0,0 +1,161 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgConflictDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgConflictDialog_h +#define YQPkgConflictDialog_h + +#include + +class YQPkgConflictList; +class PMManager; +class QPushButton; +class QPopupMenu; +class QLabel; + + +/** + * @short Dialog that takes care of dependency checking and resolving + * conflicts. + **/ +class YQPkgConflictDialog: public QDialog +{ + Q_OBJECT + +public: + + /** + * Constructor. Does not pop up a dialog yet. + * Use solveAndShowConflicts(). + **/ + YQPkgConflictDialog( QWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQPkgConflictDialog(); + + /** + * Reimplemented from QWidget: + * Reserve a reasonable amount of space. + **/ + virtual QSize sizeHint() const; + + /** + * Returns the average time in seconds used for solving or 0 if solving + * hasn't taken place yet. + **/ + double averageSolveTime() const; + + /** + * Returns the total amount of time in seconds used for solving. + **/ + double totalSolveTime() const { return _totalSolveTime; } + + /** + * Returns the times solving has taken place (with this dialog). + **/ + int solveCount() const { return _solveCount; } + + /** + * Reset all previously ignored dependency problems. + **/ + static void resetIgnoredDependencyProblems(); + + +public slots: + + /** + * Run the package dependency solver for the current package set and open + * the conflict dialog if there are any conflicts. + * Returns only when the conflict dialog is closed. + * + * Returns QDialog::Accepted or QDialog::Rejected. + **/ + int solveAndShowConflicts(); + + /** + * Run the package dependency solver for the currently installed system + * plus the packages that are marked for installation (or update or...) and + * open the conflict dialog if there are any conflicts. + * Returns only when the conflict dialog is closed. + * + * Returns QDialog::Accepted or QDialog::Rejected. + **/ + int verifySystem(); + + /** + * Mini-wizard to generate solver test case: + * + * - Inform user what this is all about + * - Tell user where the files will go + * - Generate test case + * - Ask user if he would like to pack it all into y2logs.tgz + * - Prompt user for path for y2logs.tgz + * - Save y2logs.tgz + **/ + void askCreateSolverTestCase(); + + +signals: + + /** + * Update package states - they may have changed. + **/ + void updatePackages(); + + +protected: + + /** + * Initialize solving: Post "busy" popup etc. + **/ + void prepareSolving(); + + /** + * Process the result of solving: Post conflict dialog, if neccessary. + * 'success' is the return value of the preceding solver call. + * Returns either QDialog::Accepted or QDialog::Rejected. + **/ + int processSolverResult( bool success ); + + /** + * Event handler for keyboard input. + * Only very special keys are processed here. + * + * Inherited from QWidget. + **/ + void keyPressEvent( QKeyEvent * e ); + + + + // + // Data members + // + + YQPkgConflictList * _conflictList; + QPopupMenu * _expertMenu; + QLabel * _busyPopup; + + double _totalSolveTime; + int _solveCount; +}; + + + +#endif // ifndef YQPkgConflictDialog_h diff --git a/src/pkg/YQPkgConflictList.cc b/src/pkg/YQPkgConflictList.cc new file mode 100644 index 0000000..d07577f --- /dev/null +++ b/src/pkg/YQPkgConflictList.cc @@ -0,0 +1,404 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgConflictList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#include +#include +#include +#include + +#include + +#define y2log_component "qt-pkg" +#include + +#include +#include "YQPkgConflictList.h" +#include "YQPkgConflictDialog.h" +#include "YQIconPool.h" + +#include "YQApplication.h" +#include "YQUI.h" +#include "YQi18n.h" +#include "utf8.h" + +using std::list; +using std::string; + + +#define LIST_SPLIT_THRESHOLD 8 + +#define RED QColor( 0xC0, 0, 0 ) +#define BRIGHT_RED QColor( 0xFF, 0, 0 ) +#define BLUE QColor( 0, 0, 0xC0 ) +#define LIGHT_BLUE QColor( 0xE0, 0xE0, 0xF8 ) +#define LIGHT_GREY QColor( 0xE0, 0xE0, 0xE0 ) +#define MAGENTA Qt::magenta +#define DEEP_ORANGE QColor( 0xFF, 0x80, 0x20 ) +#define LIGHT_ORANGE QColor( 0xFF, 0xC0, 0x50 ) + + +YQPkgConflictList::YQPkgConflictList( QWidget * parent ) + : QY2ListView( parent ) +{ + addColumn( _( "Dependency Conflict" ) ); + setRootIsDecorated( true ); + setSortByInsertionSequence( true ); +} + + +YQPkgConflictList::~YQPkgConflictList() +{ + // NOP +} + + +void +YQPkgConflictList::fill( zypp::ResolverProblemList problemList ) +{ + clear(); + string text; + + + zypp::ResolverProblemList::iterator it = problemList.begin(); + + while ( it != problemList.end() ) + { + YQPkgConflict * conflict = new YQPkgConflict( this, *it ); + CHECK_PTR( conflict ); + + ++it; + } +} + + +void +YQPkgConflictList::applyResolutions() +{ + zypp::ProblemSolutionList userChoices; + + QListViewItem * child = firstChild(); + + while ( child ) + { + YQPkgConflict * conflict = dynamic_cast (child); + + if ( conflict ) + { + zypp::ProblemSolution_Ptr userChoice = conflict->userSelectedResolution(); + + if ( userChoice ) + userChoices.push_back( userChoice ); + } + + child = child->nextSibling(); + } + + zypp::getZYpp()->resolver()->applySolutions( userChoices ); + + emit updatePackages(); +} + + +void +YQPkgConflictList::askSaveToFile() const +{ + QString filename = YQUI::ui()->askForSaveFileName( "conflicts.txt", // startsWith + "*.txt", // filter + _( "Save Conflicts List" ) ); + if ( ! filename.isEmpty() ) + saveToFile( filename, true ); +} + + +void +YQPkgConflictList::saveToFile( const QString filename, bool interactive ) const +{ + // Open file + + FILE * file = fopen( (const char *) filename, "w" ); + + if ( ! file ) + { + y2error( "Can't open file %s", (const char *) filename ); + + if ( interactive ) + { + // Post error popup. + + QMessageBox::warning( 0, // parent + _( "Error" ), // caption + _( "Cannot open file %1" ).arg( filename ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + return; + } + + + // Write header + + QString header = "#### YaST2 conflicts list - generated "; + header += QDateTime::currentDateTime().toString( "yyyy-MM-dd hh:mm:ss" ); + header += " ####\n\n"; + + fputs( (const char *) header, file ); + + + // Recursively write all items + + const QListViewItem * item = firstChild(); + + while ( item ) + { + saveItemToFile( file, item ); + item = item->nextSibling(); + } + + + // Write footer + + fprintf( file, "\n#### YaST2 conflicts list END ###\n" ); + + + // Clean up + + if ( file ) + fclose( file ); +} + + +void +YQPkgConflictList::saveItemToFile( FILE * file, + const QListViewItem * item ) const +{ + if ( ! item || ! file ) + return; + + // Write indentation + + for ( int level = 0; level < item->depth(); level++ ) + fprintf( file, " " ); + + + // Write item + + const QCheckListItem * checkListItem = dynamic_cast (item); + + if ( checkListItem ) + { + switch ( checkListItem->type() ) + { + case QCheckListItem::CheckBox: + fprintf( file, "[%c] ", checkListItem->isOn() ? 'x' : ' ' ); + break; + case QCheckListItem::RadioButton: + fprintf( file, "(%c) ", checkListItem->isOn() ? 'x' : ' ' ); + break; + default: + break; + } + } + + fprintf( file, "%s\n", (const char *) item->text(0) ); + + + if ( item->isOpen() ) + { + // Recursively write children + + const QListViewItem * child = item->firstChild(); + + while ( child ) + { + saveItemToFile( file, child ); + child = child->nextSibling(); + } + } +} + + +void +YQPkgConflictList::dumpList( QListViewItem * parent, + const QString & longText, + const QString & header, + int splitThreshold ) +{ + if ( ! parent ) + { + y2error( "Null parent" ); + return; + } + + if ( longText.isEmpty() ) + return; + + if ( ! header.isEmpty() ) + { + parent = new QY2ListViewItem( parent, header ); + CHECK_PTR( parent ); + parent->setOpen( true ); + } + + QStringList lines = QStringList::split( '\n', longText, + true ); // allowEmptyEntries + QValueList::const_iterator it = lines.begin(); + + bool doSplit = splitThreshold > 1 && lines.size() > (unsigned) splitThreshold + 3; + bool didSplit = false; + int count = 0; + + + while ( it != lines.end() ) + { + if ( doSplit && ! didSplit && ++count > splitThreshold ) + { + // Split list + + int more = lines.size() - count + 1; + QString text = ( _( "%1 more..." ) ).arg( more ); + QY2ListViewItem * sublist = new QY2ListViewItem( parent, text ); + didSplit = true; + + if ( sublist ) + { + sublist->setBackgroundColor( LIGHT_ORANGE ); + parent = sublist; + } + } + + new QY2ListViewItem( parent, *it ); + ++it; + } +} + + + + + + + +YQPkgConflict::YQPkgConflict( YQPkgConflictList * parentList, + zypp::ResolverProblem_Ptr problem ) + : QY2ListViewItem( parentList ) + , _problem( problem ) + , _resolutionsHeader( 0 ) +{ + setBackgroundColor( LIGHT_BLUE ); + setOpen( true ); + + formatHeading(); + YQPkgConflictList::dumpList( this, fromUTF8( _problem->details() ) ); + + addSolutions(); +} + + +void +YQPkgConflict::formatHeading() +{ + QString text; + QPixmap icon = YQIconPool::normalPkgConflict(); + setTextColor( BRIGHT_RED ); + + setText( 0, fromUTF8( problem()->description() ) ); + setPixmap( 0, icon ); +} + + +void +YQPkgConflict::addSolutions() +{ + _resolutionsHeader = new QY2CheckListItem( this, + // Heading for the choices + // how to resolve this conflict + _( "Conflict Resolution:" ), + QCheckListItem::Controller ); + CHECK_PTR( _resolutionsHeader ); + _resolutionsHeader->setOpen( true ); + _resolutionsHeader->setBackgroundColor( LIGHT_GREY ); + + zypp::ProblemSolutionList solutions = problem()->solutions(); + zypp::ProblemSolutionList::iterator it = solutions.begin(); + + while ( it != solutions.end() ) + { + new YQPkgConflictResolution( _resolutionsHeader, *it ); + ++it; + } +} + + +void +YQPkgConflict::paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ) +{ + painter->setFont( YQUI::yqApp()->headingFont() ); + QY2ListViewItem::paintCell( painter, colorGroup, column, width, alignment ); +} + + +zypp::ProblemSolution_Ptr +YQPkgConflict::userSelectedResolution() +{ + QListViewItem * item = _resolutionsHeader->firstChild(); + + while ( item ) + { + YQPkgConflictResolution * res = dynamic_cast (item); + + if ( res && res->isOn() ) + { + zypp::ProblemSolution_Ptr solution = res->solution(); + + y2milestone( "User selected resolution \"%s\" for problem \"%s\"", + solution->description().c_str(), + solution->problem()->description().c_str() ); + return solution; + } + + item = item->nextSibling(); + } + + return zypp::ProblemSolution_Ptr(); // Null pointer +} + + + + + + +YQPkgConflictResolution::YQPkgConflictResolution( QY2CheckListItem * parent, + zypp::ProblemSolution_Ptr solution ) + : QY2CheckListItem( parent, + fromUTF8( solution->description() ), + QCheckListItem::RadioButton ) + , _solution( solution ) +{ + YQPkgConflictList::dumpList( this, fromUTF8( solution->details() ) ); +} + + + +#include "YQPkgConflictList.moc" diff --git a/src/pkg/YQPkgConflictList.h b/src/pkg/YQPkgConflictList.h new file mode 100644 index 0000000..735c1b8 --- /dev/null +++ b/src/pkg/YQPkgConflictList.h @@ -0,0 +1,221 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgConflictList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgConflictList_h +#define YQPkgConflictList_h + + +#include +#include +#include "QY2ListView.h" + +#include +#include +#include + + +class QAction; +class YQPkgConflict; +class YQPkgConflictResolution; +class YQPkgConflictDialog; + + +/** + * @short Display package dependency conflicts in a tree list and let the user + * choose how to resolve each conflict. + **/ +class YQPkgConflictList : public QY2ListView +{ + Q_OBJECT + +public: + /** + * Constructor. + **/ + YQPkgConflictList( QWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQPkgConflictList(); + + /** + * Fill the list with the specified problems. + **/ + void fill( zypp::ResolverProblemList problemList ); + + /** + * Check if the conflict list is empty. + **/ + bool isEmpty() const { return childCount() == 0; } + + /** + * Returns the number of conflicts in the list. + **/ + int count() const { return childCount(); } + + +public slots: + + /** + * Apply the choices the user made. + **/ + void applyResolutions(); + + /** + * Ignore all conflicts. + **/ + void ignoreAll(); + + /** + * Ask for a file name and save the current conflict list to file. + **/ + void askSaveToFile() const; + + +public: + + /** + * Save the conflict list in its current state to a file. Retains the + * current 'expanded' state, i.e. writes only those entries that are + * currently open (not collapsed) in the tree. + * + * Posts error popups if 'interactive' is 'true' (only log entries + * otherwise). + **/ + void saveToFile( const QString filename, bool interactive ) const; + + /** + * Dump a multi-line text to a QListView as a sequence of separate items. + * If 'longText' has considerably more lines than 'splitThreshold', fold + * all lines from no. 'splitThreshold' on into a closed list item + * "More...". + * If 'header' is not empty, it will be added as the parent of the lines. + **/ + static void dumpList( QListViewItem * parent, + const QString & longText, + const QString & header = QString::null, + int splitThreshold = 5 ); + +protected: + + /** + * (Recursively) save one item to file. + **/ + void saveItemToFile( FILE * file, const QListViewItem * item ) const; + + +signals: + + /** + * Update package states - they may have changed. + **/ + void updatePackages(); +}; + + + +/** + * @short Root item for each individual conflict + **/ +class YQPkgConflict: public QY2ListViewItem +{ +public: + + /** + * Constructor. + **/ + YQPkgConflict( YQPkgConflictList * parentList, + zypp::ResolverProblem_Ptr problem ); + + /** + * Destructor. + **/ + virtual ~YQPkgConflict() {} + + /** + * Returns the corresponding ResolverProblem. + **/ + zypp::ResolverProblem_Ptr problem() const { return _problem; } + + /** + * Returns the resolution the user selected + * or 0 if he didn't select one + **/ + zypp::ProblemSolution_Ptr userSelectedResolution(); + + +protected: + + /** + * Format the text heading line for this item. + **/ + void formatHeading(); + + /** + * Add suggestions how to resolve this conflict. + **/ + void addSolutions(); + + /** + * Paint method. Reimplemented from @ref QListViewItem so a different + * font can be used. + * + * Reimplemented from QY2ListViewItem. + **/ + virtual void paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + + // Data members + + zypp::ResolverProblem_Ptr _problem; + QY2CheckListItem * _resolutionsHeader; +}; + + + +class YQPkgConflictResolution: public QY2CheckListItem +{ +public: + + /** + * Constructor + **/ + YQPkgConflictResolution( QY2CheckListItem * parent, + zypp::ProblemSolution_Ptr _solution ); + + /** + * Return the corresponding ProblemSolution. + **/ + zypp::ProblemSolution_Ptr solution() const { return _solution; } + + +protected: + + // Data members + + zypp::ProblemSolution_Ptr _solution; +}; + + +#endif // ifndef YQPkgConflictList_h diff --git a/src/pkg/YQPkgDependenciesView.cc b/src/pkg/YQPkgDependenciesView.cc new file mode 100644 index 0000000..ecbc815 --- /dev/null +++ b/src/pkg/YQPkgDependenciesView.cc @@ -0,0 +1,187 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDependenciesView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define y2log_component "qt-pkg" +#include + +#include +#include "YQPkgDependenciesView.h" +#include "YQi18n.h" +#include "utf8.h" + + +YQPkgDependenciesView::YQPkgDependenciesView( QWidget * parent ) + : YQPkgGenericDetailsView( parent ) +{ +} + + +YQPkgDependenciesView::~YQPkgDependenciesView() +{ + // NOP +} + + +void +YQPkgDependenciesView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( ! selectable ) + { + clear(); + return; + } + + QString html_text = htmlHeading( selectable ); + + ZyppObj candidate = selectable->candidateObj(); + ZyppObj installed = selectable->installedObj(); + + if ( candidate && installed && candidate != installed ) + { + html_text += complexTable( installed, candidate ); + } + else + { + if ( candidate ) + html_text += simpleTable( candidate ); + + if ( installed ) + html_text += simpleTable( installed ); + } + + setTextFormat( Qt::RichText ); + setText( html_text ); +} + + +QString +YQPkgDependenciesView::simpleTable( ZyppObj pkg ) +{ + QString html = "
      " + + table( + row( hcell( _( "Version:" ) ) + cell( pkg->edition().asString() ) ) + + + // Intentionally NOT translating the RPM depencency tags: + // They make only sense to users who have some basic knowledge what they are anyway. + + row( "Provides:", pkg->dep( zypp::Dep::PROVIDES ) ) + + row( "Prerequires:", pkg->dep( zypp::Dep::PREREQUIRES ) ) + + row( "Requires:", pkg->dep( zypp::Dep::REQUIRES ) ) + + row( "Conflicts:", pkg->dep( zypp::Dep::CONFLICTS ) ) + + row( "Obsoletes:", pkg->dep( zypp::Dep::OBSOLETES ) ) + + row( "Recommends:", pkg->dep( zypp::Dep::RECOMMENDS ) ) + + row( "Suggests:", pkg->dep( zypp::Dep::SUGGESTS ) ) + + row( "Freshens:", pkg->dep( zypp::Dep::FRESHENS ) ) + + row( "Enances:", pkg->dep( zypp::Dep::ENHANCES ) ) + + row( "Supplements:", pkg->dep( zypp::Dep::SUPPLEMENTS ) ) + ); + + return html; +} + + +QString +YQPkgDependenciesView::complexTable( ZyppObj installed, ZyppObj candidate ) +{ + ZyppObj p1 = candidate; + ZyppObj p2 = installed; + + QString p1_header = _( "Alternate Version" ); + QString p2_header = _( "Installed Version" ); + + QString html = "
      " + + table( + row( hcell( QString( "" ) ) + hcell( "" + p1_header + "" ) + hcell( "" + p2_header + "" ) ) + + + row( hcell( _( "Version:" ) ) + cell( p1->edition().asString() ) + cell( p2->edition().asString() ) ) + + + row( "Provides:", p1->dep( zypp::Dep::PROVIDES ), p2->dep( zypp::Dep::PROVIDES ) ) + + row( "Prerequires:", p1->dep( zypp::Dep::PREREQUIRES ), p2->dep( zypp::Dep::PREREQUIRES ) ) + + row( "Requires:", p1->dep( zypp::Dep::REQUIRES ), p2->dep( zypp::Dep::REQUIRES ) ) + + row( "Conflicts:", p1->dep( zypp::Dep::CONFLICTS ), p2->dep( zypp::Dep::CONFLICTS ) ) + + row( "Obsoletes:", p1->dep( zypp::Dep::OBSOLETES ), p2->dep( zypp::Dep::OBSOLETES ) ) + + row( "Recommends:", p1->dep( zypp::Dep::RECOMMENDS ), p2->dep( zypp::Dep::RECOMMENDS ) ) + + row( "Suggests:", p1->dep( zypp::Dep::SUGGESTS ), p2->dep( zypp::Dep::SUGGESTS ) ) + + row( "Freshens:", p1->dep( zypp::Dep::FRESHENS ), p2->dep( zypp::Dep::FRESHENS ) ) + + row( "Enances:", p1->dep( zypp::Dep::ENHANCES ), p2->dep( zypp::Dep::ENHANCES ) ) + + row( "Supplements:", p1->dep( zypp::Dep::SUPPLEMENTS ), p2->dep( zypp::Dep::SUPPLEMENTS ) ) + ); + + return html; +} + + +QString +YQPkgDependenciesView::row( const QString & heading, + const zypp::CapSet & capSet ) +{ + QString content = htmlLines( capSet ); + + if ( content.isEmpty() ) + return ""; + + return QString( "
      " ) + + hcell( heading ) + + "" + + ""; +} + + +QString +YQPkgDependenciesView::row( const QString & heading, + const zypp::CapSet & capSet1, + const zypp::CapSet & capSet2 ) +{ + QString content1 = htmlLines( capSet1 ); + QString content2 = htmlLines( capSet2 ); + + if ( content1.isEmpty() && content2.isEmpty() ) + return ""; + + return QString( "" ) + + hcell( heading ) + + "" + + "" + + ""; +} + + +QString +YQPkgDependenciesView::htmlLines( const zypp::CapSet & capSet ) +{ + QString html; + + for ( zypp::CapSet::const_iterator it = capSet.begin(); + it != capSet.end(); + ++it ) + { + if ( ! html.isEmpty() ) + html += "
      "; + + html += htmlEscape( ( *it).asString().c_str() ); + } + + return html; +} + + +#include "YQPkgDependenciesView.moc" diff --git a/src/pkg/YQPkgDependenciesView.h b/src/pkg/YQPkgDependenciesView.h new file mode 100644 index 0000000..ef4abe1 --- /dev/null +++ b/src/pkg/YQPkgDependenciesView.h @@ -0,0 +1,113 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDependenciesView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgDependenciesView_h +#define YQPkgDependenciesView_h + +#include "YQZypp.h" +#include "YQPkgGenericDetailsView.h" + +using std::string; + + +/** + * @short Display technical details ( very much like 'rpm -qi' ) for a zypp::Package + * object - the installed instance, the candidate instance or both ( in two + * columns ) if both exist. All other available instances are ignored. + **/ +class YQPkgDependenciesView : public YQPkgGenericDetailsView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgDependenciesView( QWidget * parent ); + + + /** + * Destructor + **/ + virtual ~YQPkgDependenciesView(); + + +protected: + + /** + * Show details for the specified selectable: + * In this case technical data, very much like "rpm -qi". + * Overwritten from YQPkgGenericDetailsView. + **/ + virtual void showDetails( ZyppSel selectable ); + + /** + * Returns a string containing a HTML table for technical details for one + * package. + **/ + QString simpleTable( ZyppObj pkg ); + + + /** + * Returns a string containing a HTML table for technical details for two + * package instances: The installed instance and an alternate instance. + * (usually the candidate instance). + **/ + QString complexTable( ZyppObj installed, + ZyppObj candidate ); + + /** + * Format a zypp::CapSet (describing zypp::Dep::REQUIRES etc.) + * with a heading in HTML lines. + * + * Returns an empty string if capSet is empty. + **/ + static QString row( const QString & heading, + const zypp::CapSet & capSet ); + + + /** + * Format two zypp::CapSets (describing zypp::Dep::REQUIRES etc.) + * with a heading in HTML lines. + * + * Returns an empty string both capSets are empty. + **/ + static QString row( const QString & heading, + const zypp::CapSet & capSet1, + const zypp::CapSet & capSet2 ); + + /** + * Returns a string containing a HTML table row with 'contents'. + * + * Required here to avoid inheritance ambiguities. + **/ + static QString row( const QString & contents ) + { return YQPkgGenericDetailsView::row( contents ); } + + /** + * Format a zypp::CapSet (describing zypp::Dep::REQUIRES etc.) + * in HTML lines, separated with
      . + * Returns an empty string if capSet is empty. + **/ + static QString htmlLines( const zypp::CapSet & capSet ); +}; + + +#endif // ifndef YQPkgDependenciesView_h diff --git a/src/pkg/YQPkgDescriptionDialog.cc b/src/pkg/YQPkgDescriptionDialog.cc new file mode 100644 index 0000000..b96376f --- /dev/null +++ b/src/pkg/YQPkgDescriptionDialog.cc @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDescriptionDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "YQPkgDescriptionDialog.h" +#include "YQPkgDescriptionView.h" +#include "YQPkgList.h" +#include "QY2LayoutUtils.h" +#include "YQi18n.h" +#include "YQUI.h" + + +#define SPACING 2 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgDescriptionDialog::YQPkgDescriptionDialog( QWidget * parent, const QString & pkgName ) + : QDialog( parent ) +{ + // Dialog title + setCaption( _( "Package Description" ) ); + + // Enable dialog resizing even without window manager + setSizeGripEnabled( true ); + + // Layout for the dialog (can't simply insert a QVBox) + + QVBoxLayout * layout = new QVBoxLayout( this, MARGIN, SPACING ); + CHECK_PTR( layout ); + + + // VBox for splitter + + QSplitter * splitter = new QSplitter( QSplitter::Vertical, this ); + CHECK_PTR( splitter ); + layout->addWidget( splitter ); + splitter->setMargin( MARGIN ); + + + // Pkg list + + _pkgList = new YQPkgList( splitter ); + CHECK_PTR( _pkgList ); + _pkgList->resize( _pkgList->width(), 80 ); + + + // Description view + + _pkgDescription = new YQPkgDescriptionView( splitter ); + CHECK_PTR( _pkgDescription ); + _pkgDescription->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + connect( _pkgList, SIGNAL( selectionChanged ( ZyppSel ) ), + _pkgDescription, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + + // Button box (to center the single button) + + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + hbox->setSpacing( SPACING ); + hbox->setMargin ( MARGIN ); + layout->addWidget( hbox ); + + addHStretch( hbox ); + + + // "OK" button + + QPushButton * button = new QPushButton( _( "&OK" ), hbox ); + CHECK_PTR( button ); + button->setDefault( true ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + addHStretch( hbox ); + + + filter( pkgName ); +} + + +void +YQPkgDescriptionDialog::filter( const QString & qPkgName ) +{ + std::string pkgName( (const char *) qPkgName ); + YQUI::ui()->busyCursor(); + _pkgList->clear(); + + + // Search for pkgs with that name + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppObj zyppObj = (*it)->theObj(); + + if ( zyppObj && zyppObj->name() == pkgName ) + _pkgList->addPkgItem( *it, tryCastToZyppPkg( zyppObj ) ); + } + + + // Display description of the first pkg with that name + + YQPkgObjListItem * firstItem = dynamic_cast ( _pkgList->firstChild() ); + + if ( firstItem ) + _pkgDescription->showDetailsIfVisible( firstItem->selectable() ); + else + _pkgDescription->clear(); + + YQUI::ui()->normalCursor(); +} + + +bool +YQPkgDescriptionDialog::isEmpty() const +{ + return _pkgList->firstChild() == 0; +} + + +QSize +YQPkgDescriptionDialog::sizeHint() const +{ + QRect available = qApp->desktop()->availableGeometry( (QWidget *) this ); + QSize size = QDialog::sizeHint(); + size = size.boundedTo( QSize( available.width(), available.height() ) ); + + return size; +} + + +void +YQPkgDescriptionDialog::showDescriptionDialog( const QString & pkgName ) +{ + YQPkgDescriptionDialog dialog( 0, pkgName ); + dialog.exec(); +} + + + + +#include "YQPkgDescriptionDialog.moc" diff --git a/src/pkg/YQPkgDescriptionDialog.h b/src/pkg/YQPkgDescriptionDialog.h new file mode 100644 index 0000000..99baa3d --- /dev/null +++ b/src/pkg/YQPkgDescriptionDialog.h @@ -0,0 +1,80 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDescriptionDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgDescriptionDialog_h +#define YQPkgDescriptionDialog_h + +#include + + +class YQPkgList; +class YQPkgDescriptionView; + + +/** + * Pkg status and description as a standalone popup dialog. + **/ +class YQPkgDescriptionDialog : public QDialog +{ + Q_OBJECT + +public: + + /** + * Static convenience method: Post a description dialog for pkg 'pkgName'. + **/ + static void showDescriptionDialog( const QString & pkgName ); + + /** + * Returns the preferred size. + * + * Reimplemented from QWidget to limit the dialog to the screen dimensions. + **/ + virtual QSize sizeHint () const; + + +protected: + + /** + * Constructor: Creates a description dialog for all packages that match 'pkgName'. + **/ + YQPkgDescriptionDialog( QWidget * parent, + const QString & pkgName ); + + /** + * Apply the filter criteria: Fill the pkg list with pkgs that match the + * specified package name. + **/ + void filter( const QString & pkgName ); + + /** + * Returns 'true' if the pkg list is empty. + * This is only meaningful after calling 'filter()' ! + **/ + bool isEmpty() const; + + + // Data members + + YQPkgList * _pkgList; + YQPkgDescriptionView * _pkgDescription; +}; + + +#endif // ifndef YQPkgDescriptionDialog_h diff --git a/src/pkg/YQPkgDescriptionView.cc b/src/pkg/YQPkgDescriptionView.cc new file mode 100644 index 0000000..6b537ff --- /dev/null +++ b/src/pkg/YQPkgDescriptionView.cc @@ -0,0 +1,143 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDescriptionView.cc + + Author: Stefan Hundhammer + +/-*/ + +#define y2log_component "qt-pkg" +#include + +#include +#include "YQPkgDescriptionView.h" +#include "YQPkgDescriptionDialog.h" +#include "YQi18n.h" +#include "utf8.h" + +using std::list; +using std::string; + + +YQPkgDescriptionView::YQPkgDescriptionView( QWidget * parent ) + : YQPkgGenericDetailsView( parent ) +{ + setMimeSourceFactory( 0 ); +} + + +YQPkgDescriptionView::~YQPkgDescriptionView() +{ + // NOP +} + + +void +YQPkgDescriptionView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( ! selectable ) + { + clear(); + return; + } + + QString html_text = htmlHeading( selectable ); + + QString description = fromUTF8( selectable->theObj()->description() ); + + if ( ! description.contains( "" ) ) + description = simpleHtmlParagraphs( description ); + + html_text += description; + + + setTextFormat( Qt::RichText ); + setText( html_text ); + ensureVisible( 0, 0 ); // Otherwise hyperlinks will be centered +} + + + +QString YQPkgDescriptionView::simpleHtmlParagraphs( QString text ) +{ + bool foundAuthorsList = false; + QString html_text = "

      "; + + QStringList lines = QStringList::split( '\n', text.stripWhiteSpace(), + true ); // allowEmptyEntries + QValueList::const_iterator it = lines.begin(); + + while ( it != lines.end() ) + { + QString line = htmlEscape( *it ).stripWhiteSpace(); + + if ( line.startsWith( "Authors:" ) ) + { + line = "

      " + line + "

        "; + foundAuthorsList = true; + } + + if ( foundAuthorsList ) + { + if ( ! line.startsWith( "-----" ) && ! line.isEmpty() ) + html_text += "
      • " + line + "
      • "; + } + else + { + if ( line.isEmpty() ) + html_text += "

        "; + else + html_text += " " + line; + } + + ++it; + } + + if ( foundAuthorsList ) + html_text += "

      "; + + html_text += "

      "; + + return html_text; +} + + +void +YQPkgDescriptionView::showLink( const QString & url ) +{ + if ( url.startsWith( "pkg:" ) ) + { + QString pkgName = url; + pkgName.remove( QRegExp( "^pkg:/*" ) ); // Remove leading protocol and slashes + pkgName.remove( QRegExp( "/*$" ) ); // Remove trailing slashes + y2milestone( "Hyperlinking to package '%s'", (const char *) pkgName ); + YQPkgDescriptionDialog::showDescriptionDialog( pkgName ); + } + else + { + y2error( "Protocol not supported - can't follow hyperlink '%s'", + (const char *) url ); + } +} + + +void +YQPkgDescriptionView::setSource( const QString & url ) +{ + showLink( url ); +} + + +#include "YQPkgDescriptionView.moc" diff --git a/src/pkg/YQPkgDescriptionView.h b/src/pkg/YQPkgDescriptionView.h new file mode 100644 index 0000000..2c622e3 --- /dev/null +++ b/src/pkg/YQPkgDescriptionView.h @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDescriptionView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgDescriptionView_h +#define YQPkgDescriptionView_h + +#include "YQPkgGenericDetailsView.h" + + +/** + * @short Display the description of a ZyppObj derived object along with its + * name and summary. + **/ +class YQPkgDescriptionView : public YQPkgGenericDetailsView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgDescriptionView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgDescriptionView(); + + /** + * Show details for the specified package: + * In this case the package description. + * Overwritten from YQPkgGenericDetailsView. + **/ + virtual void showDetails( ZyppSel selectable ); + + /** + * Get the document pointed to by a hyperlink. + * + * Reimplemented from QTextBrowser to avoid having an empty text each time + * the user clicks on a hyperlink. + **/ + virtual void setSource( const QString & name ); + +protected: + + /** + * Format a multi-line text into paragraphs + **/ + QString simpleHtmlParagraphs( QString text ); + + /** + * Show information for a hyperlinked object, + * e.g., a "pkg:somepkg" link to another package. + **/ + void showLink( const QString & url ); +}; + + +#endif // ifndef YQPkgDescriptionView_h diff --git a/src/pkg/YQPkgDiskUsageList.cc b/src/pkg/YQPkgDiskUsageList.cc new file mode 100644 index 0000000..84d87e1 --- /dev/null +++ b/src/pkg/YQPkgDiskUsageList.cc @@ -0,0 +1,384 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDiskUsageList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include + +#include + +#include "utf8.h" +#include "YQPkgDiskUsageList.h" +#include "YQPkgDiskUsageWarningDialog.h" +#include "YQi18n.h" + + +using std::set; + + +// Warning ranges for "disk space is running out" or "disk space overflow". +// The WARN value triggers a warning popup once ( ! ). The warning will not be +// displayed again until the value sinks below the PROXIMITY value and then +// increases again to the WARN value. +// +// See class YQPkgWarningRangeNotifier in file YQPkgDiskUsageList.h for details. + +#define MIN_FREE_MB_WARN 400 +#define MIN_FREE_MB_PROXIMITY 700 + +#define MIN_PERCENT_WARN 90 +#define MIN_PERCENT_PROXIMITY 80 + +#define OVERFLOW_MB_WARN 0 +#define OVERFLOW_MB_PROXIMITY 300 + + +typedef zypp::DiskUsageCounter::MountPointSet ZyppDuSet; +typedef zypp::DiskUsageCounter::MountPointSet::iterator ZyppDuSetIterator; + + + +YQPkgDiskUsageList::YQPkgDiskUsageList( QWidget * parent, int thresholdPercent ) + : QY2DiskUsageList( parent, true ) +{ + _debug = false; + + ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage(); + + if ( diskUsage.empty() ) + { + zypp::getZYpp()->setPartitions( zypp::DiskUsageCounter::detectMountPoints() ); + diskUsage = zypp::getZYpp()->diskUsage(); + } + + + for ( ZyppDuSetIterator it = diskUsage.begin(); + it != diskUsage.end(); + ++it ) + { + const ZyppPartitionDu & partitionDu = *it; + + if ( ! partitionDu.readonly ) + { + YQPkgDiskUsageListItem * item = new YQPkgDiskUsageListItem( this, partitionDu ); + CHECK_PTR( item ); + item->updateData(); + _items.insert( partitionDu.dir.c_str(), item ); + } + } + +} + + +void +YQPkgDiskUsageList::updateDiskUsage() +{ + runningOutWarning.clear(); + overflowWarning.clear(); + + ZyppDuSet diskUsage = zypp::getZYpp()->diskUsage(); + + for ( ZyppDuSetIterator it = diskUsage.begin(); + it != diskUsage.end(); + ++it ) + { + const ZyppPartitionDu & partitionDu = *it; + YQPkgDiskUsageListItem * item = _items[ partitionDu.dir.c_str() ]; + + if ( item ) + item->updateDuData( partitionDu ); + else + y2error( "No entry for mount point %s", partitionDu.dir.c_str() ); + } + + sort(); + postPendingWarnings(); +} + + +void +YQPkgDiskUsageList::postPendingWarnings() +{ + if ( overflowWarning.needWarning() ) + { + YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "Error: Out of disk space!" ), + 100, _( "&OK" ) ); + + overflowWarning.warningPostedNotify(); + runningOutWarning.warningPostedNotify(); // Suppress this ( now redundant ) other warning + } + + if ( runningOutWarning.needWarning() ) + { + YQPkgDiskUsageWarningDialog::diskUsageWarning( _( "Warning: Disk space is running out!" ) , + MIN_PERCENT_WARN, _( "&OK" ) ); + runningOutWarning.warningPostedNotify(); + } + + if ( overflowWarning.leavingProximity() ) + overflowWarning.clearHistory(); + + if ( runningOutWarning.leavingProximity() ) + runningOutWarning.clearHistory(); +} + + +QSize +YQPkgDiskUsageList::sizeHint() const +{ + int width = header()->headerWidth() + + style().pixelMetric( QStyle::PM_ScrollBarExtent, verticalScrollBar() ); + + return QSize( width, 100 ); +} + + +void +YQPkgDiskUsageList::keyPressEvent( QKeyEvent * event ) +{ + + if ( event ) + { + unsigned special_combo = ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton ); + + if ( ( event->state() & special_combo ) == special_combo ) + { + if ( event->key() == Qt::Key_Q ) + { + _debug = ! _debug; + y2milestone( "Debug mode %s", _debug ? "on" : "off" ); + } + + } + + if ( _debug && currentItem() ) + { + YQPkgDiskUsageListItem * item = dynamic_cast ( currentItem() ); + + if ( item ) + { + { + int percent = item->usedPercent(); + + switch ( event->ascii() ) + { + case '1': percent = 10; break; + case '2': percent = 20; break; + case '3': percent = 30; break; + case '4': percent = 40; break; + case '5': percent = 50; break; + case '6': percent = 60; break; + case '7': percent = 70; break; + case '8': percent = 80; break; + case '9': percent = 90; break; + case '0': percent = 100; break; + case '+': percent += 3; break; + case '-': percent -= 3; break; + + case 'w': + // Only for testing, thus intentionally using no translations + YQPkgDiskUsageWarningDialog::diskUsageWarning( "Warning: Disk space is running out!", + 90, "&OK" ); + break; + + case 'f': + YQPkgDiskUsageWarningDialog::diskUsageWarning( "Error: Out of disk space!", + 100, "&Continue anyway", "&Cancel" ); + break; + } + + if ( percent < 0 ) + percent = 0; + + ZyppPartitionDu partitionDu( item->partitionDu() ); + + if ( percent != item->usedPercent() ) + { + partitionDu.pkg_size = partitionDu.total_size * percent / 100; + + runningOutWarning.clear(); + overflowWarning.clear(); + + item->updateDuData( partitionDu ); + postPendingWarnings(); + } + } + } + } + } + + QY2DiskUsageList::keyPressEvent( event ); +} + + + + + + +YQPkgDiskUsageListItem::YQPkgDiskUsageListItem( YQPkgDiskUsageList * parent, + const ZyppPartitionDu & partitionDu ) + : QY2DiskUsageListItem( parent ) + , _partitionDu( partitionDu ) + , _pkgDiskUsageList( parent ) +{ + y2debug( "disk usage list entry for %s", partitionDu.dir.c_str() ); +} + + +FSize +YQPkgDiskUsageListItem::usedSize() const +{ + return FSize( _partitionDu.pkg_size, FSize::K ); +} + + +FSize +YQPkgDiskUsageListItem::totalSize() const +{ + return FSize( _partitionDu.total_size, FSize::K ); +} + + +QString +YQPkgDiskUsageListItem::name() const +{ + return fromUTF8( _partitionDu.dir.c_str() ); +} + + +void +YQPkgDiskUsageListItem::updateDuData( const ZyppPartitionDu & fromData ) +{ + _partitionDu = fromData; + updateData(); + checkRemainingDiskSpace(); +} + + +void +YQPkgDiskUsageListItem::checkRemainingDiskSpace() +{ + int percent = usedPercent(); + int free = freeSize() / FSize::MB; + + if ( percent > MIN_PERCENT_WARN ) + { + // Modern hard disks can be huge, so a warning based on percentage only + // can be misleading - check the absolute value, too. + + if ( free < MIN_FREE_MB_PROXIMITY ) + _pkgDiskUsageList->runningOutWarning.enterProximity(); + + if ( free < MIN_FREE_MB_WARN ) + _pkgDiskUsageList->runningOutWarning.enterRange(); + } + + if ( free < MIN_FREE_MB_PROXIMITY ) + { + if ( percent > MIN_PERCENT_PROXIMITY ) + _pkgDiskUsageList->runningOutWarning.enterProximity(); + } + + if ( free < OVERFLOW_MB_WARN ) + _pkgDiskUsageList->overflowWarning.enterRange(); + + if ( free < OVERFLOW_MB_PROXIMITY ) + _pkgDiskUsageList->overflowWarning.enterProximity(); +} + + + + + + +YQPkgWarningRangeNotifier::YQPkgWarningRangeNotifier() +{ + clearHistory(); +} + + +void +YQPkgWarningRangeNotifier::clear() +{ + _inRange = false; + _hasBeenClose = _isClose; + _isClose = false; +} + + +void +YQPkgWarningRangeNotifier::clearHistory() +{ + clear(); + _hasBeenClose = false; + _warningPosted = false; +} + + +void +YQPkgWarningRangeNotifier::enterRange() +{ + _inRange = true; + enterProximity(); +} + + +void +YQPkgWarningRangeNotifier::enterProximity() +{ + _isClose = true; + _hasBeenClose = true; +} + + +void +YQPkgWarningRangeNotifier::warningPostedNotify() +{ + _warningPosted = true; +} + + +bool +YQPkgWarningRangeNotifier::inRange() const +{ + return _inRange; +} + + +bool +YQPkgWarningRangeNotifier::leavingProximity() const +{ + return ! _isClose && ! _hasBeenClose; +} + + +bool +YQPkgWarningRangeNotifier::needWarning() const +{ + return _inRange && ! _warningPosted; +} + + + + +#include "YQPkgDiskUsageList.moc" diff --git a/src/pkg/YQPkgDiskUsageList.h b/src/pkg/YQPkgDiskUsageList.h new file mode 100644 index 0000000..d598686 --- /dev/null +++ b/src/pkg/YQPkgDiskUsageList.h @@ -0,0 +1,268 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDiskUsageList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgDiskUsageList_h +#define YQPkgDiskUsageList_h + +#include +#include +#include + +typedef zypp::DiskUsageCounter::MountPoint ZyppPartitionDu; +class YQPkgDiskUsageListItem; + + +/** + * Helper class to manage warnings that are to be issued when a value enters a + * predefined range, but repeated only when that value leaves a (wider) + * "proximity" range and then re-enters the (narrower) "inner" range. + * + * Example: Disk space usage: + * + * 70% + * 75% + * 80% [proximity range start] + * 85% + * 90% [inner range start] + * 95% + * 100% + * + * A warning is to be posted when there is only 90% disk space left. After the + * warning is displayed, there shall be no more warning until disk usage decreases + * below 80% (the proximity range) and then later increases again to 90%. + * + * The net effect of all that is to avoid posting the warning over and over + * again while the value changes back and forth around the boundary of the + * ( inner ) warning range. + **/ +class YQPkgWarningRangeNotifier +{ +public: + + /** + * Constructor. + **/ + YQPkgWarningRangeNotifier(); + + /** + * Notification that the inner range is entered. + * The caller has to decide the criteria for that. + **/ + void enterRange(); + + /** + * Notification that the proximity range is entered, i.e. that the value is + * getting near the inner range. + * 'enterRange()' automatically includes this, too. + **/ + void enterProximity(); + + /** + * Notification that a warning has been posted. + **/ + void warningPostedNotify(); + + /** + * Check if the value is in range, i.e. if anybody from the outside has + * called 'enterRange()' since the last call to 'clear()'. + **/ + bool inRange() const; + + /** + * Check if a warning should be posted, i.e. if the value is currently in + * range ( see 'inRange() ) and there has been no notification yet that a + * warning has already been posted. + **/ + bool needWarning() const; + + /** + * Check if the value is leaving the proximity range. + **/ + bool leavingProximity() const; + + /** + * Clear the current values, i.e. prepare for a new round of checks + **/ + void clear(); + + /** + * Clear everything, including all history values such as if a warning has + * been posted. + **/ + void clearHistory(); + + +protected: + + bool _inRange; + bool _isClose; + bool _hasBeenClose; + bool _warningPosted; +}; + + + + + +/** + * @short List of disk usage of all attached partitions. + **/ +class YQPkgDiskUsageList : public QY2DiskUsageList +{ + Q_OBJECT + +public: + /** + * Constructor. + * + * 'thresholdPercent' can be used to include only partitions with at least + * this many percent used disk space in the list. This is useful for + * warning dialogs ( only? ). + **/ + YQPkgDiskUsageList( QWidget * parent, int thresholdPercent = 0 ); + + /** + * Destructor. + **/ + virtual ~YQPkgDiskUsageList() {} + + /** + * Suggest reasonable default size. + * + * Reimplemented from QListView. + **/ + virtual QSize sizeHint() const; + + /** + * Warning range notifier about running out of disk space warning. + **/ + YQPkgWarningRangeNotifier runningOutWarning; + + /** + * Warning range notifier about disk space overflow warning. + **/ + YQPkgWarningRangeNotifier overflowWarning; + + +public slots: + + /** + * Update all statistical data in the list. + **/ + void updateDiskUsage(); + + /** + * Post all pending disk space warnings based on the warning range + * notifiers. + **/ + void postPendingWarnings(); + + +protected: + + /** + * Event handler for keyboard input - for debugging and testing. + * Changes the current item's percentage on the fly. + * + * Reimplemented from QListView / QWidget. + **/ + virtual void keyPressEvent( QKeyEvent * ev ); + + + // Data members + + QAsciiDict _items; + bool _debug; +}; + + + +class YQPkgDiskUsageListItem: public QY2DiskUsageListItem +{ +public: + + /** + * Constructor. Creates a YQPkgDiskUsageList item that corresponds to the + * specified file system. + **/ + YQPkgDiskUsageListItem( YQPkgDiskUsageList * parent, + const ZyppPartitionDu & partitionDu ); + + /** + * Destructor. + **/ + virtual ~YQPkgDiskUsageListItem() {} + + /** + * Returns the corresponding disk usage data. + **/ + ZyppPartitionDu partitionDu() const { return _partitionDu; } + + /** + * Update the disk usage data. + **/ + void updateDuData( const ZyppPartitionDu & fromData ); + + /** + * The currently used size of this partition. + * + * Reimplemented from QY2DiskUsageListItem. + **/ + virtual FSize usedSize() const; + + /** + * The total size of this partition. + * + * Reimplemented from QY2DiskUsageListItem. + **/ + virtual FSize totalSize() const; + + /** + * The name to display for this partition ( the mount point ). + * + * Reimplemented from QY2DiskUsageListItem. + **/ + virtual QString name() const; + + /** + * The device name of this partition. + * + * Reimplemented from QY2DiskUsageListItem. + **/ + virtual QString deviceName() const { return ""; } + + /** + * Check the remaining disk space of this partition based on percentage and + * absolute free MB. Notify the parent YQPkgDiskUsageList's warning ranges + * accordingly. + **/ + void checkRemainingDiskSpace(); + + +protected: + + // Data members + + ZyppPartitionDu _partitionDu; + YQPkgDiskUsageList * _pkgDiskUsageList; +}; + + + +#endif // ifndef YQPkgDiskUsageList_h diff --git a/src/pkg/YQPkgDiskUsageWarningDialog.cc b/src/pkg/YQPkgDiskUsageWarningDialog.cc new file mode 100644 index 0000000..aeacc84 --- /dev/null +++ b/src/pkg/YQPkgDiskUsageWarningDialog.cc @@ -0,0 +1,157 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDiskUsageWarningDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include +#include +#include +#include +#include + +#include "YQPkgDiskUsageWarningDialog.h" +#include "YQPkgDiskUsageList.h" +#include "QY2LayoutUtils.h" +#include "YQUI.h" +#include "YQi18n.h" + + +#define SPACING 2 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgDiskUsageWarningDialog::YQPkgDiskUsageWarningDialog( QWidget * parent, + const QString & message, + int thresholdPercent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ) + : QDialog( parent ) +{ + // Dialog title + setCaption( _( "Disk Space Warning" ) ); + + // Enable dialog resizing even without window manager + setSizeGripEnabled( true ); + + // Layout for the dialog ( can't simply insert a QVBox ) + + QVBoxLayout * layout = new QVBoxLayout( this, MARGIN, SPACING ); + CHECK_PTR( layout ); + + + // HBox for icon and message + + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + layout->addWidget( hbox ); + + + // Icon + + addHSpacing( hbox ); + QLabel * iconLabel = new QLabel( hbox ); + CHECK_PTR( iconLabel ); + iconLabel->setPixmap( QApplication::style().stylePixmap( QStyle::SP_MessageBoxWarning ) ); + iconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) ); // hor/vert + addHSpacing( hbox ); + + // Label for the message + + QLabel * label = new QLabel( message, hbox ); + CHECK_PTR( label ); + label->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); // hor/vert + + + // Disk usage list + + YQPkgDiskUsageList * duList = new YQPkgDiskUsageList( this, thresholdPercent ); + CHECK_PTR( duList ); + + layout->addWidget( duList ); + + + // Button box + + hbox = new QHBox( this ); + CHECK_PTR( hbox ); + hbox->setSpacing( SPACING ); + hbox->setMargin ( MARGIN ); + layout->addWidget( hbox ); + + addHStretch( hbox ); + + + // Accept button - usually "OK" or "Continue" + + QPushButton * button = new QPushButton( acceptButtonLabel, hbox ); + CHECK_PTR( button ); + + + connect( button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + addHStretch( hbox ); + + + if ( ! rejectButtonLabel.isEmpty() ) + { + // Reject button ( if desired ) - usually "Cancel" + + button = new QPushButton( rejectButtonLabel, hbox ); + CHECK_PTR( button ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + addHStretch( hbox ); + } + + // If there is only one button, it's safe to make that one ( the accept + // button ) the default. If there are two, better be safe than sorry and + // make the reject button the default. + + button->setDefault( true ); +} + + +bool +YQPkgDiskUsageWarningDialog::diskUsageWarning( const QString & message, + int thresholdPercent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ) +{ + YQPkgDiskUsageWarningDialog dialog( 0, + message, + thresholdPercent, + acceptButtonLabel, + rejectButtonLabel ); + YQUI::ui()->normalCursor(); + dialog.exec(); + + return dialog.result() == QDialog::Accepted; +} + + + + +#include "YQPkgDiskUsageWarningDialog.moc" diff --git a/src/pkg/YQPkgDiskUsageWarningDialog.h b/src/pkg/YQPkgDiskUsageWarningDialog.h new file mode 100644 index 0000000..7ad0c1c --- /dev/null +++ b/src/pkg/YQPkgDiskUsageWarningDialog.h @@ -0,0 +1,68 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgDiskUsageWarningDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgDiskUsageWarningDialog_h +#define YQPkgDiskUsageWarningDialog_h + +#include + + +class YQPkgDiskUsageList; + + +/** + * Warning dialog about partitions that are getting full or overflowing. + **/ +class YQPkgDiskUsageWarningDialog : public QDialog +{ + Q_OBJECT + +public: + /** + * Static convenience method: Post a disk usage warning with text + * 'message', a list of partitions that are at least 'thresholdPercent' + * full and one ( default ) or two buttons. + * + * Returns 'true' if the user accepted ( i.e. clicked the 'accept' button ) + * and 'false' if the user rejected ( i.e. clicked the 'reject' button or + * the window manager close button ). + **/ + static bool diskUsageWarning( const QString & message, + int thresholdPercent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel = QString::null ); +protected: + + /** + * Constructor: Creates a disk usage warning dialog with text 'message' on + * top, a list of partitions that are at least 'thresholdPercent' full and + * one ( default ) or two buttons. + * + * Not meant for public use. Applications should use the static + * 'diskUsageWarning' method instead. + **/ + YQPkgDiskUsageWarningDialog( QWidget * parent, + const QString & message, + int thresholdPercent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel = QString::null ); +}; + + +#endif // ifndef YQPkgDiskUsageWarningDialog_h diff --git a/src/pkg/YQPkgFileListView.cc b/src/pkg/YQPkgFileListView.cc new file mode 100644 index 0000000..9e44daf --- /dev/null +++ b/src/pkg/YQPkgFileListView.cc @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgFileListView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define y2log_component "qt-pkg" +#include + +#include +#include "YQPkgFileListView.h" +#include "YQPkgDescriptionDialog.h" +#include "YQi18n.h" +#include "utf8.h" + + +#define MAX_LINES 5000 + + +YQPkgFileListView::YQPkgFileListView( QWidget * parent ) + : YQPkgGenericDetailsView( parent ) +{ +} + + +YQPkgFileListView::~YQPkgFileListView() +{ + // NOP +} + + +void +YQPkgFileListView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( ! selectable ) + { + clear(); + return; + } + + QString html = htmlHeading( selectable, + true ); // showVersion + + ZyppPkg installed = tryCastToZyppPkg( selectable->installedObj() ); + + if ( installed ) + { + html += formatFileList( installed->filenames() ); + } + else + { + html += "

      " + _( "Information only available for installed packages." ) + "

      "; + } + + setTextFormat( Qt::RichText ); + setText( html ); +} + + + +QString YQPkgFileListView::formatFileList( const list & fileList ) const +{ + QString html; + unsigned line_count = 0; + + for ( list::const_iterator it = fileList.begin(); + it != fileList.end() && line_count < MAX_LINES; + ++it, ++line_count ) + { + QString line = htmlEscape( fromUTF8( *it ) ); + + if ( line.contains( "/bin/" ) || + line.contains( "/sbin/" ) ) + { + line = "" + line + ""; + } + + html += line + "
      "; + } + + if ( fileList.size() > MAX_LINES ) + { + html += "...
      "; + html += "...
      "; + } + + // %1 is the total number of files in a file list + html += "
      " + _( "%1 files total" ).arg( (unsigned long) fileList.size() ); + + return "

      " + html + "

      "; +} + + +#include "YQPkgFileListView.moc" diff --git a/src/pkg/YQPkgFileListView.h b/src/pkg/YQPkgFileListView.h new file mode 100644 index 0000000..5006fe7 --- /dev/null +++ b/src/pkg/YQPkgFileListView.h @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgFileListView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgFileListView_h +#define YQPkgFileListView_h + +#include "YQPkgGenericDetailsView.h" + + +using std::list; +using std::string; + + +/** + * @short Display a pkg's file list + **/ +class YQPkgFileListView : public YQPkgGenericDetailsView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgFileListView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgFileListView(); + + /** + * Show details for the specified package: + * In this case the package description. + * Overwritten from YQPkgGenericDetailsView. + **/ + virtual void showDetails( ZyppSel selectable ); + +protected: + + /** + * Format a file list in HTML + **/ + QString formatFileList( const list & fileList ) const; +}; + + +#endif // ifndef YQPkgFileListView_h diff --git a/src/pkg/YQPkgGenericDetailsView.cc b/src/pkg/YQPkgGenericDetailsView.cc new file mode 100644 index 0000000..9181604 --- /dev/null +++ b/src/pkg/YQPkgGenericDetailsView.cc @@ -0,0 +1,204 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgGenericDetailsView.cc + + Author: Stefan Hundhammer + +/-*/ + +#define y2log_component "qt-pkg" +#include +#include +#include +#include + +#include "YQPkgGenericDetailsView.h" +#include "YQi18n.h" +#include "YQUI.h" +#include "utf8.h" + +using std::string; + + +YQPkgGenericDetailsView::YQPkgGenericDetailsView( QWidget * parent ) + : QTextBrowser( parent ) +{ + _selectable = 0; + _parentTab = dynamic_cast (parent); + + if ( _parentTab ) + { + connect( parent, SIGNAL( currentChanged(QWidget *) ), + this, SLOT ( reload (QWidget *) ) ); + } +} + + +YQPkgGenericDetailsView::~YQPkgGenericDetailsView() +{ + // NOP +} + + +void +YQPkgGenericDetailsView::reload( QWidget * newCurrent ) +{ + if ( newCurrent == this ) + { + showDetailsIfVisible( _selectable ); + } +} + + +void +YQPkgGenericDetailsView::showDetailsIfVisible( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( _parentTab ) // Is this view embedded into a tab widget? + { + if ( _parentTab->currentPage() == this ) // Is this page the topmost? + { + showDetails( selectable ); + } + } + else // No tab parent - simply show data unconditionally. + { + showDetails( selectable ); + } +} + + +QSize +YQPkgGenericDetailsView::minimumSizeHint() const +{ + return QSize( 0, 0 ); +} + + +QString +YQPkgGenericDetailsView::htmlHeading( ZyppSel selectable, bool showVersion ) +{ + if ( ! selectable ) + return ""; + + ZyppObj zyppObj = selectable->theObj(); + + if ( ! zyppObj ) + return ""; + + QString summary = fromUTF8( zyppObj->summary() ); + + QString html = "usingVisionImpairedPalette() ) + html += " bgcolor=#E0E0F8"; + + html += ">
      " + + key + + "
      " + summary + "" + explanation + "
      " + changes + "
      " + content + "
      " + content1 + "" + content2 + "
      " + + fromUTF8( zyppObj->name() ) + + ""; + + if ( showVersion ) + html += QString( "-" ) + zyppObj->edition().asString().c_str() + ""; + + if ( ! summary.isEmpty() ) + html += " - " + summary; + + html += "

      "; + + return html; +} + + + +QString +YQPkgGenericDetailsView::htmlEscape( const QString & plainText ) +{ + QString html = plainText; + // y2debug( "Escaping '%s'", (const char *) plainText ); + + html.replace( QRegExp( "&" ), "&" ); + html.replace( QRegExp( "<" ), "<" ); + html.replace( QRegExp( ">" ), ">" ); + + return html; +} + + +QString +YQPkgGenericDetailsView::table( const QString & contents ) +{ + QString html = "usingVisionImpairedPalette() ) + html += " bgcolor=#F0F0F0"; + html += ">" + contents + "
      "; + + return html; +} + + +QString +YQPkgGenericDetailsView::row( const QString & contents ) +{ + return "" + contents + ""; +} + + +QString +YQPkgGenericDetailsView::cell( QString contents ) +{ + contents = htmlEscape( contents ); + return "" + contents + ""; +} + + +QString +YQPkgGenericDetailsView::cell( int contents ) +{ + QString html; + html.sprintf( "%d", contents ); + + return html; +} + + +QString +YQPkgGenericDetailsView::cell( const zypp::Date & date ) +{ + return cell( ( (time_t) date == (time_t) 0 ? "" : date.asString() ) ); +} + + +QString +YQPkgGenericDetailsView::cell( const string & contents ) +{ + return cell( fromUTF8( contents ) ); +} + + +QString +YQPkgGenericDetailsView::hcell( QString contents ) +{ + QString html = "usingVisionImpairedPalette() ) + html += " bgcolor=#D0D0D0"; + + html += ">" + contents + ""; + + return html; +} + + +#include "YQPkgGenericDetailsView.moc" diff --git a/src/pkg/YQPkgGenericDetailsView.h b/src/pkg/YQPkgGenericDetailsView.h new file mode 100644 index 0000000..94fcf8b --- /dev/null +++ b/src/pkg/YQPkgGenericDetailsView.h @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgGenericDetailsView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgGenericDetailsView_h +#define YQPkgGenericDetailsView_h + +#include +#include +#include + + +class QTabWidget; +using std::string; + + +/** + * @short Abstract base class for details views. Handles generic stuff like + * HTML formatting, Qt slots and display only if this view is visible at all + * ( it may be hidden if it's part of a QTabWidget ). + **/ +class YQPkgGenericDetailsView : public QTextBrowser +{ + Q_OBJECT + +protected: + + /** + * Constructor. + **/ + YQPkgGenericDetailsView( QWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQPkgGenericDetailsView(); + + +public: + + /** + * Returns the minimum size required for this widget. + * Inherited from QWidget. + **/ + virtual QSize minimumSizeHint() const; + + /** + * Returns a uniform heading in HTML format for the specified selectable: + * name and summary + * or name, version and summary, if 'showVersion' is 'true' + **/ + static QString htmlHeading( ZyppSel selectable, bool showVersion = false ); + + /** + * Escapes characters special to HTML in a ( plain text ) string, such as: + * '<' -> '<' + * '>' -> '>' + * '&' -> '&' + * + * Returns the escaped string. + **/ + static QString htmlEscape( const QString & plainText ); + + /** + * Returns a string containing a HTML table with 'contents'. + **/ + static QString table( const QString & contents ); + + /** + * Returns a string containing a HTML table row with 'contents'. + **/ + static QString row( const QString & contents ); + + /** + * Returns a string containing a HTML table cell with 'contents'. + **/ + static QString cell( QString contents ); + static QString cell( int contents ); + static QString cell( const string & contents ); + static QString cell( const zypp::Date & date ); + + /** + * Returns a string containing a HTML table cell with 'contents' + * for table headers. + **/ + static QString hcell( QString contents ); + + +public slots: + + /** + * Show details for the specified package. + * Delayed ( optimized ) display if this is embedded into a QTabWidget + * parent: In this case, wait until this page becomes visible. + **/ + void showDetailsIfVisible( ZyppSel selectable ); + + // slot clear() inherited from QTextEdit + + /** + * Show details for the specified package. + * Reimplement this in derived classes. + **/ + virtual void showDetails( ZyppSel selectable ) = 0; + + +protected slots: + + /** + * Show data for the last package. + **/ + void reload( QWidget * newCurrent ); + + +protected: + + // Data members + + QTabWidget * _parentTab; + ZyppSel _selectable; +}; + + +#endif // ifndef YQPkgGenericDetailsView_h diff --git a/src/pkg/YQPkgLangList.cc b/src/pkg/YQPkgLangList.cc new file mode 100644 index 0000000..ffefaaa --- /dev/null +++ b/src/pkg/YQPkgLangList.cc @@ -0,0 +1,214 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgLangList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include +#include + +#include "YQi18n.h" +#include "utf8.h" +#include "YQPkgLangList.h" + +using std::set; + + +YQPkgLangList::YQPkgLangList( QWidget * parent ) + : YQPkgObjList( parent ) +{ + y2debug( "Creating language list" ); + + int numCol = 0; + addColumn( "" ); _statusCol = numCol++; + + // Translators: Table column heading for language ISO code like "de_DE", "en_US" + // Please keep this short to avoid stretching the column too wide! + addColumn( _( "Code" ) ); _nameCol = numCol++; + + // Full (human readable) language / country name like "German (Austria)" + addColumn( _( "Language" ) ); _summaryCol = numCol++; + setAllColumnsShowFocus( true ); + + connect( this, SIGNAL( selectionChanged ( QListViewItem * ) ), + this, SLOT ( filter() ) ); + + fillList(); + selectSomething(); + + y2debug( "Creating language list done" ); +} + + +YQPkgLangList::~YQPkgLangList() +{ + // NOP +} + + +void +YQPkgLangList::fillList() +{ + clear(); + y2debug( "Filling language list" ); + + + for ( ZyppPoolIterator it = zyppLangBegin(); + it != zyppLangEnd(); + ++it ) + { + ZyppLang zyppLang = tryCastToZyppLang( (*it)->theObj() ); + + if ( zyppLang ) + addLangItem( *it, zyppLang ); + else + y2error( "Found non-Language selectable" ); + } + + y2debug( "Language list filled" ); +} + + +void +YQPkgLangList::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgLangList::filter() +{ + emit filterStart(); + + if ( selection() ) + { + ZyppLang lang = selection()->zyppLang(); + + if ( lang ) + { + string currentLang = lang->name(); + + // + // Iterate over all selectables in pool + // + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppObj zyppObj = (*it)->theObj(); + + if ( zyppObj ) + { + // + // Iterate over all "freshens" dependencies of this object + // + + zypp::CapSet freshens = zyppObj->dep( zypp::Dep::FRESHENS ); + + for ( zypp::CapSet::const_iterator cap_it = freshens.begin(); + cap_it != freshens.end(); + ++cap_it ) + { + if ( (*cap_it).index() == currentLang ) // obj freshens this language + { + ZyppPkg pkg = tryCastToZyppPkg( zyppObj ); + + if ( pkg ) + { + y2debug( "Found pkg %s for lang %s", + pkg->name().c_str(), currentLang.c_str() ); + + emit filterMatch( *it, pkg ); + } + else + { + y2warning( "Found non-pkg obj %s for lang %s", + pkg->name().c_str(), currentLang.c_str() ); + } + } + } + } + } + } + } + + emit filterFinished(); +} + + +void +YQPkgLangList::addLangItem( ZyppSel selectable, + ZyppLang zyppLang ) +{ + if ( ! selectable ) + { + y2error( "NULL ZyppSel!" ); + return; + } + + new YQPkgLangListItem( this, selectable, zyppLang ); +} + + +YQPkgLangListItem * +YQPkgLangList::selection() const +{ + QListViewItem * item = selectedItem(); + + if ( ! item ) + return 0; + + return dynamic_cast (item); +} + + + + + + +YQPkgLangListItem::YQPkgLangListItem( YQPkgLangList * langList, + ZyppSel selectable, + ZyppLang lang ) + : YQPkgObjListItem( langList, selectable, lang ) + , _langList( langList ) + , _zyppLang( lang ) +{ +} + + + +YQPkgLangListItem::~YQPkgLangListItem() +{ + // NOP +} + + +void +YQPkgLangListItem::applyChanges() +{ + solveResolvableCollections(); +} + + + + +#include "YQPkgLangList.moc" diff --git a/src/pkg/YQPkgLangList.h b/src/pkg/YQPkgLangList.h new file mode 100644 index 0000000..45d8e86 --- /dev/null +++ b/src/pkg/YQPkgLangList.h @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgLangList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgLangList_h +#define YQPkgLangList_h + +#include + + +class YQPkgLangListItem; + + +/** + * @short Display a list of zypp::Selection objects. + **/ +class YQPkgLangList : public YQPkgObjList +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgLangList( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgLangList(); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + + /** + * Add a selection to the list. Connect a filter's filterMatch() signal to + * this slot. Remember to connect filterStart() to clear() (inherited from + * QListView). + **/ + void addLangItem( ZyppSel selectable, + ZyppLang lang ); + + +public: + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgLangListItem * selection() const; + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected slots: + + /** + * Fill the language list. + **/ + void fillList(); +}; + + + +class YQPkgLangListItem: public YQPkgObjListItem +{ +public: + + /** + * Constructor. Creates a YQPkgLangList item that corresponds to the package + * manager object that 'pkg' refers to. + **/ + YQPkgLangListItem( YQPkgLangList * pkgSelList, + ZyppSel selectable, + ZyppLang lang ); + + /** + * Destructor + **/ + virtual ~YQPkgLangListItem(); + + /** + * Returns the original object within the package manager backend. + **/ + ZyppLang zyppLang() const { return _zyppLang; } + + + // Columns + + int statusCol() const { return _langList->statusCol(); } + + +protected: + + /** + * Propagate status changes in this list to other lists: + * Have the solver transact all languages. + * + * Reimplemented from YQPkgObjListItem. + **/ + virtual void applyChanges(); + + + // Data members + + YQPkgLangList * _langList; + ZyppLang _zyppLang; +}; + + +#endif // ifndef YQPkgLangList_h diff --git a/src/pkg/YQPkgList.cc b/src/pkg/YQPkgList.cc new file mode 100644 index 0000000..5fb7872 --- /dev/null +++ b/src/pkg/YQPkgList.cc @@ -0,0 +1,802 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define SOURCE_RPM_DISABLED 0 + +#define y2log_component "qt-pkg" +#include +#include +#include +#include +#include + +#include "utf8.h" + +#include "YQPkgList.h" +#include "YQUI.h" +#include "YQi18n.h" +#include "YQIconPool.h" + + +YQPkgList::YQPkgList( QWidget * parent ) + : YQPkgObjList( parent ) +{ + _srpmStatusCol = -42; + + int numCol = 0; + addColumn( "" ); _statusCol = numCol++; + // _statusCol = numCol; + addColumn( _( "Package" ) ); _nameCol = numCol++; + + addColumn( _( "Summary" ) ); _summaryCol = numCol++; + addColumn( _( "Size" ) ); _sizeCol = numCol++; + + if ( haveInstalledPkgs() ) + { + addColumn( _( "Avail. Ver." ) ); _versionCol = numCol++; + addColumn( _( "Inst. Ver." ) ); _instVersionCol = numCol++; + } + else + { + addColumn( _( "Version" ) ); _versionCol = numCol++; + _instVersionCol = -1; + } + +#if SOURCE_RPM_DISABLED +#warning Selecting source RPMs disabled! +#else + addColumn( _( "Source" ) ); _srpmStatusCol = numCol++; +#endif + + saveColumnWidths(); + setSorting( nameCol() ); + setColumnAlignment( sizeCol(), Qt::AlignRight ); + setAllColumnsShowFocus( true ); + + createActions(); + createSourceRpmContextMenu(); +} + + +YQPkgList::~YQPkgList() +{ + // NOP +} + + +void YQPkgList::addPkgItem( ZyppSel selectable, + ZyppPkg zyppPkg ) +{ + addPkgItem( selectable, zyppPkg, false ); +} + + +void YQPkgList::addPkgItemDimmed( ZyppSel selectable, + ZyppPkg zyppPkg ) +{ + addPkgItem( selectable, zyppPkg, true ); +} + + +void +YQPkgList::addPkgItem( ZyppSel selectable, + ZyppPkg zyppPkg, + bool dimmed ) +{ + if ( ! selectable ) + { + y2error( "NULL zypp::ui::Selectable!" ); + return; + } + + YQPkgListItem * item = new YQPkgListItem( this, selectable, zyppPkg ); + CHECK_PTR( item ); + + item->setDimmed( dimmed ); + applyExcludeRules( item ); +} + + +bool +YQPkgList::haveInstalledPkgs() +{ + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + if ( (*it)->installedObj() ) + return true; + } + + return false; +} + + +void +YQPkgList::pkgObjClicked( int button, + QListViewItem * listViewItem, + int col, + const QPoint & pos ) +{ + if ( col == srpmStatusCol() ) + { + YQPkgListItem * item = dynamic_cast (listViewItem); + + if ( item ) + { + if ( button == Qt::LeftButton ) + { + if ( editable() && item->editable() ) + item->toggleSourceRpmStatus(); + return; + } + else if ( button == Qt::RightButton ) + { + if ( editable() && item->editable() ) + { + updateActions( item ); + + if ( _sourceRpmContextMenu ) + _sourceRpmContextMenu->popup( pos ); + } + + return; + } + } + } + + YQPkgObjList::pkgObjClicked( button, listViewItem, col, pos ); +} + + +QSize +YQPkgList::sizeHint() const +{ + return QSize( 600, 350 ); +} + + +void +YQPkgList::createSourceRpmContextMenu() +{ + _sourceRpmContextMenu = new QPopupMenu( this ); + + actionInstallSourceRpm->addTo( _sourceRpmContextMenu ); + actionDontInstallSourceRpm->addTo( _sourceRpmContextMenu ); + + QPopupMenu * submenu = new QPopupMenu( _sourceRpmContextMenu ); + CHECK_PTR( submenu ); + _sourceRpmContextMenu->insertItem( _( "&All in This List" ), submenu ); + + actionInstallListSourceRpms->addTo( submenu ); + actionDontInstallListSourceRpms->addTo( submenu ); +} + + +void +YQPkgList::setInstallCurrentSourceRpm( bool installSourceRpm, + bool selectNextItem ) +{ + QListViewItem * listViewItem = selectedItem(); + + if ( ! listViewItem ) + return; + + YQPkgListItem * item = dynamic_cast (listViewItem); + + if ( item ) + { + item->setInstallSourceRpm( installSourceRpm ); + + if ( selectNextItem && item->nextSibling() ) + { + item->setSelected( false ); // doesn't emit signals + setSelected( item->nextSibling(), true ); // emits signals + } + } +} + + +void +YQPkgList::setInstallListSourceRpms( bool installSourceRpm ) +{ + if ( ! _editable ) + return; + + QListViewItem * listViewItem = firstChild(); + + while ( listViewItem ) + { + YQPkgListItem * item = dynamic_cast (listViewItem); + + if ( item && item->editable() ) + { + item->setInstallSourceRpm( installSourceRpm ); + } + + listViewItem = listViewItem->nextSibling(); + } +} + + + +void +YQPkgList::createNotInstalledContextMenu() +{ + _notInstalledContextMenu = new QPopupMenu( this ); + CHECK_PTR( _notInstalledContextMenu ); + + actionSetCurrentInstall->addTo( _notInstalledContextMenu ); + actionSetCurrentDontInstall->addTo( _notInstalledContextMenu ); + actionSetCurrentTaboo->addTo( _notInstalledContextMenu ); + + addAllInListSubMenu( _notInstalledContextMenu ); + + + _notInstalledContextMenu->insertSeparator(); + _notInstalledContextMenu->insertItem( _( "Export This List to &Text File..." ), + this, SLOT( askExportList() ) ); +} + + +void +YQPkgList::createInstalledContextMenu() +{ + _installedContextMenu = new QPopupMenu( this ); + CHECK_PTR( _installedContextMenu ); + + actionSetCurrentKeepInstalled->addTo( _installedContextMenu ); + actionSetCurrentDelete->addTo( _installedContextMenu ); + actionSetCurrentUpdate->addTo( _installedContextMenu ); + actionSetCurrentProtected->addTo( _installedContextMenu ); + + addAllInListSubMenu( _installedContextMenu ); + + _installedContextMenu->insertSeparator(); + _installedContextMenu->insertItem( _( "Export This List to &Text File..." ), + this, SLOT( askExportList() ) ); +} + + +QPopupMenu * +YQPkgList::addAllInListSubMenu( QPopupMenu * menu ) +{ + QPopupMenu * submenu = new QPopupMenu( menu ); + CHECK_PTR( submenu ); + + actionSetListInstall->addTo( submenu ); + actionSetListDontInstall->addTo( submenu ); + actionSetListKeepInstalled->addTo( submenu ); + actionSetListDelete->addTo( submenu ); + actionSetListUpdate->addTo( submenu ); + actionSetListUpdateForce->addTo( submenu ); + actionSetListTaboo->addTo( submenu ); + actionSetListProtected->addTo( submenu ); + + menu->insertItem( _( "&All in This List" ), submenu ); + + return submenu; +} + + +void +YQPkgList::createActions() +{ + actionInstallSourceRpm = createAction( _( "&Install Source" ), + statusIcon( S_Install, true ), + statusIcon( S_Install, false ) ); + + actionDontInstallSourceRpm = createAction( _( "Do &Not Install Source" ), + statusIcon( S_NoInst, true ), + statusIcon( S_NoInst, false ) ); + + actionInstallListSourceRpms = createAction( _( "&Install All Available Sources" ), + statusIcon( S_Install, true ), + statusIcon( S_Install, false ), + QString::null, // key + true ); // enabled + + actionDontInstallListSourceRpms = createAction( _( "Do &Not Install Any Sources" ), + statusIcon( S_NoInst, true ), + statusIcon( S_NoInst, false ), + QString::null, // key + true ); // enabled + + connect( actionInstallSourceRpm, SIGNAL( activated() ), this, SLOT( setInstallCurrentSourceRpm() ) ); + connect( actionDontInstallSourceRpm, SIGNAL( activated() ), this, SLOT( setDontInstallCurrentSourceRpm() ) ); + + connect( actionInstallListSourceRpms, SIGNAL( activated() ), this, SLOT( setInstallListSourceRpms() ) ); + connect( actionDontInstallListSourceRpms, SIGNAL( activated() ), this, SLOT( setDontInstallListSourceRpms() ) ); +} + + +void +YQPkgList::updateActions( YQPkgObjListItem * pkgObjListItem ) +{ + YQPkgObjList::updateActions( pkgObjListItem ); + + YQPkgListItem * item = dynamic_cast (pkgObjListItem); + + if ( item ) + { + actionInstallSourceRpm->setEnabled( item->hasSourceRpm() ); + actionDontInstallSourceRpm->setEnabled( item->hasSourceRpm() ); + } + else + { + actionInstallSourceRpm->setEnabled( false ); + actionDontInstallSourceRpm->setEnabled( false ); + } +} + + +void +YQPkgList::askExportList() const +{ + QString filename = YQUI::ui()->askForSaveFileName( "pkglist.txt", // startsWith + "*.txt", // filter + _( "Export Package List" ) ); + if ( ! filename.isEmpty() ) + exportList( filename, true ); +} + + +void +YQPkgList::exportList( const QString filename, bool interactive ) const +{ + // Open file + + FILE * file = fopen( (const char *) filename, "w" ); + + if ( ! file ) + { + y2error( "Can't open file %s", (const char *) filename ); + + if ( interactive ) + { + // Post error popup. + + QMessageBox::warning( 0, // parent + _( "Error" ), // caption + _( "Cannot open file %1" ).arg( filename ), + QMessageBox::Ok | QMessageBox::Default, // button0 + QMessageBox::NoButton, // button1 + QMessageBox::NoButton ); // button2 + } + return; + } + + + // + // Write header + // + + // Format the header line with QString::sprintf() because plain stdio + // fprintf() is not UTF-8 aware - it will count multi-byte characters + // wrong, so the formatting will be broken. + + QString header; + header.sprintf( "# %-18s %-30s | %10s | %-16s | %-16s\n\n", + (const char *) _( "Status" ).utf8(), + (const char *) _( "Package" ).utf8(), + (const char *) _( "Size" ).utf8(), + (const char *) _( "Avail. Ver." ).utf8(), + (const char *) _( "Inst. Ver." ).utf8() + ); + fputs( (const char *) header.utf8(), file ); + + + // + // Write all items + // + + const QListViewItem * item = firstChild(); + + while ( item ) + { + const YQPkgListItem * pkg = dynamic_cast (item); + + if ( pkg ) + { + QString candVersion = pkg->text( versionCol() ); + QString instVersion = pkg->text( instVersionCol() ); + + if ( candVersion.isEmpty() ) candVersion = "---"; + if ( instVersion.isEmpty() ) instVersion = "---"; + + QString status = "[" + statusText( pkg->status() ) + "]"; + fprintf( file, "%-20s %-30s | %10s | %-16s | %-16s\n", + (const char *) status.utf8(), + (const char *) pkg->text( nameCol() ), + (const char *) pkg->text( sizeCol() ), + (const char *) candVersion, + (const char *) instVersion + ); + } + + item = item->nextSibling(); + } + + + // Clean up + + if ( file ) + fclose( file ); +} + + +int +YQPkgList::globalSetPkgStatus( ZyppStatus newStatus, bool force, bool countOnly ) +{ + YQUI::ui()->busyCursor(); + int changedCount = 0; + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppSel selectable = *it; + ZyppStatus oldStatus = selectable->status(); + + if ( newStatus != oldStatus ) + { + bool doChange = false; + + switch ( newStatus ) + { + case S_KeepInstalled: + case S_Del: + case S_AutoDel: + case S_Protected: + doChange = selectable->hasInstalledObj(); + break; + + case S_Update: + case S_AutoUpdate: + + if ( force ) + { + doChange = selectable->hasInstalledObj(); + } + else // don't force - update only if useful (if candidate is newer) + { + const ZyppObj candidate = selectable->candidateObj(); + const ZyppObj installed = selectable->installedObj(); + + if ( candidate && installed ) + { + doChange = ( installed->edition() < candidate->edition() ); + } + } + break; + + case S_Install: + case S_AutoInstall: + case S_NoInst: + case S_Taboo: + doChange = ! selectable->hasInstalledObj(); + break; + } + + if ( doChange ) + { + if ( ! countOnly ) + selectable->set_status( newStatus ); + + changedCount++; + // y2milestone( "Updating %s", selectable->name().c_str() ); + } + } + } + + if ( changedCount > 0 && ! countOnly ) + { + emit updateItemStates(); + emit updatePackages(); + emit statusChanged(); + } + + YQUI::ui()->normalCursor(); + + return changedCount; +} + + + + + + +YQPkgListItem::YQPkgListItem( YQPkgList * pkgList, + ZyppSel selectable, + ZyppPkg zyppPkg ) + : YQPkgObjListItem( pkgList, selectable, zyppPkg ) + , _pkgList( pkgList ) + , _zyppPkg( zyppPkg ) + , _dimmed( false ) +{ + if ( ! _zyppPkg ) + _zyppPkg = tryCastToZyppPkg( selectable->theObj() ); + + setSourceRpmIcon(); +} + + +YQPkgListItem::~YQPkgListItem() +{ + // NOP +} + + +void +YQPkgListItem::updateData() +{ + YQPkgObjListItem::updateData(); + setSourceRpmIcon(); +} + + +bool +YQPkgListItem::hasSourceRpm() const +{ + if ( ! selectable() ) + return false; + +#ifdef FIXME + return selectable()->providesSources(); +#else + return false; +#endif +} + + +bool +YQPkgListItem::installSourceRpm() const +{ + if ( ! selectable() ) + return false; + +#ifdef FIXME + if ( ! selectable()->providesSources() ) + return false; + + return selectable()->source_install(); +#else + return false; +#endif +} + + +void +YQPkgListItem::setSourceRpmIcon() +{ + if ( srpmStatusCol() < 0 ) + return; + + QPixmap icon; + + if ( hasSourceRpm() ) + { + + if ( editable() && _pkgObjList->editable() ) + { + icon = installSourceRpm() ? + YQIconPool::pkgInstall() : + YQIconPool::pkgNoInst(); + } + else + { + icon = installSourceRpm() ? + YQIconPool::disabledPkgInstall() : + YQIconPool::disabledPkgNoInst(); + } + } + + setPixmap( srpmStatusCol(), icon ); +} + + +void +YQPkgListItem::setInstallSourceRpm( bool installSourceRpm ) +{ + if ( hasSourceRpm() ) + { +#ifdef FIXME + if ( selectable() ) + selectable()->set_source_install( installSourceRpm ); +#endif + } + + setSourceRpmIcon(); +} + + +void +YQPkgListItem::toggleSourceRpmStatus() +{ + setInstallSourceRpm( ! installSourceRpm() ); +} + + +QString +YQPkgListItem::toolTip( int col ) +{ + QString text; + QString name = _zyppObj->name().c_str(); + + if ( col == statusCol() ) + { + text = YQPkgObjListItem::toolTip( col ); + } + else if ( col == srpmStatusCol() ) + { + text = name + "\n\n"; + + if ( hasSourceRpm() ) + { + text += installSourceRpm() ? + _( "Install Sources" ) : + _( "Do Not Install Sources" ); + } + else + { + text += _( "No Sources Available" ); + } + } + else + { + text = name + "\n\n"; + + QString installed; + QString candidate; + + if ( selectable()->hasInstalledObj() ) + { + installed = selectable()->installedObj()->edition().asString().c_str(); + installed += "-"; + installed += selectable()->installedObj()->arch().asString().c_str(); + installed = _( "Installed Version: %1" ).arg( installed ); + } + + if ( selectable()->hasCandidateObj() ) + { + candidate = selectable()->candidateObj()->edition().asString().c_str(); + candidate += "-"; + candidate += selectable()->candidateObj()->arch().asString().c_str(); + } + + if ( selectable()->hasInstalledObj() ) + { + text += installed + "\n"; + + if ( selectable()->hasCandidateObj() ) + { + // Translators: This is the relation between two versions of one package + // if both versions are the same, e.g., both "1.2.3-42", "1.2.3-42" + QString relation = _( "same" ); + + if ( _candidateIsNewer ) relation = _( "newer" ); + if ( _installedIsNewer ) relation = _( "older" ); + + // Translators: %1 is the version, %2 is one of "newer", "older", "same" + text += _( "Available Version: %1 (%2)" ).arg( candidate ).arg( relation ); + } + else + { + text += _( "Not available for installation" ); + } + } + else // not installed + { + text += candidate; + } + } + + return text; +} + + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + if ( col == srpmStatusCol() ) + { + YQPkgListItem * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + int thisPoints = ( this->hasSourceRpm() ? 1 : 0 ) + ( this->installSourceRpm() ? 1 : 0 ); + int otherPoints = ( other->hasSourceRpm() ? 1 : 0 ) + ( other->installSourceRpm() ? 1 : 0 ); + + // Intentionally inverting order: Pkgs with source RPMs are more interesting than without. + if ( thisPoints > otherPoints ) return -1; + if ( thisPoints < otherPoints ) return 1; + return 0; + } + } + + // Fallback: Use parent class method + return YQPkgObjListItem::compare( otherListViewItem, col, ascending ); +} + + +void +YQPkgListItem::paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ) +{ + if ( isDimmed() && ! YQUI::ui()->usingVisionImpairedPalette() ) + { + QColorGroup cg = colorGroup; + cg.setColor( QColorGroup::Text, QColor( 0xA0, 0xA0, 0xA0 ) ); + + QListViewItem::paintCell( painter, cg, column, width, alignment ); + } + else + { + if ( installedIsNewer() ) + { + QColorGroup cg = colorGroup; + + if ( ! YQUI::ui()->usingVisionImpairedPalette() ) + { + if ( column == instVersionCol() ) + cg.setColor( QColorGroup::Base, QColor( 0xFF, 0x30, 0x30 ) ); // Background + else + cg.setColor( QColorGroup::Text, QColor( 0xFF, 0, 0 ) ); // Foreground + } + + QListViewItem::paintCell( painter, cg, column, width, alignment ); + } + else if ( candidateIsNewer() ) + { + QColorGroup cg = colorGroup; + + if ( ! YQUI::ui()->usingVisionImpairedPalette() ) + { + cg.setColor( QColorGroup::Text, QColor( 0, 0, 0xC0 ) ); // Foreground + + if ( column == versionCol() ) + cg.setColor( QColorGroup::Base, QColor( 0xF0, 0xF0, 0xF0 ) ); // Background + } + + QListViewItem::paintCell( painter, cg, column, width, alignment ); + } + else + { + QListViewItem::paintCell( painter, colorGroup, column, width, alignment ); + } + } +} + + + +#include "YQPkgList.moc" diff --git a/src/pkg/YQPkgList.h b/src/pkg/YQPkgList.h new file mode 100644 index 0000000..926b9b2 --- /dev/null +++ b/src/pkg/YQPkgList.h @@ -0,0 +1,335 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgList_h +#define YQPkgList_h + +#include + +class YQPkgListItem; + + +/** + * @short Display a list of zypp::Package objects. + **/ +class YQPkgList : public YQPkgObjList +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgList( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgList(); + + + // Column numbers + + int srpmStatusCol() const { return _srpmStatusCol; } + + /** + * Save the pkg list to a file. + * + * Posts error popups if 'interactive' is 'true' ( only log entries + * otherwise ). + **/ + void exportList( const QString filename, bool interactive ) const; + + /** + * Add a submenu "All in this list..." to 'menu'. + * Returns the newly created submenu. + * + * Reimplemented from YQPkgObjList. + **/ + virtual QPopupMenu * addAllInListSubMenu( QPopupMenu * menu ); + + /** + * Returns 'true' if there are any installed packages. + **/ + static bool haveInstalledPkgs(); + + /** + * Set the status of all packages in the pool to a new value. + * This is not restricted to the current content of this package list. + * All selectables in the ZYPP pool are affected. + * + * 'force' indicates if it should be done even if it is not very useful, + * e.g., if packages should be updated even if there is no newer version. + * + * If 'countOnly' is 'true', the status is not actually changed, only the + * number of packages that would be affected is return. + * + * Return value: The number of status changes + **/ + int globalSetPkgStatus( ZyppStatus newStatus, bool force, bool countOnly ); + + +public slots: + + /** + * Add a pkg to the list. Connect a filter's filterMatch() signal to this + * slot. Remember to connect filterStart() to clear() (inherited from + * QListView). + **/ + void addPkgItem ( ZyppSel selectable, + ZyppPkg zyppPkg ); + + /** + * Add a pkg to the list, but display it dimmed (grey text foreground + * rather than normal black). + **/ + void addPkgItemDimmed( ZyppSel selectable, + ZyppPkg zyppPkg ); + + /** + * Add a pkg to the list + **/ + void addPkgItem ( ZyppSel selectable, + ZyppPkg zyppPkg, + bool dimmed ); + + + /** + * Dispatcher slot for mouse click: Take care of source RPM status. + * Let the parent class handle the normal status. + * Reimplemented from YQPkgObjList. + **/ + virtual void pkgObjClicked( int button, + QListViewItem * item, + int col, + const QPoint & pos ); + + /** + * Update the internal actions: What actions are available for 'item'? + * + * Reimplemented from YQPkgObjList + **/ + virtual void updateActions( YQPkgObjListItem * item ); + + /** + * Reimplemented from QListView / QWidget: + * Reserve a reasonable amount of space. + **/ + virtual QSize sizeHint() const; + + /** + * Ask for a file name and save the current pkg list to file. + **/ + void askExportList() const; + + + // Direct access to some states for menu actions + + void setInstallCurrentSourceRpm() { setInstallCurrentSourceRpm( true ); } + void setDontInstallCurrentSourceRpm() { setInstallCurrentSourceRpm( false ); } + + void setInstallListSourceRpms() { setInstallListSourceRpms( true ); } + void setDontInstallListSourceRpms() { setInstallListSourceRpms( false ); } + + + // No separate selectionChanged( ZyppPkg ) signal: + // Use YQPkgObjList::selectionChanged( ZyppObj ) instead + // and dynamic_cast to ZyppPkg if required. + // This saves duplicating a lot of code. + + +protected: + + /** + * Create ( additional ) actions for the context menus. + **/ + void createActions(); + + /** + * Create the context menu for items that are not installed. + * + * Reimplemented from YQPkgObjList. + **/ + virtual void createNotInstalledContextMenu(); + + /** + * Create the context menu for installed items. + * + * Reimplemented from YQPkgObjList. + **/ + virtual void createInstalledContextMenu(); + + /** + * Create context menu for source RPMs. + **/ + void createSourceRpmContextMenu(); + + /** + * Sets the currently selected item's source RPM status. + * Automatically selects the next item if 'selectNextItem' is 'true'. + **/ + void setInstallCurrentSourceRpm( bool inst, bool selectNextItem = false ); + + /** + * Sets the source RPM status of all items in this list. + **/ + void setInstallListSourceRpms( bool inst ); + + + // Data members + + int _srpmStatusCol; + QPopupMenu * _sourceRpmContextMenu; + + +public: + + QAction * actionInstallSourceRpm; + QAction * actionDontInstallSourceRpm; + QAction * actionInstallListSourceRpms; + QAction * actionDontInstallListSourceRpms; +}; + + + +class YQPkgListItem: public YQPkgObjListItem +{ +public: + + /** + * Constructor. Creates a YQPkgList item that corresponds to the package + * manager object that 'pkg' refers to. + **/ + YQPkgListItem( YQPkgList * pkgList, + ZyppSel selectable, + ZyppPkg zyppPkg ); + + /** + * Destructor + **/ + virtual ~YQPkgListItem(); + + /** + * Returns the parent package list. + **/ + YQPkgList * pkgList() { return _pkgList; } + + /** + * Returns the original object within the package manager backend. + **/ + ZyppPkg zyppPkg() const { return _zyppPkg; } + + /** + * Returns the source RPM package status: + * Should the source RPM be installed? + **/ + bool installSourceRpm() const; + + /** + * Set the source RPM status + **/ + void setInstallSourceRpm( bool installSourceRpm ); + + /** + * Cycle the source package status to the next valid value. + **/ + void toggleSourceRpmStatus(); + + /** + * Returns whether or not a source RPM is available for this package. + **/ + bool hasSourceRpm() const; + + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + + /** + * Update this item's data completely. + * Triggered by QY2ListView::updateAllItemData(). + * + * Reimplemented from YQPkgObjList. + **/ + virtual void updateData(); + + /** + * Returns a tool tip text for a specific column of this item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * Reimplemented from YQPkgObjList. + **/ + virtual QString toolTip( int column ); + + /** + * Returns true if this package is to be displayed dimmed, + * i.e. with grey text foreground rather than the normal black. + **/ + bool isDimmed() const { return _dimmed; } + + /** + * Set the 'dimmed' flag. + **/ + void setDimmed( bool d = true ) { _dimmed = d; } + + + // Columns + + int srpmStatusCol() const { return _pkgList->srpmStatusCol(); } + + +protected: + + /** + * Set the suitable icon for the source RPM status. + **/ + void setSourceRpmIcon(); + + /** + * Paint method. Reimplemented from @ref QListViewItem so different + * colors can be used. + * + * Reimplemented from QListViewItem. + **/ + virtual void paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + // Data members + + YQPkgList * _pkgList; + ZyppPkg _zyppPkg; + bool _dimmed; +}; + + +#endif // ifndef YQPkgList_h diff --git a/src/pkg/YQPkgObjList.cc b/src/pkg/YQPkgObjList.cc new file mode 100644 index 0000000..b31d6df --- /dev/null +++ b/src/pkg/YQPkgObjList.cc @@ -0,0 +1,1565 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgObjList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define y2log_component "qt-pkg" +#include +#include +#include +#include +#include + +#include "utf8.h" + +#include "YQPkgObjList.h" +#include "YQPkgTextDialog.h" +#include "YQi18n.h" +#include "YQIconPool.h" +#include "YQUI.h" + +using std::list; +using std::string; + + +#define VERBOSE_EXCLUDE_RULES 0 +#define EXTRA_SOLVE_COLLECTIONS 0 + + +YQPkgObjList::YQPkgObjList( QWidget * parent ) + : QY2ListView( parent ) + , _editable( true ) + , _installedContextMenu(0) + , _notInstalledContextMenu(0) +{ + // This class does not add any columns. This is the main reason why this is + // an abstract base class: It doesn't know which columns are desired and in + // what order. + + _statusCol = -42; + _nameCol = -42; + _versionCol = -42; + _instVersionCol = -42; + _summaryCol = -42; + _sizeCol = -42; + _brokenIconCol = -42; + _satisfiedIconCol = -42; + _debug = false; + + _excludedItems = new YQPkgObjList::ExcludedItems( this ); + + createActions(); + + connect( this, SIGNAL( columnClicked ( int, QListViewItem *, int, const QPoint & ) ), + this, SLOT ( pkgObjClicked ( int, QListViewItem *, int, const QPoint & ) ) ); + + connect( this, SIGNAL( columnDoubleClicked ( int, QListViewItem *, int, const QPoint & ) ), + this, SLOT ( pkgObjClicked ( int, QListViewItem *, int, const QPoint & ) ) ); + + connect( this, SIGNAL( selectionChanged ( QListViewItem * ) ), + this, SLOT ( selectionChangedInternal( QListViewItem * ) ) ); +} + + +YQPkgObjList::~YQPkgObjList() +{ + if ( _excludedItems ) + delete _excludedItems; +} + + +void +YQPkgObjList::addPkgObjItem( ZyppSel selectable, ZyppObj zyppObj ) +{ + if ( ! selectable ) + { + y2error( "Null zypp::ui::Selectable!" ); + return; + } + + YQPkgObjListItem * item = new YQPkgObjListItem( this, selectable, zyppObj ); + applyExcludeRules( item ); +} + + +void +YQPkgObjList::addPassiveItem( const QString & name, + const QString & summary, + FSize size ) +{ + QY2ListViewItem * item = new QY2ListViewItem( this, QString::null ); + + if ( item ) + { + if ( nameCol() >= 0 && ! name.isEmpty() ) item->setText( nameCol(), name ); + if ( summaryCol() >= 0 && ! summary.isEmpty() ) item->setText( summaryCol(), summary ); + if ( sizeCol() >= 0 && size > 0L ) + { + QString sizeStr = size.form().c_str(); + sizeStr += " "; + item->setText( sizeCol(), sizeStr ); + } + } +} + + +void +YQPkgObjList::pkgObjClicked( int button, + QListViewItem * listViewItem, + int col, + const QPoint & pos ) +{ + YQPkgObjListItem * item = dynamic_cast (listViewItem); + + if ( item ) + { + if ( button == Qt::LeftButton ) + { + if ( col == statusCol() ) + // || col == nameCol() ) + { + if ( editable() && item->editable() ) + item->cycleStatus(); + } + } + else if ( button == Qt::RightButton ) + { + if ( editable() && item->editable() ) + { + updateActions( item ); + + QPopupMenu * contextMenu = + item->selectable()->hasInstalledObj() ? + installedContextMenu() : notInstalledContextMenu(); + + if ( contextMenu ) + contextMenu->popup( pos ); + } + } + } +} + + +void +YQPkgObjList::selectionChangedInternal( QListViewItem * listViewItem ) +{ + YQPkgObjListItem * item = dynamic_cast (listViewItem); + + emit selectionChanged( item ? item->selectable() : ZyppSel() ); +} + + +void +YQPkgObjList::clear() +{ + emit selectionChanged( ZyppSel() ); + + _excludedItems->clear(); + QY2ListView::clear(); +} + + +QPixmap +YQPkgObjList::statusIcon( ZyppStatus status, bool enabled, bool bySelection ) +{ + QPixmap icon = YQIconPool::pkgNoInst(); + + if ( enabled ) + { + switch ( status ) + { + case S_Del: icon = YQIconPool::pkgDel(); break; + case S_Install: icon = YQIconPool::pkgInstall(); break; + case S_KeepInstalled: icon = YQIconPool::pkgKeepInstalled(); break; + case S_NoInst: icon = YQIconPool::pkgNoInst(); break; + case S_Protected: icon = YQIconPool::pkgProtected(); break; + case S_Taboo: icon = YQIconPool::pkgTaboo(); break; + case S_Update: icon = YQIconPool::pkgUpdate(); break; + + case S_AutoDel: icon = bySelection ? + YQIconPool::pkgSelAutoDel() : + YQIconPool::pkgAutoDel(); break; + + case S_AutoInstall: icon = bySelection ? + YQIconPool::pkgSelAutoInstall() : + YQIconPool::pkgAutoInstall(); break; + + case S_AutoUpdate: icon = bySelection ? + YQIconPool::pkgSelAutoUpdate() : + YQIconPool::pkgAutoUpdate(); break; + + + // Intentionally omitting 'default' branch so the compiler can + // catch unhandled enum states + } + } + else + { + switch ( status ) + { + case S_Del: icon = YQIconPool::disabledPkgDel(); break; + case S_Install: icon = YQIconPool::disabledPkgInstall(); break; + case S_KeepInstalled: icon = YQIconPool::disabledPkgKeepInstalled(); break; + case S_NoInst: icon = YQIconPool::disabledPkgNoInst(); break; + case S_Protected: icon = YQIconPool::disabledPkgProtected(); break; + case S_Taboo: icon = YQIconPool::disabledPkgTaboo(); break; + case S_Update: icon = YQIconPool::disabledPkgUpdate(); break; + + case S_AutoDel: icon = bySelection ? + YQIconPool::disabledPkgSelAutoDel() : + YQIconPool::disabledPkgAutoDel(); break; + + case S_AutoInstall: icon = bySelection ? + YQIconPool::disabledPkgSelAutoInstall() : + YQIconPool::disabledPkgAutoInstall(); break; + + case S_AutoUpdate: icon = bySelection ? + YQIconPool::disabledPkgSelAutoUpdate() : + YQIconPool::disabledPkgAutoUpdate(); break; + + // Intentionally omitting 'default' branch so the compiler can + // catch unhandled enum states + } + } + + return icon; +} + + +QString +YQPkgObjList::statusText( ZyppStatus status ) const +{ + switch ( status ) + { + case S_AutoDel: return _( "Autodelete" ); + case S_AutoInstall: return _( "Autoinstall" ); + case S_AutoUpdate: return _( "Autoupdate" ); + case S_Del: return _( "Delete" ); + case S_Install: return _( "Install" ); + case S_KeepInstalled: return _( "Keep" ); + case S_NoInst: return _( "Do Not Install" ); + case S_Protected: return _( "Protected -- Do Not Modify" ); + case S_Taboo: return _( "Taboo -- Never Install" ); + case S_Update: return _( "Update" ); + } + + return QString::null; +} + + +void +YQPkgObjList::setCurrentStatus( ZyppStatus newStatus, bool doSelectNextItem ) +{ + QListViewItem * listViewItem = selectedItem(); + + if ( ! listViewItem ) + return; + + YQPkgObjListItem * item = dynamic_cast (listViewItem); + + if ( item && item->editable() && _editable ) + { + if ( newStatus != item->status() ) + { + item->setStatus( newStatus ); + + if ( item->showLicenseAgreement() ) + { + item->showNotifyTexts( newStatus ); + } + else // License not confirmed? + { + // Status is now S_Taboo or S_Del - update status icon + item->setStatusIcon(); + } + + emit statusChanged(); + } + } + + if ( doSelectNextItem ) + selectNextItem(); +} + + +void +YQPkgObjList::setAllItemStatus( ZyppStatus newStatus, bool force ) +{ + if ( ! _editable ) + return; + + YQUI::ui()->busyCursor(); + QListViewItemIterator it( this ); + + while ( *it ) + { + YQPkgObjListItem * item = dynamic_cast (*it); + + if ( item && item->editable() && newStatus != item->status() ) + { + if ( newStatus == S_Update ) + { + if ( item->candidateIsNewer() || force ) + item->setStatus( newStatus, + false ); // sendSignals + } + else + { + item->setStatus( newStatus, + false ); // sendSignals + } + } + + ++it; + } + + emit updateItemStates(); + emit updatePackages(); + + YQUI::ui()->normalCursor(); + emit statusChanged(); +} + + +void +YQPkgObjList::selectNextItem() +{ + QListViewItem * item = selectedItem(); + + if ( item && item->nextSibling() ) + { + item->setSelected( false ); // Doesn't emit signals + ensureItemVisible( item->nextSibling() ); // Scroll if necessary + setSelected( item->nextSibling(), true ); // Emits signals + } +} + + +void +YQPkgObjList::createActions() +{ + actionSetCurrentInstall = createAction( S_Install, "[+]" ); + actionSetCurrentDontInstall = createAction( S_NoInst, "[-]" ); + actionSetCurrentKeepInstalled = createAction( S_KeepInstalled, "[<], [-]" ); + actionSetCurrentDelete = createAction( S_Del, "[-]" ); + actionSetCurrentUpdate = createAction( S_Update, "[>], [+]" ); + actionSetCurrentTaboo = createAction( S_Taboo, "[!]" ); + actionSetCurrentProtected = createAction( S_Protected, "[*]" ); + + actionSetListInstall = createAction( S_Install, "", true ); + actionSetListDontInstall = createAction( S_NoInst, "", true ); + actionSetListKeepInstalled = createAction( S_KeepInstalled, "", true ); + actionSetListDelete = createAction( S_Del, "", true ); + actionSetListProtected = createAction( S_Protected, "", true ); + + actionSetListUpdate = createAction( _( "Update if newer version available" ), + statusIcon( S_Update, true ), + statusIcon( S_Update, false ), + "", + true ); + + actionSetListUpdateForce = createAction( _( "Update unconditionally" ), + statusIcon( S_Update, true ), + statusIcon( S_Update, false ), + "", + true ); + + actionSetListTaboo = createAction( S_Taboo, "", true ); + + connect( actionSetCurrentInstall, SIGNAL( activated() ), this, SLOT( setCurrentInstall() ) ); + connect( actionSetCurrentDontInstall, SIGNAL( activated() ), this, SLOT( setCurrentDontInstall() ) ); + connect( actionSetCurrentKeepInstalled, SIGNAL( activated() ), this, SLOT( setCurrentKeepInstalled() ) ); + connect( actionSetCurrentDelete, SIGNAL( activated() ), this, SLOT( setCurrentDelete() ) ); + connect( actionSetCurrentUpdate, SIGNAL( activated() ), this, SLOT( setCurrentUpdate() ) ); + connect( actionSetCurrentTaboo, SIGNAL( activated() ), this, SLOT( setCurrentTaboo() ) ); + connect( actionSetCurrentProtected, SIGNAL( activated() ), this, SLOT( setCurrentProtected() ) ); + + connect( actionSetListInstall, SIGNAL( activated() ), this, SLOT( setListInstall() ) ); + connect( actionSetListDontInstall, SIGNAL( activated() ), this, SLOT( setListDontInstall() ) ); + connect( actionSetListKeepInstalled, SIGNAL( activated() ), this, SLOT( setListKeepInstalled() ) ); + connect( actionSetListDelete, SIGNAL( activated() ), this, SLOT( setListDelete() ) ); + connect( actionSetListUpdate, SIGNAL( activated() ), this, SLOT( setListUpdate() ) ); + connect( actionSetListUpdateForce, SIGNAL( activated() ), this, SLOT( setListUpdateForce() ) ); + connect( actionSetListTaboo, SIGNAL( activated() ), this, SLOT( setListTaboo() ) ); + connect( actionSetListProtected, SIGNAL( activated() ), this, SLOT( setListProtected() ) ); +} + + + +QAction * +YQPkgObjList::createAction( ZyppStatus status, const QString & key, bool enabled ) +{ + return createAction( statusText( status ), + statusIcon( status, true ), + statusIcon( status, false ), + key, + enabled ); +} + + +QAction * +YQPkgObjList::createAction( const QString & text, + const QPixmap & icon, + const QPixmap & insensitiveIcon, + const QString & key, + bool enabled ) +{ + QString label = text; + + if ( ! key.isEmpty() ) + label += "\t" + key; + + + QIconSet iconSet ( icon ); + + if ( ! insensitiveIcon.isNull() ) + { + iconSet.setPixmap( insensitiveIcon, + QIconSet::Automatic, + QIconSet::Disabled ); + } + + QAction * action = new QAction( label, // text + iconSet, // icon set + label, // menu text + 0, // accel key + this ); // parent + CHECK_PTR( action ); + action->setEnabled( enabled ); + + return action; +} + + +void +YQPkgObjList::createNotInstalledContextMenu() +{ + _notInstalledContextMenu = new QPopupMenu( this ); + CHECK_PTR( _notInstalledContextMenu ); + + actionSetCurrentInstall->addTo( _notInstalledContextMenu ); + actionSetCurrentDontInstall->addTo( _notInstalledContextMenu ); + actionSetCurrentTaboo->addTo( _notInstalledContextMenu ); + + addAllInListSubMenu( _notInstalledContextMenu ); +} + + +void +YQPkgObjList::createInstalledContextMenu() +{ + _installedContextMenu = new QPopupMenu( this ); + CHECK_PTR( _installedContextMenu ); + + actionSetCurrentKeepInstalled->addTo( _installedContextMenu ); + actionSetCurrentDelete->addTo( _installedContextMenu ); + actionSetCurrentUpdate->addTo( _installedContextMenu ); + + addAllInListSubMenu( _installedContextMenu ); +} + + +QPopupMenu * +YQPkgObjList::addAllInListSubMenu( QPopupMenu * menu ) +{ + QPopupMenu * submenu = new QPopupMenu( menu ); + CHECK_PTR( submenu ); + + actionSetListInstall->addTo( submenu ); + actionSetListDontInstall->addTo( submenu ); + actionSetListKeepInstalled->addTo( submenu ); + actionSetListDelete->addTo( submenu ); + actionSetListUpdate->addTo( submenu ); + actionSetListUpdateForce->addTo( submenu ); + actionSetListTaboo->addTo( submenu ); + + menu->insertItem( _( "&All in This List" ), submenu ); + + return submenu; +} + + +QPopupMenu * +YQPkgObjList::notInstalledContextMenu() +{ + if ( ! _notInstalledContextMenu ) + createNotInstalledContextMenu(); + + return _notInstalledContextMenu; +} + + +QPopupMenu * +YQPkgObjList::installedContextMenu() +{ + if ( ! _installedContextMenu ) + createInstalledContextMenu(); + + return _installedContextMenu; +} + + +void +YQPkgObjList::updateActions() +{ + updateActions( dynamic_cast ( selectedItem() ) ); +} + + +void +YQPkgObjList::updateActions( YQPkgObjListItem * item ) +{ + if ( item ) + { + ZyppSel selectable = item->selectable(); + + if ( selectable->hasInstalledObj() ) + { + actionSetCurrentInstall->setEnabled( false ); + actionSetCurrentDontInstall->setEnabled( false ); + actionSetCurrentTaboo->setEnabled( false ); + actionSetCurrentProtected->setEnabled( true ); + + actionSetCurrentKeepInstalled->setEnabled( true ); + actionSetCurrentDelete->setEnabled( true ); + actionSetCurrentUpdate->setEnabled( selectable->hasCandidateObj() ); + } + else + { + actionSetCurrentInstall->setEnabled( selectable->hasCandidateObj() ); + actionSetCurrentDontInstall->setEnabled( true ); + actionSetCurrentTaboo->setEnabled( true ); + actionSetCurrentProtected->setEnabled( false ); + + actionSetCurrentKeepInstalled->setEnabled( false ); + actionSetCurrentDelete->setEnabled( false ); + actionSetCurrentUpdate->setEnabled( false ); + } + } + else // ! item + { + actionSetCurrentInstall->setEnabled( false ); + actionSetCurrentDontInstall->setEnabled( false ); + actionSetCurrentTaboo->setEnabled( false ); + + actionSetCurrentKeepInstalled->setEnabled( false ); + actionSetCurrentDelete->setEnabled( false ); + actionSetCurrentUpdate->setEnabled( false ); + actionSetCurrentProtected->setEnabled( false ); + } +} + + +void +YQPkgObjList::keyPressEvent( QKeyEvent * event ) +{ + if ( event ) + { + unsigned special_combo = ( Qt::ControlButton | Qt::ShiftButton | Qt::AltButton ); + + if ( ( event->state() & special_combo ) == special_combo ) + { + if ( event->key() == Qt::Key_Q ) + { + _debug= ! _debug; + y2milestone( "Debug mode %s", _debug ? "on" : "off" ); + } + + } + + QListViewItem * selectedListViewItem = selectedItem(); + + if ( selectedListViewItem ) + { + YQPkgObjListItem * item = dynamic_cast (selectedListViewItem); + + if ( item ) + { + bool installed = item->selectable()->hasInstalledObj(); + ZyppStatus status = item->status(); + + switch( event->ascii() ) + { + case Qt::Key_Space: // Cycle + item->cycleStatus(); + event->accept(); + return; + + case '+': // Grab everything - install or update + + if ( installed ) + { + ZyppStatus newStatus = S_KeepInstalled; + + if ( item->candidateIsNewer() ) + newStatus = S_Update; + + setCurrentStatus( newStatus ); + } + else + setCurrentStatus( S_Install ); + selectNextItem(); + event->accept(); + return; + + case '-': // Get rid of everything - don't install or delete + setCurrentStatus( installed ? S_Del : S_NoInst ); + selectNextItem(); + event->accept(); + return; + + case '!': // Taboo + + if ( ! installed ) + setCurrentStatus( S_Taboo ); + selectNextItem(); + event->accept(); + return; + + case '*': // Protected + + if ( installed ) + setCurrentStatus( S_Protected ); + selectNextItem(); + event->accept(); + return; + + case '>': // Update what is worth to be updated + + if ( installed && item->candidateIsNewer() ) + setCurrentStatus( S_Update ); + selectNextItem(); + event->accept(); + return; + + case '<': // Revert update + + if ( status == S_Update || + status == S_AutoUpdate ) + { + setCurrentStatus( S_KeepInstalled ); + } + selectNextItem(); + event->accept(); + return; + + case 'b': + case 'B': // Toggle debugIsBroken flag + + if ( _debug ) + { + item->toggleDebugIsBroken(); + item->setStatusIcon(); + } + event->accept(); + break; + + case 's': + case 'S': // Toggle debugIsSatisfied flag + + if ( _debug ) + { + item->toggleDebugIsSatisfied(); + item->setStatusIcon(); + } + event->accept(); + break; + } + } + } + } + + QListView::keyPressEvent( event ); +} + + +void +YQPkgObjList::message( const QString & text ) +{ + QY2ListViewItem * item = new QY2ListViewItem( this ); + CHECK_PTR( item ); + + item->setText( nameCol() >= 0 ? nameCol() : 0, text ); + item->setBackgroundColor( QColor( 0xE0, 0xE0, 0xF8 ) ); +} + + +void +YQPkgObjList::addExcludeRule( YQPkgObjList::ExcludeRule * rule ) +{ + _excludeRules.push_back( rule ); +} + + +void +YQPkgObjList::applyExcludeRules() +{ + // y2debug( "Applying exclude rules" ); + QListViewItemIterator listView_it( this ); + + while ( *listView_it ) + { + QListViewItem * current_item = *listView_it; + + // Advance iterator now so it remains valid even if there are changes + // to the QListView, e.g., if the current item is excluded and thus + // removed from the QListView + ++listView_it; + + applyExcludeRules( current_item ); + } + + ExcludedItems::iterator excluded_it = _excludedItems->begin(); + + while ( excluded_it != _excludedItems->end() ) + { + QListViewItem * current_item = (*excluded_it).first; + + // Advance iterator now so it remains valid even if there are changes + // to the excluded items, e.g., if the current item is un-excluded and thus + // removed from the excluded items + ++excluded_it; + + applyExcludeRules( current_item ); + } + + logExcludeStatistics(); +} + + +void +YQPkgObjList::logExcludeStatistics() +{ + if ( _excludedItems->size() > 0 ) + { + y2milestone( "%d packages excluded", _excludedItems->size() ); + + for ( ExcludeRuleList::iterator rule_it = _excludeRules.begin(); + rule_it != _excludeRules.end(); + ++rule_it ) + { + ExcludeRule * rule = *rule_it; + + if ( rule->isEnabled() ) + { + y2milestone( "Active exclude rule: \"%s\"", + rule->regexp().pattern().ascii() ); + } + } + } +} + + +void +YQPkgObjList::applyExcludeRules( QListViewItem * listViewItem ) +{ + YQPkgObjListItem * item = dynamic_cast( listViewItem ); + + if ( item ) + { + bool exclude = false; + ExcludeRule * matchingRule = 0; + + for ( ExcludeRuleList::iterator rule_it = _excludeRules.begin(); + rule_it != _excludeRules.end() && ! exclude; + ++rule_it ) + { + ExcludeRule * rule = *rule_it; + + if ( rule->match( item ) ) + { + exclude = true; + matchingRule = rule; + } + } + + if ( exclude != item->isExcluded() ) // change exclude status? + { + this->exclude( item, exclude ); + +#if VERBOSE_EXCLUDE_RULES + if ( exclude ) + { + y2debug( "Rule %s matches: Excluding %s", + matchingRule->regexp().pattern().ascii(), + item->zyppObj()->name().c_str() ); + } + else + { + y2debug( "Un-excluding %s", item->zyppObj()->name().c_str() ); + } +#endif + } + } +} + + +void +YQPkgObjList::exclude( YQPkgObjListItem * item, bool exclude ) +{ + if ( exclude == item->isExcluded() ) + return; + + item->setExcluded( exclude ); + + if ( exclude ) + { + QListViewItem * parentItem = item->parent(); + + if ( parentItem ) + parentItem->takeItem( item ); + else + QListView::takeItem( item ); + + _excludedItems->add( item, parentItem ); + } + else // un-exclude + { + if ( _excludedItems->contains( item ) ) + { + QListViewItem * oldParent = _excludedItems->oldParentItem( item ); + _excludedItems->remove( item ); + + if ( oldParent ) + oldParent->insertItem( item ); + else + QListView::insertItem( item ); + } + } +} + + + + +YQPkgObjListItem::YQPkgObjListItem( YQPkgObjList * pkgObjList, + ZyppSel selectable, + ZyppObj zyppObj ) + : QY2ListViewItem( pkgObjList ) + , _pkgObjList( pkgObjList ) + , _selectable( selectable ) + , _zyppObj( zyppObj ) + , _editable( true ) + , _excluded( false ) +{ + init(); +} + + +YQPkgObjListItem::YQPkgObjListItem( YQPkgObjList * pkgObjList, + QY2ListViewItem * parent, + ZyppSel selectable, + ZyppObj zyppObj ) + : QY2ListViewItem( parent ) + , _pkgObjList( pkgObjList ) + , _selectable( selectable ) + , _zyppObj( zyppObj ) + , _editable( true ) + , _excluded( false ) +{ + init(); +} + + +YQPkgObjListItem::~YQPkgObjListItem() +{ + // NOP +} + + +void +YQPkgObjListItem::init() +{ + if ( _zyppObj == 0 && _selectable ) + _zyppObj = _selectable->theObj(); + + _debugIsBroken = false; + _debugIsSatisfied = false; + _candidateIsNewer = false; + _installedIsNewer = false; + + const ZyppObj candidate = selectable()->candidateObj(); + const ZyppObj installed = selectable()->installedObj(); + + if ( candidate && installed ) + { + if ( candidate->edition() < installed->edition() ) + _installedIsNewer = true; + else if ( installed->edition() < candidate->edition() ) + _candidateIsNewer = true; + } + + if ( nameCol() >= 0 ) setText( nameCol(), zyppObj()->name() ); + if ( summaryCol() >= 0 ) setText( summaryCol(), zyppObj()->summary() ); + + if ( sizeCol() >= 0 ) + { + zypp::ByteCount size = zyppObj()->size(); + + if ( size > 0L ) + setText( sizeCol(), size.asString() + " " ); + } + + if ( instVersionCol() >= 0 ) + { + if ( selectable()->hasInstalledObj() ) + setText( instVersionCol(), installed->edition() ); + + if ( zyppObj() != selectable()->installedObj() && + zyppObj() != selectable()->candidateObj() ) + { + setText( versionCol(), zyppObj()->edition() ); + } + else if ( selectable()->hasCandidateObj() ) + { + setText( versionCol(), candidate->edition() ); + } + } + else + { + setText( versionCol(), zyppObj()->edition() ); + } + + setStatusIcon(); +} + + +void +YQPkgObjListItem::updateData() +{ + init(); +} + + +void +YQPkgObjListItem::setText( int column, const string text ) +{ + QListViewItem::setText( column, fromUTF8( text.c_str() ) ); +} + + +void +YQPkgObjListItem::setText( int column, const zypp::Edition & edition ) +{ + setText( column, edition.asString() ); +} + + +ZyppStatus +YQPkgObjListItem::status() const +{ + if ( ! selectable() ) + { + y2error( "No selectable" ); + return S_NoInst; + } + + return selectable()->status(); +} + + +bool +YQPkgObjListItem::bySelection() const +{ + zypp::ResStatus::TransactByValue modifiedBy = selectable()->modifiedBy(); + + return ( modifiedBy == zypp::ResStatus::APPL_LOW || + modifiedBy == zypp::ResStatus::APPL_HIGH ); +} + + +void +YQPkgObjListItem::setStatus( ZyppStatus newStatus, bool sendSignals ) +{ + ZyppStatus oldStatus = selectable()->status(); + selectable()->set_status( newStatus ); + + if ( oldStatus != selectable()->status() ) + { + applyChanges(); + + if ( sendSignals ) + { + _pkgObjList->updateItemStates(); + _pkgObjList->sendUpdatePackages(); + } + } + + setStatusIcon(); +} + + +void +YQPkgObjListItem::solveResolvableCollections() +{ +#if EXTRA_SOLVE_COLLECTIONS + zypp::Resolver_Ptr resolver = zypp::getZYpp()->resolver(); + + resolver->transactReset( zypp::ResStatus::APPL_LOW ); + + resolver->transactResKind( zypp::ResTraits::kind ); + resolver->transactResKind( zypp::ResTraits::kind ); + resolver->transactResKind( zypp::ResTraits::kind ); + resolver->transactResKind( zypp::ResTraits::kind ); + resolver->transactResKind( zypp::ResTraits::kind ); + resolver->transactResKind( zypp::ResTraits::kind ); +#endif +} + + + +void +YQPkgObjListItem::updateStatus() +{ + setStatusIcon(); +} + + +void +YQPkgObjListItem::setStatusIcon() +{ + if ( statusCol() >= 0 ) + { + bool enabled = editable() && _pkgObjList->editable(); + setPixmap( statusCol(), _pkgObjList->statusIcon( status(), enabled, bySelection() ) ); + } + + + if ( brokenIconCol() >= 0 ) + { + // Reset this icon now - it might be the same column as satisfiedIconCol() + setPixmap( brokenIconCol(), QPixmap() ); + } + + if ( satisfiedIconCol() >= 0 ) + { + // Set special icon for zyppObjs that are not marked as installed, + // but satisfied anyway (e.g. for patches or patterns where the user + // selected all required packages manually) + + setPixmap( satisfiedIconCol(), isSatisfied() ? YQIconPool::pkgSatisfied() : QPixmap() ); + } + + if ( brokenIconCol() >= 0 ) + { + // Set special icon for zyppObjs that are installed, but broken + // (dependencies no longer satisfied, e.g. for patches or patterns) + + if ( isBroken() ) + { + setPixmap( brokenIconCol(), YQIconPool::warningSign() ); + + y2warning( "Broken object: %s - %s", + _selectable->theObj()->name().c_str(), + _selectable->theObj()->summary().c_str() ); + } + } + +} + + +bool +YQPkgObjListItem::isSatisfied() const +{ + if ( _debugIsSatisfied ) + return true; + + if ( _selectable->hasInstalledObj() ) + return false; + + return _selectable->candidatePoolItem().status().isSatisfied(); +} + + +bool YQPkgObjListItem::isBroken() const +{ + if ( _debugIsBroken ) + return true; + + if ( ! _selectable->hasInstalledObj() ) + return false; // can't be broken if not installed + + switch ( status() ) + { + case S_KeepInstalled: + case S_Protected: + + return _selectable->installedPoolItem().status().isIncomplete(); + + case S_Update: // will be fixed by updating + case S_AutoUpdate: + case S_Del: // will no longer be relevant after deleting + case S_AutoDel: + + return false; + + case S_NoInst: // should not happen - no installed obj + case S_Install: + case S_AutoInstall: + case S_Taboo: + + y2error( "Expected uninstalled zyppObj" ); + return false; + } + + y2error( "Should never get here" ); + return false; +} + + +void +YQPkgObjListItem::cycleStatus() +{ + if ( ! _editable || ! _pkgObjList->editable() ) + return; + + ZyppStatus oldStatus = status(); + ZyppStatus newStatus = oldStatus; + + if ( selectable()->hasInstalledObj() ) + { + switch ( oldStatus ) + { + case S_Protected: + newStatus = selectable()->hasCandidateObj() ? + S_KeepInstalled: S_NoInst; + break; + + case S_KeepInstalled: + newStatus = selectable()->hasCandidateObj() ? + S_Update : S_Del; + break; + + case S_Update: + newStatus = S_Del; + break; + + case S_Del: + newStatus = S_KeepInstalled; + break; + + default: + newStatus = S_KeepInstalled; + break; + } + } + else // Pkg not installed + { + switch ( oldStatus ) + { + case S_NoInst: + if ( selectable()->hasCandidateObj() ) + { + newStatus = S_Install; + } + else + { + y2warning( "No candidate for %s", selectable()->theObj()->name().c_str() ); + newStatus = S_NoInst; + } + break; + + case S_AutoInstall: + newStatus = S_Taboo; + break; + + default: + newStatus = S_NoInst; + break; + } + } + + if ( oldStatus != newStatus ) + { + setStatus( newStatus ); + + if ( showLicenseAgreement() ) + { + showNotifyTexts( newStatus ); + } + else // License not confirmed? + { + // Status is now S_Taboo or S_Del - update status icon + setStatusIcon(); + } + + _pkgObjList->sendStatusChanged(); + } +} + + +void +YQPkgObjListItem::showNotifyTexts( ZyppStatus status ) +{ + string text; + + switch ( status ) + { + case S_Install: + if ( selectable()->hasCandidateObj() ) + text = selectable()->candidateObj()->insnotify(); + break; + + case S_NoInst: + case S_Del: + case S_Taboo: + if ( selectable()->hasCandidateObj() ) + text = selectable()->candidateObj()->delnotify(); + break; + + default: break; + } + + if ( ! text.empty() ) + { + y2debug( "Showing notify text" ); + YQPkgTextDialog::showText( _pkgObjList, selectable(), text ); + } +} + + +bool +YQPkgObjListItem::showLicenseAgreement() +{ + return showLicenseAgreement( selectable() ); +} + + +bool +YQPkgObjListItem::showLicenseAgreement( ZyppSel sel ) +{ + string licenseText; + + switch ( sel->status() ) + { + case S_Install: + case S_AutoInstall: + case S_Update: + case S_AutoUpdate: + + if ( sel->hasLicenceConfirmed() ) + return true; + + if ( sel->candidateObj() ) + licenseText = sel->candidateObj()->licenseToConfirm(); + break; + + default: return true; + } + + if ( licenseText.empty() ) + return true; + + y2debug( "Showing license agreement for %s", sel->name().c_str() ); + bool confirmed = YQPkgTextDialog::confirmText( 0, sel, licenseText ); + + if ( confirmed ) + { + y2milestone( "User confirmed license agreement for %s", sel->name().c_str() ); + sel->setLicenceConfirmed( true ); + } + else + { + // The user rejected the license agreement - + // make sure the package gets unselected. + + switch ( sel->status() ) + { + case S_Install: + case S_AutoInstall: + + y2warning( "User rejected license agreement for %s - setting to TABOO", + sel->name().c_str() ); + + sel->set_status( S_Taboo ); + break; + + + case S_Update: + case S_AutoUpdate: + + y2warning( "User rejected license agreement for %s - setting to PROTECTED", + sel->name().c_str() ); + + sel->set_status( S_Protected ); + // S_Keep wouldn't be good enough: The next solver run might + // set it to S_AutoUpdate again + break; + + default: break; + } + } + + return confirmed; +} + + +QString +YQPkgObjListItem::toolTip( int col ) +{ + if ( col == statusCol() ) + { + QString tip = _pkgObjList->statusText( status() ); + + switch ( status() ) + { + case S_AutoDel: + case S_AutoInstall: + case S_AutoUpdate: + + if ( bySelection() ) + // Translators: Additional hint what caused an auto-status + tip += "\n" + _( "(by a software selection)" ); + else + tip += "\n" + _( "(by dependencies)" ); + + break; + + default: + break; + } + + return tip; + } + + if ( col == brokenIconCol() ) + { + if ( isBroken() ) + // Translators: tool tip for patches / patterns that are installed, + // but whose dependencies are broken (no longer satisfied) + return _( "Dependencies broken" ); + } + + // don't use "else if" here, it might be the same colum as another one! + + if ( col == satisfiedIconCol() ) + { + if ( isSatisfied() ) + // Translators: tool tip for patches / patterns that are not installed, + // but whose dependencies are satisfied + return _( "All dependencies satisfied" ); + } + + return QString::null; +} + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgObjListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + YQPkgObjListItem * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + if ( col == sizeCol() ) + { + // Numeric sort by size + + if ( this->zyppObj()->size() < other->zyppObj()->size() ) return -1; + if ( this->zyppObj()->size() > other->zyppObj()->size() ) return 1; + return 0; + } + else if ( col == statusCol() ) + { + // Sorting by status depends on the numeric value of the + // ZyppStatus enum, thus it is important to insert new + // package states there where they make most sense. We want to show + // dangerous or noteworthy states first - e.g., "taboo" which should + // seldeom occur, but when it does, it is important. + + if ( this->status() < other->status() ) return -1; + if ( this->status() > other->status() ) return 1; + return 0; + } + else if ( col == instVersionCol() || + col == versionCol() ) + { + // Sorting by version numbers doesn't make too much sense, so let's + // sort by package relation: + // - Installed newer than candidate (red) + // - Candidate newer than installed (blue) - worthwhile updating + // - Installed + // - Not installed, but candidate available + // + // Within these categories, sort versions by ASCII - OK, it's + // pretty random, but predictable. + + int thisPoints = this->versionPoints(); + int otherPoints = other->versionPoints(); + + if ( thisPoints > otherPoints ) return -1; + if ( thisPoints < otherPoints ) return 1; + return QY2ListViewItem::compare( otherListViewItem, col, ascending ); + } + } + + // Fallback: Use parent class method + return QY2ListViewItem::compare( otherListViewItem, col, ascending ); +} + + +int +YQPkgObjListItem::versionPoints() const +{ + int points = 0; + + if ( installedIsNewer() ) points += 1000; + if ( candidateIsNewer() ) points += 100; + if ( selectable()->hasInstalledObj() ) points += 10; + if ( selectable()->hasCandidateObj() ) points += 1; + + return points; +} + + +void +YQPkgObjListItem::setExcluded( bool excl ) +{ + _excluded = excl; +} + + + + +YQPkgObjList::ExcludeRule::ExcludeRule( YQPkgObjList * parent, + const QRegExp & regexp, + int column ) + : _parent( parent ) + , _regexp( regexp ) + , _column( column ) + , _enabled( true ) +{ + _parent->addExcludeRule( this ); +} + + +void +YQPkgObjList::ExcludeRule::enable( bool enable ) +{ + _enabled = enable; + +#if VERBOSE_EXCLUDE_RULES + y2debug( "%s exclude rule %s", + enable ? "Enabling" : "Disabling", + _regexp.pattern().ascii() ); +#endif +} + + +void +YQPkgObjList::ExcludeRule::setRegexp( const QRegExp & regexp ) +{ + _regexp = regexp; +} + + +void +YQPkgObjList::ExcludeRule::setColumn( int column ) +{ + _column = column; +} + + +bool +YQPkgObjList::ExcludeRule::match( QListViewItem * item ) +{ + if ( ! _enabled ) + return false; + + QString text = item->text( _column ); + + if ( text.isEmpty() ) + return false; + + return _regexp.exactMatch( text ); +} + + + + + + +YQPkgObjList::ExcludedItems::ExcludedItems( YQPkgObjList * parent ) + : _pkgObjList( parent ) +{ +} + + +YQPkgObjList::ExcludedItems::~ExcludedItems() +{ + clear(); +} + + +void YQPkgObjList::ExcludedItems::add( QListViewItem * item, QListViewItem * oldParent ) +{ + _excludeMap.insert( ItemPair( item, oldParent ) ); +} + + +void YQPkgObjList::ExcludedItems::remove( QListViewItem * item ) +{ + ItemMap::iterator it = _excludeMap.find( item ); + + if ( it != _excludeMap.end() ) + { + _excludeMap.erase( it ); + } +} + + +void YQPkgObjList::ExcludedItems::clear() +{ + for ( ItemMap::iterator it = _excludeMap.begin(); + it != _excludeMap.end(); + ++it ) + { + delete it->first; + } + + _excludeMap.clear(); +} + + +bool YQPkgObjList::ExcludedItems::contains( QListViewItem * item ) +{ + return ( _excludeMap.find( item ) != _excludeMap.end() ); +} + + +QListViewItem * YQPkgObjList::ExcludedItems::oldParentItem( QListViewItem * item ) +{ + ItemMap::iterator it = _excludeMap.find( item ); + + if ( it == _excludeMap.end() ) + return 0; + + return it->second; +} + + + +#include "YQPkgObjList.moc" diff --git a/src/pkg/YQPkgObjList.h b/src/pkg/YQPkgObjList.h new file mode 100644 index 0000000..bdfed25 --- /dev/null +++ b/src/pkg/YQPkgObjList.h @@ -0,0 +1,803 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgObjList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgObjList_h +#define YQPkgObjList_h + +#include +#include +#include +#include +#include +#include "YQZypp.h" +#include +#include + +class YQPkgObjListItem; +class QAction; +class QPopupMenu; +using std::string; +using std::list; + + +/** + * @short Abstract base class to display a list of zypp::ResObjects. + * Handles most generic stuff like setting status etc. + **/ +class YQPkgObjList : public QY2ListView +{ + Q_OBJECT + +protected: + /** + * Constructor. Does not add any QListView columns! + **/ + YQPkgObjList( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgObjList(); + + +public: + + // Column numbers + + int statusCol() const { return _statusCol; } + int nameCol() const { return _nameCol; } + int summaryCol() const { return _summaryCol; } + int sizeCol() const { return _sizeCol; } + int versionCol() const { return _versionCol; } + int instVersionCol() const { return _instVersionCol; } + int brokenIconCol() const { return _brokenIconCol; } + int satisfiedIconCol() const { return _satisfiedIconCol; } + + /** + * Return whether or not items in this list are generally editable, + * i.e. the user can change their status. Note that individual items can be + * set to non-editable even if the list is generally editable. + * Lists are editable by default. + **/ + bool editable() const { return _editable; } + + /** + * Set the list's editable status. + **/ + void setEditable( bool editable = true ) { _editable = editable; } + + /** + * Sets the currently selected item's status. + * Automatically selects the next item if 'selectNextItem' is 'true'. + **/ + void setCurrentStatus( ZyppStatus newStatus, + bool selectNextItem = false ); + + /** + * Sets the status of all (toplevel) list items to 'newStatus', if possible. + * Only one single statusChanged() signal is emitted. + * + * 'force' overrides sensible defaults like setting only zypp::ResObjects to + * 'update' that really come with a newer version. + **/ + void setAllItemStatus( ZyppStatus newStatus, bool force = false ); + + /** + * Add a submenu "All in this list..." to 'menu'. + * Returns the newly created submenu. + **/ + virtual QPopupMenu * addAllInListSubMenu( QPopupMenu * menu ); + + /** + * Returns the suitable icon for a zypp::ResObject status - the regular + * icon if 'enabled' is 'true' or the insensitive icon if 'enabled' is + * 'false. 'bySelection' is relevant only for auto-states: This uses the + * icon for 'auto-by-selection" rather than the default auto-icon. + **/ + virtual QPixmap statusIcon( ZyppStatus status, + bool enabled = true, + bool bySelection = false ); + + /** + * Returns a short (one line) descriptive text for a zypp::ResObject status. + **/ + virtual QString statusText( ZyppStatus status ) const; + + + class ExcludeRule; + + /** + * Add an exclude rule to this list. + **/ + void addExcludeRule( YQPkgObjList::ExcludeRule * rule ); + + /** + * Apply all exclude rules of this list to all items, + * including those that are currently excluded. + **/ + void applyExcludeRules(); + + /** + * Apply all exclude rules of this list to one item. + **/ + void applyExcludeRules( QListViewItem * ); + + /** + * Exclude or include an item, i.e. remove it from the visible items + * and add it to the internal exclude list or vice versa. + **/ + void exclude( YQPkgObjListItem * item, bool exclude ); + + +public slots: + + /** + * Add a zypp::ResObject to the list. Connect a filter's filterMatch() + * signal to this slot. Remember to connect filterStart() to clear() + * (inherited from QListView). + * + * 'zyppObj' has to be one of the objects of 'selectable'. If it is 0, + * selectable->theObject() will be used. + * + * Intentionally NOT named addItem() so the calling class cannot confuse + * this method with overlaid methods of the same name that were simply + * forgotten to implement! + **/ + void addPkgObjItem( ZyppSel selectable, + ZyppObj zyppObj = 0 ); + + /** + * Add a purely passive list item that has a name and optional summary and + * size. + **/ + void addPassiveItem( const QString & name, + const QString & summary = QString::null, + FSize size = -1 ); + + /** + * Dispatcher slot for mouse click: cycle status depending on column. + **/ + virtual void pkgObjClicked( int button, + QListViewItem * item, + int col, + const QPoint & pos ); + + /** + * Reimplemented from QY2ListView: + * Emit selectionChanged() signal after clearing the list. + **/ + virtual void clear(); + + /** + * Update the internal actions: What actions are available for 'item'? + **/ + virtual void updateActions( YQPkgObjListItem * item ); + + /** + * Update the internal actions for the currently selected item ( if any ). + * This only calls updateActions( YQPkgObjListItem * ) with the currently + * selected item as argument, so there is normally no need to reimplement + * this method, too, if the other one is reimplemented. + **/ + virtual void updateActions(); + + /** + * Emit an updatePackages() signal. + **/ + void sendUpdatePackages() { emit updatePackages(); } + + /** + * Select the next item, i.e. move the selection one item further down the + * list. + **/ + void selectNextItem(); + + /** + * Emit a statusChanged() signal for the specified zypp::ResObject. + **/ + void sendStatusChanged() { emit statusChanged(); } + + /** + * Display a one-line message in the list. + **/ + virtual void message( const QString & text ); + + /** + * Write statistics about excluded items to the log, if there are any. + **/ + void logExcludeStatistics(); + + + // Direct access to some states for menu actions + + void setCurrentInstall() { setCurrentStatus( S_Install ); } + void setCurrentDontInstall() { setCurrentStatus( S_NoInst ); } + void setCurrentKeepInstalled() { setCurrentStatus( S_KeepInstalled ); } + void setCurrentDelete() { setCurrentStatus( S_Del ); } + void setCurrentUpdate() { setCurrentStatus( S_Update ); } + void setCurrentTaboo() { setCurrentStatus( S_Taboo ); } + void setCurrentProtected() { setCurrentStatus( S_Protected ); } + + void setListInstall() { setAllItemStatus( S_Install ); } + void setListDontInstall() { setAllItemStatus( S_NoInst ); } + void setListKeepInstalled() { setAllItemStatus( S_KeepInstalled ); } + void setListDelete() { setAllItemStatus( S_Del ); } + void setListUpdate() { setAllItemStatus( S_Update ); } + void setListUpdateForce() { setAllItemStatus( S_Update, true ); } + void setListTaboo() { setAllItemStatus( S_Taboo ); } + void setListProtected() { setAllItemStatus( S_Protected ); } + + +protected slots: + + /** + * Dispatcher slot for selection change - internal only. + **/ + virtual void selectionChangedInternal( QListViewItem * item ); + + +signals: + + + /** + * Emitted when a zypp::ui::Selectable is selected. + * May be called with a null poiner if no zypp::ResObject is selected. + **/ + void selectionChanged( ZyppSel selectable ); + + /** + * Emitted when the status of a zypp::ResObject is changed. + **/ + void statusChanged(); + + /** + * Emitted when it's time to update displayed package information, + * e.g., package states. + **/ + void updatePackages(); + + +protected: + + /** + * Event handler for keyboard input. + * Only very special keys are processed here. + * + * Reimplemented from QListView / QWidget. + **/ + virtual void keyPressEvent( QKeyEvent * ev ); + + /** + * Returns the context menu for items that are not installed. + * Creates the menu upon the first call. + **/ + virtual QPopupMenu * installedContextMenu(); + + /** + * Returns the context menu for items that are installed. + * Creates the menu upon the first call. + **/ + virtual QPopupMenu * notInstalledContextMenu(); + + /** + * Create the context menu for items that are not installed. + **/ + virtual void createNotInstalledContextMenu(); + + /** + * Create the context menu for installed items. + **/ + virtual void createInstalledContextMenu(); + + /** + * Create the actions for the context menus. + * Note: This is intentionally not virtual! + **/ + void createActions(); + + /** + * Create an action based on a zypp::ResObject status - automatically + * retrieve the corresponding status icons (both sensitive and insensitive) + * and text. 'key' is only a descriptive text, no true accelerator. + **/ + QAction * createAction( ZyppStatus status, + const QString & key = QString::null, + bool enabled = false ); + + /** + * Low-level: Create an action. + * 'key' is only a descriptive text, no true accelerator. + **/ + QAction * createAction( const QString & text, + const QPixmap & icon = QPixmap(), + const QPixmap & insensitiveIcon = QPixmap(), + const QString & key = QString::null, + bool enabled = false ); + + class ExcludedItems; + + // Data members + + int _statusCol; + int _nameCol; + int _summaryCol; + int _sizeCol; + int _versionCol; + int _instVersionCol; + int _brokenIconCol; + int _satisfiedIconCol; + bool _editable; + bool _debug; + + typedef list ExcludeRuleList; + + ExcludeRuleList _excludeRules; + ExcludedItems * _excludedItems; + + QPopupMenu * _installedContextMenu; + QPopupMenu * _notInstalledContextMenu; + + +public: + + QAction * actionSetCurrentInstall; + QAction * actionSetCurrentDontInstall; + QAction * actionSetCurrentKeepInstalled; + QAction * actionSetCurrentDelete; + QAction * actionSetCurrentUpdate; + QAction * actionSetCurrentTaboo; + QAction * actionSetCurrentProtected; + + QAction * actionSetListInstall; + QAction * actionSetListDontInstall; + QAction * actionSetListKeepInstalled; + QAction * actionSetListDelete; + QAction * actionSetListUpdate; + QAction * actionSetListUpdateForce; + QAction * actionSetListTaboo; + QAction * actionSetListProtected; + + +public: + +}; + + + +class YQPkgObjListItem: public QY2ListViewItem +{ +public: + + /** + * Constructor for root items: Creates a YQPkgObjList item that corresponds + * to the ZYPP selectable that 'selectable' refers to. 'zyppObj' has to be + * one object of 'selectable'. If it is 0, selectable->theObject() will be + * used. + **/ + YQPkgObjListItem( YQPkgObjList * pkgObjList, + ZyppSel selectable, + ZyppObj zyppObj = 0 ); + +protected: + /** + * Constructor for non-root items. + **/ + YQPkgObjListItem( YQPkgObjList * pkgObjList, + QY2ListViewItem * parent, + ZyppSel selectable, + ZyppObj zyppObj = 0 ); + +public: + + /** + * Destructor + **/ + virtual ~YQPkgObjListItem(); + + /** + * Returns the original selectable within the package manager backend. + **/ + ZyppSel selectable() const { return _selectable; } + + /** + * Returns the original object within the package manager backend. + **/ + ZyppObj zyppObj() const { return _zyppObj; } + + /** + * Return whether or not this items is editable, i.e. the user can change + * its status. This requires the corresponding list to be editable, too. + * Items are editable by default. + **/ + bool editable() const { return _editable; } + + /** + * Set this item's editable status. + **/ + void setEditable( bool editable = true ) { _editable = editable; } + + /** + * Returns the (binary RPM) package status + **/ + ZyppStatus status() const; + + /** + * Returns 'true' if this selectable's status is set by a selection + * (rather than by the user or by the dependency solver). + **/ + bool bySelection() const; + + /** + * Set the (binary RPM) package status. + * + * If 'sendSignals' is 'true' (default), the parent list will be requested + * to send update signals. List operations might want to use this for + * optimizations to send the signals only once after all changes are done. + **/ + virtual void setStatus( ZyppStatus newStatus, bool sendSignals = true ); + + /** + * Set a status icon according to the package's status. + **/ + virtual void setStatusIcon(); + + /** + * Update this item's status. + * Triggered by QY2ListView::updateAllItemStates(). + * Overwritten from QY2ListViewItem. + **/ + virtual void updateStatus(); + + /** + * Cycle the package status to the next valid value. + **/ + virtual void cycleStatus(); + + /** + * Check if the candidate is newer than the installed version. + **/ + bool candidateIsNewer() const { return _candidateIsNewer; } + + /** + * Check if the installed version is newer than the candidate. + **/ + bool installedIsNewer() const { return _installedIsNewer; } + + /** + * Check if this item is satisfied, even though it is not installed. + * This is useful for package collections, e.g., patterns and patches: + * 'true' is returned if all requirements are fulfilled, but the object + * itself is not installed. + **/ + bool isSatisfied() const; + + /** + * Check if this item is "broken": If it is installed, but any of its + * dependencies are no longer satisfied. + * This is useful for package collections, e.g., patterns and patches. + **/ + bool isBroken() const; + + /** + * Display this item's notify text (if there is any) that corresponds to + * the specified status (S_Install, S_Del) in a pop-up window. + **/ + void showNotifyTexts( ZyppStatus status ); + + /** + * Display a selectable's license agreement (if there is any) that + * corresponds to its current status (S_Install, S_Update) in a pop-up + * window. + * + * Returns 'true' if the user agreed to that license , 'false' otherwise. + * The item's status may have changed to S_Taboo, S_Proteced or S_Del if + * the user disagreed with the license. + **/ + static bool showLicenseAgreement( ZyppSel sel ); + + /** + * Display this item's license agreement (if there is any) that corresponds + * to its current status (S_Install, S_Update) in a pop-up window. + **/ + bool showLicenseAgreement(); + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + /** + * Calculate a numerical value to compare versions, based on version + * relations: + * + * - Installed newer than candidate (red) + * - Candidate newer than installed (blue) - worthwhile updating + * - Installed + * - Not installed, but candidate available + **/ + int versionPoints() const; + + /** + * Update this item's data completely. + * Triggered by QY2ListView::updateAllItemData(). + * + * Reimplemented from QY2ListViewItem. + **/ + virtual void updateData(); + + /** + * Returns a tool tip text for a specific column of this item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * Reimplemented from QY2ListViewItem. + **/ + virtual QString toolTip( int column ); + + /** + * Returns 'true' if this item is excluded. + **/ + bool isExcluded() const { return _excluded; } + + /** + * Set this item's exclude flag. + * Note that this is just a marker. It is the caller's responsibility + * to add or remove it from exclude lists etc. + **/ + void setExcluded( bool exclude = true ); + + + // Handle Debug isBroken and isSatisfied flags + + bool debugIsBroken() const { return _debugIsBroken; } + bool debugIsSatisfied() const { return _debugIsSatisfied; } + void setDebugIsBroken ( bool val = true ) { _debugIsBroken = val; } + void setDebugIsSatisfied( bool val = true ) { _debugIsSatisfied = val; } + void toggleDebugIsBroken() { _debugIsBroken = ! _debugIsBroken; } + void toggleDebugIsSatisfied() { _debugIsSatisfied = ! _debugIsSatisfied; } + + + // Columns + + int statusCol() const { return _pkgObjList->statusCol(); } + int nameCol() const { return _pkgObjList->nameCol(); } + int summaryCol() const { return _pkgObjList->summaryCol(); } + int sizeCol() const { return _pkgObjList->sizeCol(); } + int versionCol() const { return _pkgObjList->versionCol(); } + int instVersionCol() const { return _pkgObjList->instVersionCol(); } + int brokenIconCol() const { return _pkgObjList->brokenIconCol(); } + int satisfiedIconCol() const { return _pkgObjList->satisfiedIconCol(); } + + +protected: + + /** + * Initialize internal data and set fields accordingly. + **/ + void init(); + + /** + * Apply changes hook. This is called each time the user changes the status + * of a list item manually (if the old status is different from the new + * one). Insert code to propagate changes to other objects here, for + * example to trigger a "small" solver run (Resolver::transactObjKind() + * etc.). + * + * This default implementation does nothing. + **/ + virtual void applyChanges() {} + + /** + * Do a "small" solver run for all "resolvable collections", i.e., for + * selections, patterns, languages, patches. + **/ + void solveResolvableCollections(); + + /** + * Set a column text via STL string. + * ( QListViewItem::setText() expects a QString! ) + **/ + void setText( int column, const string text ); + + /** + * Re-declare ordinary setText() method so the compiler doesn't get + * confused which one to use. + **/ + void setText( int column, const QString & text ) + { QListViewItem::setText( column, text ); } + + /** + * Set a column text via Edition. + **/ + void setText( int column, const zypp::Edition & edition ); + + + // + // Data members + // + + YQPkgObjList * _pkgObjList; + ZyppSel _selectable; + ZyppObj _zyppObj; + bool _editable:1; + bool _candidateIsNewer:1; + bool _installedIsNewer:1; + + bool _debugIsBroken:1; + bool _debugIsSatisfied:1; + bool _excluded:1; +}; + + + +class YQPkgObjList::ExcludeRule +{ +public: + + /** + * Constructor: Creates a new exclude rule with a regular expression + * to check against the text of the specified column of each list + * entry. + * + * The parent YQPkgObjList will assume ownership of this exclude rule + * and destroy it when the parent is destroyed. + **/ + ExcludeRule( YQPkgObjList * parent, + const QRegExp & regexp, + int column = 0 ); + + + // Intentionally omitting virtual destructor: + // No allocated objects, no other virtual methods, + // no need to have a vtable for each instance of this class. + // + // virtual ~ExcludeRule(); + + /** + * Enable or disable this exclude rule. + * New exclude rules are enabled by default. + **/ + void enable( bool enable = true ); + + /** + * Returns 'true' if this exclude rule is enabled, + * 'false' otherwise. + **/ + bool isEnabled() const { return _enabled; } + + /** + * Change the regular expression after creation. + **/ + void setRegexp( const QRegExp & regexp ); + + /** + * Returns the regexp. + **/ + QRegExp regexp() const { return _regexp; }; + + /** + * Change the column number to check against after creation. + **/ + void setColumn( int column = 0 ); + + /** + * Returns the column number. + **/ + int column() const { return _column; } + + /** + * Returns this exclude rule's parent YQPkgObjList. + **/ + YQPkgObjList * parent() const { return _parent; } + + /** + * Check a list item against this exclude rule. + * Returns 'true' if the item matches this exclude rule, + * i.e. if it should be excluded. + **/ + bool match( QListViewItem * item ); + +private: + + YQPkgObjList * _parent; + QRegExp _regexp; + int _column; + bool _enabled; +}; + + +class YQPkgObjList::ExcludedItems +{ +public: + + typedef std::map ItemMap; + typedef std::pair ItemPair; + typedef ItemMap::iterator iterator; + + /** + * Constructor + **/ + ExcludedItems( YQPkgObjList * parent ); + + /** + * Destructor + **/ + virtual ~ExcludedItems(); + + /** + * Add a list item to the excluded items and transfer ownership to this + * class. + * + * oldParent is the previous parent item of this item + * or 0 if it was a root item. + **/ + void add( QListViewItem * item, QListViewItem * oldParent ); + + /** + * Remove a list item from the excluded items and transfer ownership back + * to the caller. + **/ + void remove( QListViewItem * item ); + + /** + * Clear the excluded items. Delete all items still excluded. + **/ + void clear(); + + /** + * Returns 'true' if the specified item is in the excluded items. + **/ + bool contains( QListViewItem * item ); + + /** + * Returns the old parent of this item so it can be reparented + * or 0 if it was a root item. + **/ + QListViewItem * oldParentItem( QListViewItem * item ); + + /** + * Returns the number of items + **/ + int size() const { return (int) _excludeMap.size(); } + + /** + * Returns an iterator that points to the first excluded item. + **/ + iterator begin() { return _excludeMap.begin(); } + + /** + * Returns an iterator that points after the last excluded item. + **/ + iterator end() { return _excludeMap.end(); } + +private: + + ItemMap _excludeMap; + YQPkgObjList * _pkgObjList; +}; + + +#endif // ifndef YQPkgObjList_h diff --git a/src/pkg/YQPkgPatchFilterView.cc b/src/pkg/YQPkgPatchFilterView.cc new file mode 100644 index 0000000..536b861 --- /dev/null +++ b/src/pkg/YQPkgPatchFilterView.cc @@ -0,0 +1,240 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgPatchFilterView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "YQPkgPatchFilterView.h" +#include "YQPkgPatchList.h" +#include "YQPkgDescriptionView.h" +#include "YQPkgSelList.h" +#include "QY2LayoutUtils.h" +#include "YQi18n.h" + +typedef zypp::ui::PatchContents ZyppPatchContents; +typedef zypp::ui::PatchContents::const_iterator ZyppPatchContentsIterator; + +using std::set; + +#define ENABLE_TOTAL_DOWNLOAD_SIZE 0 + +#define SPACING 6 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgPatchFilterView::YQPkgPatchFilterView( QWidget * parent ) + : QVBox( parent ) +{ + QVBox * vbox; + _haveUpdateStackPatches = YQPkgPatchList::haveUpdateStackPatches(); + + _splitter = new QSplitter( QSplitter::Vertical, this ); CHECK_PTR( _splitter ); + vbox = new QVBox( _splitter ); CHECK_PTR( vbox ); + _patchList = new YQPkgPatchList( vbox ); CHECK_PTR( _patchList ); + + addVSpacing( vbox, 4 ); + + QHBox * hbox = new QHBox( vbox ); CHECK_PTR( hbox ); + hbox->setSpacing( SPACING ); + + QLabel * label = new QLabel( _( "&Show Patch Category:" ), hbox ); + + _patchFilter = new QComboBox( hbox ); + CHECK_PTR( _patchFilter ); + + int index = 0; + + if ( _haveUpdateStackPatches ) + // Translators: This is about patches that patch the update engine (libzypp, YaST) itself + _patchFilter->insertItem( _( "Update Stack Patches" ), index++ ); + + _patchFilter->insertItem( _( "Installable Patches" ), index++ ); + _patchFilter->insertItem( _( "Installable and Installed Patches" ), index++ ); + _patchFilter->insertItem( _( "All Patches" ), index++ ); + _patchFilter->setCurrentItem( 0 ); + _patchFilter->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); // hor/vert + label->setBuddy( _patchFilter ); + + connect( _patchFilter, SIGNAL( activated( int ) ), this, SLOT( fillPatchList() ) ); + addVSpacing( vbox, 4 ); + + vbox = new QVBox( _splitter ); CHECK_PTR( vbox ); + addVSpacing( vbox, 8 ); + + _detailsViews = new QTabWidget( vbox ); CHECK_PTR( _detailsViews ); + _detailsViews->setMargin( MARGIN ); + + _descriptionView = new YQPkgDescriptionView( _detailsViews ); CHECK_PTR( _descriptionView ); + + _descriptionView->setMinimumSize( 0, 0 ); + _detailsViews->addTab( _descriptionView, _( "Patch Description" ) ); + + +#if ENABLE_TOTAL_DOWNLOAD_SIZE + // + // HBox for total download size + // + + addVSpacing( vbox, 4 ); + hbox = new QHBox( vbox ); CHECK_PTR( hbox ); + addHStretch( hbox ); + + new QLabel( _( "Estimated Download Size:" ) + " ", hbox ); + _totalDownloadSize = new QLabel( FSize(0).asString().c_str(), hbox ); + CHECK_PTR( _totalDownloadSize ); + + + // Give the total download size a 3D look + + _totalDownloadSize->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + _totalDownloadSize->setLineWidth(1); + _totalDownloadSize->setMidLineWidth(2); +#endif + + + connect( _patchList, SIGNAL( selectionChanged ( ZyppSel ) ), + _descriptionView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + connect( _patchList, SIGNAL( statusChanged() ), + this, SLOT ( updateTotalDownloadSize() ) ); + + fillPatchList(); + updateTotalDownloadSize(); +} + + +YQPkgPatchFilterView::~YQPkgPatchFilterView() +{ + // NOP +} + + +void +YQPkgPatchFilterView::updateTotalDownloadSize() +{ + set selectablesToInstall; + QTime calcTime; + calcTime.start(); + + for ( ZyppPoolIterator patches_it = zyppPatchesBegin(); + patches_it != zyppPatchesEnd(); + ++patches_it ) + { + ZyppPatch patch = tryCastToZyppPatch( (*patches_it)->theObj() ); + + if ( patch ) + { + ZyppPatchContents patchContents( patch ); + + for ( ZyppPatchContentsIterator contents_it = patchContents.begin(); + contents_it != patchContents.end(); + ++contents_it ) + { + ZyppPkg pkg = tryCastToZyppPkg( *contents_it ); + ZyppSel sel; + + if ( pkg ) + sel = _selMapper.findZyppSel( pkg ); + + if ( sel ) + { + switch ( sel->status() ) + { + case S_Install: + case S_AutoInstall: + case S_Update: + case S_AutoUpdate: + // Insert the patch contents selectables into a set, + // don't immediately sum up their sizes: The same + // package could be in more than one patch, but of + // course it will be downloaded only once. + + selectablesToInstall.insert( sel ); + break; + + case S_Del: + case S_AutoDel: + case S_NoInst: + case S_KeepInstalled: + case S_Taboo: + case S_Protected: + break; + + // intentionally omitting 'default' branch so the compiler can + // catch unhandled enum states + } + + } + } + } + } + + + FSize totalSize = 0; + + for ( set::iterator it = selectablesToInstall.begin(); + it != selectablesToInstall.end(); + ++it ) + { + if ( (*it)->candidateObj() ) + totalSize += (*it)->candidateObj()->size(); + } + +#if ENABLE_TOTAL_DOWNLOAD_SIZE + _totalDownloadSize->setText( totalSize.asString().c_str() ); +#endif + + y2debug( "Calculated total download size in %d millisec", calcTime.elapsed() ); +} + + +void +YQPkgPatchFilterView::fillPatchList() +{ + int currentIndex = _patchFilter->currentItem(); + + if ( _haveUpdateStackPatches ) + currentIndex--; + + switch ( currentIndex ) + { + case -1: _patchList->setFilterCriteria( YQPkgPatchList::UpdateStackPatches ); break; + case 0: _patchList->setFilterCriteria( YQPkgPatchList::RelevantPatches ); break; + case 1: _patchList->setFilterCriteria( YQPkgPatchList::RelevantAndInstalledPatches ); break; + case 2: _patchList->setFilterCriteria( YQPkgPatchList::AllPatches ); break; + default: _patchList->setFilterCriteria( YQPkgPatchList::RelevantPatches ); break; + } + + _patchList->fillList(); + _patchList->selectSomething(); +} + + +#include "YQPkgPatchFilterView.moc" diff --git a/src/pkg/YQPkgPatchFilterView.h b/src/pkg/YQPkgPatchFilterView.h new file mode 100644 index 0000000..7622ca7 --- /dev/null +++ b/src/pkg/YQPkgPatchFilterView.h @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgPatchFilterView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgPatchFilterView_h +#define YQPkgPatchFilterView_h + +#include "YQZypp.h" +#include "YQPkgSelMapper.h" +#include + + +class YQPkgPatchList; +class YQPkgDescriptionView; +class QComboBox; +class QLabel; +class QSplitter; +class QTabWidget; + + +/** + * @short Display a list of zypp::Patch objects and ( below ) details about the + * currently selected patch. + **/ +class YQPkgPatchFilterView : public QVBox +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgPatchFilterView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgPatchFilterView(); + + + /** + * Returns this view's selections list. + **/ + YQPkgPatchList * patchList() const { return _patchList; } + + +public slots: + + /** + * Update the "total download size" field. + **/ + void updateTotalDownloadSize(); + + +protected slots: + + /** + * Fill the patch list with regard to the _patchCategory + * combo box. + **/ + void fillPatchList(); + + +protected: + + + // Data members + + QSplitter * _splitter; + YQPkgPatchList * _patchList; + QComboBox * _patchFilter; + QTabWidget * _detailsViews; + YQPkgDescriptionView * _descriptionView; + QLabel * _totalDownloadSize; + + YQPkgSelMapper _selMapper; + bool _haveUpdateStackPatches; +}; + + + +#endif // ifndef YQPkgPatchFilterView_h diff --git a/src/pkg/YQPkgPatchList.cc b/src/pkg/YQPkgPatchList.cc new file mode 100644 index 0000000..aae6137 --- /dev/null +++ b/src/pkg/YQPkgPatchList.cc @@ -0,0 +1,659 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgPatchList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include +#include +#include + +#include "YQi18n.h" +#include "utf8.h" + +#include "YQPkgPatchList.h" +#include "YQPkgTextDialog.h" + + +#define VERBOSE_PATCH_LIST 1 +#define DEBUG_SHOW_ALL_UPDATE_STACK_PATCHES 0 + + +typedef zypp::ui::PatchContents ZyppPatchContents; +typedef zypp::ui::PatchContents::const_iterator ZyppPatchContentsIterator; + +using std::list; +using std::set; + + +YQPkgPatchList::YQPkgPatchList( QWidget * parent ) + : YQPkgObjList( parent ) +{ + y2debug( "Creating patch list" ); + + _filterCriteria = RelevantPatches; + + int numCol = 0; + addColumn( "" ); _statusCol = numCol++; + addColumn( _( "Patch" ) ); _nameCol = numCol++; + addColumn( _( "Summary" ) ); _summaryCol = numCol++; + addColumn( _( "Category" ) ); _categoryCol = numCol++; + addColumn( _( "Size" ) ); _sizeCol = numCol++; + addColumn( _( "Version" ) ); _versionCol = numCol++; + + // Can use the same colum for "broken" and "satisfied": + // Both states are mutually exclusive + + _satisfiedIconCol = _summaryCol; + _brokenIconCol = _summaryCol; + + setAllColumnsShowFocus( true ); + setColumnAlignment( sizeCol(), Qt::AlignRight ); + + connect( this, SIGNAL( selectionChanged ( QListViewItem * ) ), + this, SLOT ( filter() ) ); + + setSorting( categoryCol() ); + + y2debug( "Creating patch list done" ); +} + + +YQPkgPatchList::~YQPkgPatchList() +{ + // NOP +} + + +void +YQPkgPatchList::polish() +{ + // Delayed initialization after widget is fully created etc. + + // Only now send selectionChanged() signal so attached details views also + // display something if their showDetailsIfVisible() slot is connected to + // selectionChanged() signals. + selectSomething(); +} + + +void +YQPkgPatchList::setFilterCriteria( FilterCriteria filterCriteria ) +{ + _filterCriteria = filterCriteria; +} + + +void +YQPkgPatchList::fillList() +{ + clear(); + y2debug( "Filling patch list" ); + + for ( ZyppPoolIterator it = zyppPatchesBegin(); + it != zyppPatchesEnd(); + ++it ) + { + ZyppSel selectable = *it; + ZyppPatch zyppPatch = tryCastToZyppPatch( selectable->theObj() ); + + if ( zyppPatch ) + { + bool displayPatch = false; + + switch ( _filterCriteria ) + { + case UpdateStackPatches: + + if ( zyppPatch->affects_pkg_manager() ) + { +#if DEBUG_SHOW_ALL_UPDATE_STACK_PATCHES + displayPatch = true; +#endif + if ( selectable->hasCandidateObj() && + selectable->candidatePoolItem().status().isNeeded() ) + { + displayPatch = true; + + y2milestone( "Found YaST patch that should be installed: %s - %s", + zyppPatch->name().c_str(), + zyppPatch->summary().c_str() ); + } + + if ( selectable->hasInstalledObj() && + selectable->installedPoolItem().status().isIncomplete() ) // patch broken? + { + displayPatch = true; + + y2warning( "Installed YaST patch is broken: %s - %s", + zyppPatch->name().c_str(), + zyppPatch->summary().c_str() ); + } + } + break; + + case RelevantPatches: // needed + broken + satisfied (but not installed) + + if ( selectable->hasInstalledObj() ) // installed? + { + if ( selectable->installedPoolItem().status().isIncomplete() ) // patch broken? + { + // The patch is broken: It had been installed, but the user somehow + // downgraded individual packages belonging to the patch to older versions. + + displayPatch = true; + + y2warning( "Installed patch is broken: %s - %s", + zyppPatch->name().c_str(), + zyppPatch->summary().c_str() ); + } + } + else // not installed + { + if ( selectable->hasCandidateObj() && + selectable->candidatePoolItem().status().isSatisfied() ) + { + // This is a pretty exotic case, but still it might happen: + // + // The patch itelf is not installed, but it is satisfied because the + // user updated all the packages belonging to the patch to the versions + // the patch requires. All that is missing now is to get the patch meta + // data onto the system. So let's display the patch to give the user + // a chance to install it (if he so chooses). + + displayPatch = true; + + y2milestone( "Patch satisfied, but not installed yet: %s - %s", + zyppPatch->name().c_str(), + zyppPatch->summary().c_str() ); + } + } + + if ( selectable->hasCandidateObj() ) // candidate available? + { + // The most common case: There is a candidate patch, i.e. one that could be + // installed, but either no version of that patch is installed or there is a + // newer one to which the patch could be updated. + + if ( selectable->candidatePoolItem().status().isNeeded() ) // patch really needed? + { + // Patches are needed if any of the packages that belong to the patch + // are installed on the system. + + displayPatch = true; + } + else + { + // None of the packages that belong to the patch is installed on the system. + + y2debug( "Patch not needed: %s - %s", + zyppPatch->name().c_str(), + zyppPatch->summary().c_str() ); + } + } + break; + + + case RelevantAndInstalledPatches: // needed + broken + installed + + if ( selectable->hasInstalledObj() ) // installed? + { + displayPatch = true; + } + else // not installed - display only if needed + { + zypp::ResStatus candidateStatus = selectable->candidatePoolItem().status(); + + if ( candidateStatus.isNeeded() || + candidateStatus.isSatisfied() ) + { + displayPatch = true; + } + else + { + y2milestone( "Patch not needed: %s - %s", + zyppPatch->name().c_str(), + zyppPatch->summary().c_str() ); + } + } + break; + + + case AllPatches: + displayPatch = true; + break; + + // Intentionally omitting "default" so the compiler + // can catch unhandled enum values + } + + if ( displayPatch ) + { +#if VERBOSE_PATCH_LIST + y2debug( "Displaying patch %s - %s", zyppPatch->name().c_str(), zyppPatch->summary().c_str() ); +#endif + addPatchItem( *it, zyppPatch); + } + } + else + { + y2error( "Found non-patch selectable" ); + } + } + + + if ( ! firstChild() ) + message( _( "No patches available." ) ); + + y2debug( "patch list filled" ); +} + + + +void +YQPkgPatchList::message( const QString & text ) +{ + QY2ListViewItem * item = new QY2ListViewItem( this ); + CHECK_PTR( item ); + + item->setText( 1, text ); + item->setBackgroundColor( QColor( 0xE0, 0xE0, 0xF8 ) ); +} + + + +void +YQPkgPatchList::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgPatchList::filter() +{ + emit filterStart(); + std::set patchSelectables; + + if ( selection() ) + { + ZyppPatch patch = selection()->zyppPatch(); + + if ( patch ) + { + ZyppPatchContents patchContents( patch ); + + for ( ZyppPatchContentsIterator it = patchContents.begin(); + it != patchContents.end(); + ++it ) + { + ZyppPkg pkg = tryCastToZyppPkg( *it ); + + if ( pkg ) + { + y2debug( "Found patch pkg: %s arch: %s", (*it)->name().c_str(), (*it)->arch().asString().c_str() ); + + ZyppSel sel = _selMapper.findZyppSel( pkg ); + + if ( sel ) + { + if ( contains( patchSelectables, sel ) ) + { + y2milestone( "Suppressing duplicate selectable %s-%s arch: %s", + (*it)->name().c_str(), + (*it)->edition().asString().c_str(), + (*it)->arch().asString().c_str() ); + } + else + { + patchSelectables.insert( sel ); + emit filterMatch( sel, pkg ); + } + } + else + y2error( "No selectable for pkg %s", (*it)->name().c_str() ); + } + else // No ZyppPkg - some other kind of object (script, message) + { + if ( zypp::isKind ( *it ) ) + { + y2debug( "Found patch script %s", (*it)->name().c_str() ); + emit filterMatch( _( "Script" ), fromUTF8( (*it)->name() ), -1 ); + } + else if ( zypp::isKind ( *it ) ) + { + y2debug( "Found patch message %s (ignoring)", (*it)->name().c_str() ); + } + else + { + y2error( "Found unknown object of kind %s in patch: %s-%s arch: %s", + (*it)->kind().asString().c_str(), + (*it)->name().c_str(), + (*it)->edition().asString().c_str(), + (*it)->arch().asString().c_str() ); + } + } + } + } + } + + emit filterFinished(); +} + + +void +YQPkgPatchList::addPatchItem( ZyppSel selectable, + ZyppPatch zyppPatch ) +{ + if ( ! selectable ) + { + y2error( "NULL ZyppSel!" ); + return; + } + + YQPkgPatchListItem * item = new YQPkgPatchListItem( this, selectable, zyppPatch ); + applyExcludeRules( item ); +} + + +bool +YQPkgPatchList::haveUpdateStackPatches() +{ + for ( ZyppPoolIterator it = zyppPatchesBegin(); + it != zyppPatchesEnd(); + ++it ) + { + ZyppSel selectable = *it; + ZyppPatch zyppPatch = tryCastToZyppPatch( selectable->theObj() ); + + if ( zyppPatch && zyppPatch->affects_pkg_manager() ) + { +#if DEBUG_SHOW_ALL_UPDATE_STACK_PATCHES + return true; +#else + if ( selectable->hasCandidateObj() && + selectable->candidatePoolItem().status().isNeeded() ) + { + return true; + } +#endif + } + } + + return false; +} + + +YQPkgPatchListItem * +YQPkgPatchList::selection() const +{ + QListViewItem * item = selectedItem(); + + if ( ! item ) + return 0; + + return dynamic_cast (item); +} + + +void +YQPkgPatchList::createNotInstalledContextMenu() +{ + _notInstalledContextMenu = new QPopupMenu( this ); + CHECK_PTR( _notInstalledContextMenu ); + + actionSetCurrentInstall->addTo( _notInstalledContextMenu ); + actionSetCurrentDontInstall->addTo( _notInstalledContextMenu ); + actionSetCurrentTaboo->addTo( _notInstalledContextMenu ); + + addAllInListSubMenu( _notInstalledContextMenu ); +} + + +void +YQPkgPatchList::createInstalledContextMenu() +{ + _installedContextMenu = new QPopupMenu( this ); + CHECK_PTR( _installedContextMenu ); + + actionSetCurrentKeepInstalled->addTo( _installedContextMenu ); + +#if ENABLE_DELETING_PATCHES + actionSetCurrentDelete->addTo( _installedContextMenu ); +#endif + + actionSetCurrentUpdate->addTo( _installedContextMenu ); + actionSetCurrentProtected->addTo( _installedContextMenu ); + + addAllInListSubMenu( _installedContextMenu ); +} + + +QPopupMenu * +YQPkgPatchList::addAllInListSubMenu( QPopupMenu * menu ) +{ + QPopupMenu * submenu = new QPopupMenu( menu ); + CHECK_PTR( submenu ); + + actionSetListInstall->addTo( submenu ); + actionSetListDontInstall->addTo( submenu ); + actionSetListKeepInstalled->addTo( submenu ); + +#if ENABLE_DELETING_PATCHES + actionSetListDelete->addTo( submenu ); +#endif + + actionSetListUpdate->addTo( submenu ); + actionSetListUpdateForce->addTo( submenu ); + actionSetListTaboo->addTo( submenu ); + actionSetListProtected->addTo( submenu ); + + menu->insertItem( _( "&All in This List" ), submenu ); + + return submenu; +} + + +void +YQPkgPatchList::keyPressEvent( QKeyEvent * event ) +{ + if ( event ) + { +#if ! ENABLE_DELETING_PATCHES + if ( event->ascii() == '-' ) + { + QListViewItem * selectedListViewItem = selectedItem(); + + if ( selectedListViewItem ) + { + YQPkgPatchListItem * item = dynamic_cast (selectedListViewItem); + + if ( item && item->selectable()->hasInstalledObj() ) + { + y2warning( "Deleting patches is not supported" ); + return; + } + } + } +#endif + } + + YQPkgObjList::keyPressEvent( event ); +} + + + + +YQPkgPatchListItem::YQPkgPatchListItem( YQPkgPatchList * patchList, + ZyppSel selectable, + ZyppPatch zyppPatch ) + : YQPkgObjListItem( patchList, selectable, zyppPatch ) + , _patchList( patchList ) + , _zyppPatch( zyppPatch ) +{ + if ( ! _zyppPatch ) + _zyppPatch = tryCastToZyppPatch( selectable->theObj() ); + + if ( ! _zyppPatch ) + return; + + setStatusIcon(); + _patchCategory = patchCategory( _zyppPatch->category() ); + + if ( categoryCol() > -1 ) + setText( categoryCol(), asString( _patchCategory ) ); + + if ( summaryCol() > -1 && _zyppPatch->summary().empty() ) + setText( summaryCol(), _zyppPatch->name() ); // use name as fallback + + switch ( _patchCategory ) + { + case YQPkgYaSTPatch: setTextColor( QColor( 0, 0, 0xC0 ) ); break; // medium blue + case YQPkgSecurityPatch: setTextColor( Qt::red ); break; + case YQPkgRecommendedPatch: setTextColor( QColor( 0, 0, 0xC0 ) ); break; // medium blue + case YQPkgOptionalPatch: break; + case YQPkgDocumentPatch: break; + case YQPkgUnknownPatchCategory: break; + } +} + + +YQPkgPatchListItem::~YQPkgPatchListItem() +{ + // NOP +} + + +YQPkgPatchCategory +YQPkgPatchListItem::patchCategory( QString category ) +{ + category = category.lower(); + + if ( category == "yast" ) return YQPkgYaSTPatch; + if ( category == "security" ) return YQPkgSecurityPatch; + if ( category == "recommended" ) return YQPkgRecommendedPatch; + if ( category == "optional" ) return YQPkgOptionalPatch; + if ( category == "document" ) return YQPkgDocumentPatch; + + y2warning( "Unknown patch category \"%s\"", (const char *) category ); + return YQPkgUnknownPatchCategory; +} + + +QString +YQPkgPatchListItem::asString( YQPkgPatchCategory category ) +{ + switch ( category ) + { + // Translators: These are patch categories + case YQPkgYaSTPatch: return _( "YaST" ); + case YQPkgSecurityPatch: return _( "security" ); + case YQPkgRecommendedPatch: return _( "recommended" ); + case YQPkgOptionalPatch: return _( "optional" ); + case YQPkgDocumentPatch: return _( "document" ); + case YQPkgUnknownPatchCategory: return ""; + } + + return ""; +} + + +void +YQPkgPatchListItem::cycleStatus() +{ + YQPkgObjListItem::cycleStatus(); + +#if ! ENABLE_DELETING_PATCHES + if ( status() == S_Del ) // Can't delete patches + setStatus( S_KeepInstalled ); +#endif +} + + +QString +YQPkgPatchListItem::toolTip( int col ) +{ + QString text; + + if ( col == statusCol() ) + { + text = YQPkgObjListItem::toolTip( col ); + } + else + { + if ( ( col == brokenIconCol() && isBroken() ) || + ( col == satisfiedIconCol() && isSatisfied() ) ) + { + text = YQPkgObjListItem::toolTip( col ); + } + else + { + text = fromUTF8( zyppPatch()->category() ); + + if ( ! text.isEmpty() ) + text += "\n"; + + text += fromUTF8( zyppPatch()->size().asString().c_str() ); + } + } + + return text; +} + + +void +YQPkgPatchListItem::applyChanges() +{ + solveResolvableCollections(); +} + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgPatchListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + YQPkgPatchListItem * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + if ( col == categoryCol() ) + { + if ( this->patchCategory() < other->patchCategory() ) return -1; + if ( this->patchCategory() > other->patchCategory() ) return 1; + return 0; + } + } + return YQPkgObjListItem::compare( otherListViewItem, col, ascending ); +} + + + +#include "YQPkgPatchList.moc" diff --git a/src/pkg/YQPkgPatchList.h b/src/pkg/YQPkgPatchList.h new file mode 100644 index 0000000..50fef4a --- /dev/null +++ b/src/pkg/YQPkgPatchList.h @@ -0,0 +1,308 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgPatchList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgPatchList_h +#define YQPkgPatchList_h + +#include +#include "YQPkgObjList.h" +#include "YQPkgSelMapper.h" + +#define ENABLE_DELETING_PATCHES 1 + +using std::string; + +class YQPkgPatchListItem; + + +enum YQPkgPatchCategory // This is also the sort order +{ + YQPkgYaSTPatch, + YQPkgSecurityPatch, + YQPkgRecommendedPatch, + YQPkgOptionalPatch, + YQPkgDocumentPatch, + + YQPkgUnknownPatchCategory = 9999 +}; + + + +/** + * @short Display a list of zypp::Patch objects. + **/ +class YQPkgPatchList : public YQPkgObjList +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgPatchList( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgPatchList(); + + + enum FilterCriteria + { + UpdateStackPatches, // zypp or YaST2 + RelevantPatches, // needed + broken + RelevantAndInstalledPatches, // needed + broken + installed + AllPatches // all + }; + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + /** + * Add a patch to the list. Connect a filter's filterMatch() signal to + * this slot. Remember to connect filterStart() to clear() (inherited from + * QListView). + **/ + void addPatchItem( ZyppSel selectable, + ZyppPatch zyppPatch ); + + /** + * Fill the patch list according to filterCriteria(). + **/ + void fillList(); + + /** + * Display a one-line message in the list. + * Reimplemented from YQPkgObjList. + **/ + virtual void message( const QString & text ); + + +public: + + /** + * Return 'true' if there is any patch for the update stack in the pool + * that is not installed yet or that could be updated. + **/ + static bool haveUpdateStackPatches(); + + /** + * Set the filter criteria for fillList(). + **/ + void setFilterCriteria( FilterCriteria filterCriteria ); + + /** + * Returns the current filter criteria. + **/ + FilterCriteria filterCriteria() const { return _filterCriteria; } + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgPatchListItem * selection() const; + + /** + * Returns the column for the patch category + **/ + int categoryCol() const { return _categoryCol; } + + /** + * Add a submenu "All in this list..." to 'menu'. + * Returns the newly created submenu. + * + * Reimplemented from YQPkgObjList. + **/ + virtual QPopupMenu * addAllInListSubMenu( QPopupMenu * menu ); + + /** + * Delayed initialization after the dialog is fully created. + * + * Reimplemented from QWidget. + **/ + virtual void polish(); + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted during filtering for non-pkg items: + * pre-script, post-script, files + **/ + void filterMatch( const QString & name, + const QString & summary, + FSize size ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected: + + /** + * Create the context menu for items that are not installed. + * + * Reimplemented from YQPkgObjList. + **/ + virtual void createNotInstalledContextMenu(); + + /** + * Create the context menu for installed items. + * + * Reimplemented from YQPkgObjList. + **/ + virtual void createInstalledContextMenu(); + + /** + * Event handler for keyboard input. + * Only very special keys are processed here. + * + * Reimplemented from YQPkgObjList / QWidget. + **/ + virtual void keyPressEvent( QKeyEvent * ev ); + + + // Data members + + int _categoryCol; + YQPkgSelMapper _selMapper; + FilterCriteria _filterCriteria; +}; + + + +class YQPkgPatchListItem: public YQPkgObjListItem +{ +public: + + /** + * Constructor. Creates a YQPkgPatchList item that corresponds to + * zyppPatch. + **/ + YQPkgPatchListItem( YQPkgPatchList * patchList, + ZyppSel selectable, + ZyppPatch zyppPatch ); + + /** + * Destructor + **/ + virtual ~YQPkgPatchListItem(); + + /** + * Returns the original zyppPatch object. + **/ + ZyppPatch zyppPatch() const { return _zyppPatch; } + + /** + * Maps a string patch category to the corresponding enum. + **/ + static YQPkgPatchCategory patchCategory( QString category ); + + /** + * Converts a patch category to a user-readable (translated) string. + **/ + static QString asString( YQPkgPatchCategory category ); + + /** + * Returns the category of this patch (security, recommended, ...). + **/ + YQPkgPatchCategory patchCategory() const { return _patchCategory; } + + /** + * Cycle the package status to the next valid value. + * Reimplemented from YQPkgObjList. + **/ + virtual void cycleStatus(); + + /** + * Returns a tool tip text for a specific column of this item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * Reimplemented from YQPkgObjList. + **/ + virtual QString toolTip( int column ); + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem. + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + // Columns + + int statusCol() const { return _patchList->statusCol(); } + int summaryCol() const { return _patchList->summaryCol(); } + int categoryCol() const { return _patchList->categoryCol(); } + + +protected: + + /** + * Propagate status changes in this list to other lists: + * Have the solver transact all patches. + * + * Reimplemented from YQPkgObjListItem. + **/ + virtual void applyChanges(); + + + // Data members + + YQPkgPatchList * _patchList; + ZyppPatch _zyppPatch; + YQPkgPatchCategory _patchCategory; +}; + + +#endif // ifndef YQPkgPatchList_h diff --git a/src/pkg/YQPkgPatternList.cc b/src/pkg/YQPkgPatternList.cc new file mode 100644 index 0000000..4cd4e80 --- /dev/null +++ b/src/pkg/YQPkgPatternList.cc @@ -0,0 +1,451 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgPatternList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include +#include +#include +#include +#include +#include +#include + +#include "YQi18n.h" +#include "utf8.h" +#include "YQPkgPatternList.h" +#include "YQIconPool.h" +#include "YQApplication.h" +#include "YQUI.h" + + +#define CATEGORY_BACKGROUND QColor( 0xFF, 0xC0, 0x50 ) + + +YQPkgPatternList::YQPkgPatternList( QWidget * parent, bool autoFill, bool autoFilter ) + : YQPkgObjList( parent ) +{ + y2debug( "Creating pattern list" ); + + int numCol = 0; + addColumn( "" ); _statusCol = numCol++; + + // Translators: "Pattern" refers to so-called "installation patterns", + // i.e., specific task-oriented groups of packages, like "everything that + // is needed to run a web server". The idea of patterns is that they also + // include the configuration workflow needed for that task, such of + // configuring the web server. For the scope of the package selector, this + // is only of little relevance, though. + + addColumn( _( "Pattern" ) ); _summaryCol = numCol++; + + // Can use the same colum for "broken" and "satisfied": + // Both states are mutually exclusive + + _satisfiedIconCol = _summaryCol; + _brokenIconCol = _summaryCol; + + header()->setStretchEnabled( _statusCol , false ); + header()->setStretchEnabled( _summaryCol, true ); + + setAllColumnsShowFocus( true ); + setTreeStepSize( 0 ); + + if ( autoFilter ) + { + connect( this, SIGNAL( selectionChanged( QListViewItem * ) ), + this, SLOT ( filter() ) ); + } + + if ( autoFill ) + { + fillList(); + selectSomething(); + } + + y2debug( "Creating pattern list done" ); +} + + +YQPkgPatternList::~YQPkgPatternList() +{ + // NOP +} + + +void +YQPkgPatternList::fillList() +{ + clear(); + y2debug( "Filling pattern list" ); + + + for ( ZyppPoolIterator it = zyppPatternsBegin(); + it != zyppPatternsEnd(); + ++it ) + { + ZyppPattern zyppPattern = tryCastToZyppPattern( (*it)->theObj() ); + + if ( zyppPattern ) + { + if ( zyppPattern->userVisible() ) + { + addPatternItem( *it, zyppPattern ); + } + else + y2debug( "Pattern %s is not user-visible", zyppPattern->name().c_str() ); + } + else + { + y2error( "Found non-Pattern selectable" ); + } + } + + y2debug( "Pattern list filled" ); +} + + +YQPkgPatternCategoryItem * +YQPkgPatternList::category( const QString & categoryName ) +{ + if ( categoryName.isEmpty() ) + return 0; + + YQPkgPatternCategoryItem * cat = _categories[ categoryName ]; + + if ( ! cat ) + { + y2debug( "New pattern category \"%s\"", (const char *) categoryName ); + + cat = new YQPkgPatternCategoryItem( this, categoryName ); + CHECK_PTR( cat ); + _categories.insert( categoryName, cat ); + } + + + return cat; +} + + +void +YQPkgPatternList::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgPatternList::filter() +{ + emit filterStart(); + + if ( selection() ) // The seleted QListViewItem + { + ZyppPattern zyppPattern = selection()->zyppPattern(); + + if ( zyppPattern ) + { + zypp::ui::PatternContents patternContents( zyppPattern ); + set wanted = patternContents.install_packages(); + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + string name = (*it)->theObj()->name(); + + if ( contains( wanted, name ) ) + { + ZyppPkg zyppPkg = tryCastToZyppPkg( (*it)->theObj() ); + + if ( zyppPkg ) + { + emit filterMatch( *it, zyppPkg ); + } + } + } + } + } + + emit filterFinished(); +} + + +void +YQPkgPatternList::addPatternItem( ZyppSel selectable, + ZyppPattern zyppPattern ) +{ + if ( ! selectable ) + { + y2error( "NULL ZyppSelectable!" ); + return; + } + + YQPkgPatternCategoryItem * cat = category( fromUTF8( zyppPattern->category() ) ); + YQPkgPatternListItem * item = 0; + + if ( cat ) + item = new YQPkgPatternListItem( this, cat, selectable, zyppPattern ); + else + item = new YQPkgPatternListItem( this, selectable, zyppPattern ); + + applyExcludeRules( item ); +} + + +YQPkgPatternListItem * +YQPkgPatternList::selection() const +{ + QListViewItem * item = selectedItem(); + + if ( ! item ) + return 0; + + return dynamic_cast (item); +} + + +void +YQPkgPatternList::pkgObjClicked( int button, + QListViewItem * listViewItem, + int col, + const QPoint & pos ) +{ + YQPkgPatternCategoryItem * categoryItem + = dynamic_cast (listViewItem); + + if ( categoryItem ) + { + if ( button == Qt::LeftButton ) + { + if ( col == statusCol() ) + { + categoryItem->setOpen( ! categoryItem->isOpen() ); + } + } + } + else + { + YQPkgObjList::pkgObjClicked( button, listViewItem, col, pos ); + } +} + + +void +YQPkgPatternList::selectSomething() +{ + QListViewItemIterator it( this ); + + while ( *it ) + { + QY2ListViewItem * item = dynamic_cast (*it); + YQPkgPatternCategoryItem * categoryItem = + dynamic_cast (*it); + + if ( item && item->isSelectable() && ! categoryItem ) + { + setSelected( item, true ); // emits signal, too + return; + } + + ++it; + } +} + + + + + + +YQPkgPatternListItem::YQPkgPatternListItem( YQPkgPatternList * patternList, + ZyppSel selectable, + ZyppPattern zyppPattern ) + : YQPkgObjListItem( patternList, selectable, zyppPattern ) + , _patternList( patternList ) + , _zyppPattern( zyppPattern ) +{ + init(); +} + + +YQPkgPatternListItem::YQPkgPatternListItem( YQPkgPatternList * patternList, + YQPkgPatternCategoryItem * parentCategory, + ZyppSel selectable, + ZyppPattern zyppPattern ) + : YQPkgObjListItem( patternList, parentCategory, selectable, zyppPattern ) + , _patternList( patternList ) + , _zyppPattern( zyppPattern ) +{ + init(); + parentCategory->addPattern( _zyppPattern ); +} + + +void +YQPkgPatternListItem::init() +{ + if ( ! _zyppPattern ) + _zyppPattern = tryCastToZyppPattern( selectable()->theObj() ); + + setStatusIcon(); +} + + + +YQPkgPatternListItem::~YQPkgPatternListItem() +{ + // NOP +} + + +void +YQPkgPatternListItem::applyChanges() +{ + solveResolvableCollections(); +} + + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgPatternListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + YQPkgPatternListItem * otherPatternListitem = dynamic_cast(otherListViewItem); + + if ( _zyppPattern && otherPatternListitem && otherPatternListitem->zyppPattern() ) + return _zyppPattern->order().compare( otherPatternListitem->zyppPattern()->order() ); + + YQPkgPatternCategoryItem * otherCategoryItem = dynamic_cast(otherListViewItem); + + if ( otherCategoryItem ) // Patterns without category should always be sorted + return -1; // before any category + + return QListViewItem::compare( otherListViewItem, col, ascending ); +} + + + + + + +YQPkgPatternCategoryItem::YQPkgPatternCategoryItem( YQPkgPatternList * patternList, + const QString & category ) + : QY2ListViewItem( patternList ) + , _patternList( patternList ) +{ + setText( _patternList->summaryCol(), category ); + setBackgroundColor( CATEGORY_BACKGROUND ); + setOpen( true ); + setTreeIcon(); +} + + +YQPkgPatternCategoryItem::~YQPkgPatternCategoryItem() +{ + // NOP +} + + +void +YQPkgPatternCategoryItem::paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ) +{ + painter->setFont( YQUI::yqApp()->headingFont() ); + QY2ListViewItem::paintCell( painter, colorGroup, column, width, alignment ); +} + + + +void +YQPkgPatternCategoryItem::addPattern( ZyppPattern pattern ) +{ + if ( ! _firstPattern ) + { + _firstPattern = pattern; + } + else + { + if ( _firstPattern->order().compare( pattern->order() ) < 0 ) + _firstPattern = pattern; + } +} + + +void +YQPkgPatternCategoryItem::setOpen( bool open ) +{ + QListViewItem::setOpen( open ); + setTreeIcon(); +} + + +void +YQPkgPatternCategoryItem::setTreeIcon() +{ + setPixmap( _patternList->statusCol(), + isOpen() ? + YQIconPool::treeMinus() : + YQIconPool::treePlus() ); + +} + + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgPatternCategoryItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + YQPkgPatternCategoryItem * otherCategoryItem = dynamic_cast(otherListViewItem); + + if ( _firstPattern && otherCategoryItem && otherCategoryItem->firstPattern() ) + return _firstPattern->order().compare( otherCategoryItem->firstPattern()->order() ); + + + YQPkgPatternListItem * otherPatternListitem = dynamic_cast(otherListViewItem); + + if ( otherPatternListitem ) // Patterns without category should always be sorted + return 1; // before any category + + return QListViewItem::compare( otherListViewItem, col, ascending ); +} + + + +#include "YQPkgPatternList.moc" diff --git a/src/pkg/YQPkgPatternList.h b/src/pkg/YQPkgPatternList.h new file mode 100644 index 0000000..cb65381 --- /dev/null +++ b/src/pkg/YQPkgPatternList.h @@ -0,0 +1,308 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgPatternList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgPatternList_h +#define YQPkgPatternList_h + +#include "YQPkgObjList.h" +#include + + +class YQPkgPatternListItem; +class YQPkgPatternCategoryItem; + + +/** + * @short Display a list of zypp::Pattern objects. + **/ +class YQPkgPatternList : public YQPkgObjList +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * Set 'autoFill' to 'false' if you don't want the list to be filled in the + * constructor. In that case, use fillList() (e.g., when connections are + * set up). + * + * Set 'autoFilter' to 'false' if there is no need to do (expensive) + * filtering because the 'filterMatch' signal is not connected anyway. + **/ + YQPkgPatternList( QWidget * parent, bool autoFill = true, bool autoFilter = true ); + + /** + * Destructor + **/ + virtual ~YQPkgPatternList(); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + + /** + * Add a pattern to the list. Connect a filter's filterMatch() signal to + * this slot. Remember to connect filterStart() to clear() (inherited from + * QListView). + **/ + void addPatternItem( ZyppSel selectable, + ZyppPattern pattern ); + + /** + * Fill the pattern list. + **/ + void fillList(); + + /** + * Dispatcher slot for mouse click: cycle status depending on column. + * For pattern category items, emulate tree open / close behaviour. + * + * Reimplemented from YQPkgObjList. + **/ + virtual void pkgObjClicked( int button, + QListViewItem * item, + int col, + const QPoint & pos ); + + /** + * Select the first selectable list entry that is not a pattern category. + * + * Reimplemented from QY2ListView. + **/ + virtual void selectSomething(); + + +public: + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgPatternListItem * selection() const; + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected: + + /** + * Returns the category item with the specified name. Creates such a + * category if it doesn't exist yet and categoryName is not empty. Returns + * 0 if categoryName is empty. + **/ + YQPkgPatternCategoryItem * category( const QString & categoryName ); + + + // + // Data members + // + + QDict _categories; +}; + + + +class YQPkgPatternListItem: public YQPkgObjListItem +{ +public: + + /** + * Constructor for root items + **/ + YQPkgPatternListItem( YQPkgPatternList * patternList, + ZyppSel selectable, + ZyppPattern zyppPattern ); + + /** + * Constructor for items that belong to a category + **/ + YQPkgPatternListItem( YQPkgPatternList * patternList, + YQPkgPatternCategoryItem * parentCategory, + ZyppSel selectable, + ZyppPattern zyppPattern ); + + /** + * Destructor + **/ + virtual ~YQPkgPatternListItem(); + + /** + * Returns the original object within the package manager backend. + **/ + ZyppPattern zyppPattern() const { return _zyppPattern; } + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem: + * Sort by zypp::Pattern::order() only. + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + // Columns + + int statusCol() const { return _patternList->statusCol(); } + int summaryCol() const { return _patternList->summaryCol(); } + + +protected: + + /** + * Initialize things common to all constructors. + **/ + void init(); + + /** + * Propagate status changes in this list to other lists: + * Have the solver transact all patterns. + * + * Reimplemented from YQPkgObjListItem. + **/ + virtual void applyChanges(); + + + // Data members + + YQPkgPatternList * _patternList; + ZyppPattern _zyppPattern; +}; + + + +class YQPkgPatternCategoryItem: public QY2ListViewItem +{ +public: + + /** + * Constructor + **/ + YQPkgPatternCategoryItem( YQPkgPatternList * patternList, + const QString & category ); + + /** + * Destructor + **/ + virtual ~YQPkgPatternCategoryItem(); + + /** + * Returns the first pattern. This should be the first in sort order. + **/ + ZyppPattern firstPattern() const { return _firstPattern; } + + /** + * Add a pattern to this category. This method sets firstPattern() if necessary. + **/ + void addPattern( ZyppPattern pattern ); + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem: + * Sort by zypp::Pattern::order() only. + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + /* + * Open or close this subtree + * + * Reimplemented from QListViewItem to force categories open at all times + **/ + virtual void setOpen( bool open ); + + +protected: + + /** + * Set a suitable tree open/close icon depending on this category's + * open/close status. + * + * The default QListView plus/minus icons would require treeStepSize() to + * be set >0 and rootItemDecorated( true ), but that would look very ugly + * in this context, so the pattern categories paint their own tree open / + * close icons. + **/ + void setTreeIcon( void ); + + /** + * Paint method. Reimplemented from @ref QListViewItem so a different + * font can be used. + * + * Reimplemented from QY2ListViewItem. + **/ + virtual void paintCell( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + // + // Data members + // + + YQPkgPatternList * _patternList; + ZyppPattern _firstPattern; +}; + + +#endif // ifndef YQPkgPatternList_h diff --git a/src/pkg/YQPkgProductDialog.cc b/src/pkg/YQPkgProductDialog.cc new file mode 100644 index 0000000..69a226d --- /dev/null +++ b/src/pkg/YQPkgProductDialog.cc @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgProductDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "YQPkgProductDialog.h" +#include "YQPkgProductList.h" +#include "YQPkgDependenciesView.h" +#include "QY2LayoutUtils.h" +#include "YQi18n.h" +#include "YQUI.h" + + +#define SPACING 2 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgProductDialog::YQPkgProductDialog( QWidget * parent ) + : QDialog( parent ) +{ + // Dialog title + setCaption( _( "Products" ) ); + + // Enable dialog resizing even without window manager + setSizeGripEnabled( true ); + + // Layout for the dialog (can't simply insert a QVBox) + + QVBoxLayout * layout = new QVBoxLayout( this, MARGIN, SPACING ); + CHECK_PTR( layout ); + + + // VBox for splitter + + QSplitter * splitter = new QSplitter( QSplitter::Vertical, this ); + CHECK_PTR( splitter ); + layout->addWidget( splitter ); + splitter->setMargin( MARGIN ); + + + // Product list + + _productList = new YQPkgProductList( splitter ); + CHECK_PTR( _productList ); + _productList->resize( _productList->width(), 80 ); + + // Prevent status changes for now - this would require solver runs etc. + _productList->setEditable( false ); + + + // Tab widget for details views (looks better even just with one) + + _detailsViews = new QTabWidget( splitter ); + CHECK_PTR( _detailsViews ); + _detailsViews->setMargin( MARGIN ); + _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + // Dependencies view + + _dependenciesView = new YQPkgDependenciesView( _detailsViews ); + CHECK_PTR( _dependenciesView ); + _detailsViews->addTab( _dependenciesView, _( "Dependencies" ) ); + _dependenciesView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // hor/vert + + connect( _productList, SIGNAL( selectionChanged ( ZyppSel ) ), + _dependenciesView, SLOT ( showDetailsIfVisible( ZyppSel ) ) ); + + + // Button box (to center the single button) + + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + hbox->setSpacing( SPACING ); + hbox->setMargin ( MARGIN ); + layout->addWidget( hbox ); + + addHStretch( hbox ); + + + // "OK" button + + QPushButton * button = new QPushButton( _( "&OK" ), hbox ); + CHECK_PTR( button ); + button->setDefault( true ); + + connect( button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + addHStretch( hbox ); +} + + +void +YQPkgProductDialog::polish() +{ + // Delayed initialization after widget is fully created etc. + + // Only now send selectionChanged() signal so the details views display something + // (showDetailsIfVisible() shows only something if the widget is visible, + // as the method name implies) + _productList->selectSomething(); +} + + +QSize +YQPkgProductDialog::sizeHint() const +{ + QRect available = qApp->desktop()->availableGeometry( (QWidget *) this ); + QSize size = QDialog::sizeHint(); + size = size.boundedTo( QSize( available.width(), available.height() ) ); + + return size; +} + + +void +YQPkgProductDialog::showProductDialog() +{ + YQPkgProductDialog dialog( 0 ); + dialog.exec(); +} + + + + +#include "YQPkgProductDialog.moc" diff --git a/src/pkg/YQPkgProductDialog.h b/src/pkg/YQPkgProductDialog.h new file mode 100644 index 0000000..860c937 --- /dev/null +++ b/src/pkg/YQPkgProductDialog.h @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgProductDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgProductDialog_h +#define YQPkgProductDialog_h + +#include + + +class QTabWidget; +class YQPkgProductList; +class YQPkgDependenciesView; + + +/** + * Products list with dependencies details view + **/ +class YQPkgProductDialog : public QDialog +{ + Q_OBJECT + +public: + + /** + * Static convenience method: Post a dialog with all products + **/ + static void showProductDialog(); + + /** + * Returns the preferred size. + * + * Reimplemented from QWidget to limit the dialog to the screen dimensions. + **/ + virtual QSize sizeHint () const; + + /** + * Delayed initialization after the dialog is fully created. + * + * Reimplemented from QWidget. + **/ + virtual void polish(); + + +protected: + + /** + * Constructor: Creates a description dialog for all packages that match 'pkgName'. + **/ + YQPkgProductDialog( QWidget * parent ); + + + // Data members + + YQPkgProductList * _productList; + QTabWidget * _detailsViews; + YQPkgDependenciesView * _dependenciesView; +}; + + +#endif // ifndef YQPkgProductDialog_h diff --git a/src/pkg/YQPkgProductList.cc b/src/pkg/YQPkgProductList.cc new file mode 100644 index 0000000..2f26a51 --- /dev/null +++ b/src/pkg/YQPkgProductList.cc @@ -0,0 +1,144 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgProductList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include "YQi18n.h" +#include "utf8.h" + +#include "YQPkgProductList.h" + +using std::list; +using std::set; + + +YQPkgProductList::YQPkgProductList( QWidget * parent ) + : YQPkgObjList( parent ) + , _vendorCol( -42 ) +{ + y2debug( "Creating product list" ); + + int numCol = 0; + addColumn( "" ); _statusCol = numCol++; + addColumn( _( "Product" ) ); _nameCol = numCol++; + addColumn( _( "Summary" ) ); _summaryCol = numCol++; + addColumn( _( "Version" ) ); _versionCol = numCol++; + addColumn( _( "Vendor" ) ); _vendorCol = numCol++; + setAllColumnsShowFocus( true ); + setColumnAlignment( sizeCol(), Qt::AlignRight ); + + setSorting( nameCol() ); + fillList(); + selectSomething(); + + y2debug( "Creating product list done" ); +} + + +YQPkgProductList::~YQPkgProductList() +{ + // NOP +} + + +void +YQPkgProductList::fillList() +{ + clear(); + y2debug( "Filling product list" ); + + for ( ZyppPoolIterator it = zyppProductsBegin(); + it != zyppProductsEnd(); + ++it ) + { + ZyppProduct zyppProduct = tryCastToZyppProduct( (*it)->theObj() ); + + if ( zyppProduct ) + { + addProductItem( *it, zyppProduct ); + } + else + { + y2error( "Found non-product selectable" ); + } + } + + y2debug( "product list filled" ); +} + + +void +YQPkgProductList::addProductItem( ZyppSel selectable, + ZyppProduct zyppProduct ) +{ + if ( ! selectable ) + { + y2error( "NULL ZyppSel!" ); + return; + } + + new YQPkgProductListItem( this, selectable, zyppProduct ); +} + + + + + + +YQPkgProductListItem::YQPkgProductListItem( YQPkgProductList * productList, + ZyppSel selectable, + ZyppProduct zyppProduct ) + : YQPkgObjListItem( productList, selectable, zyppProduct ) + , _productList( productList ) + , _zyppProduct( zyppProduct ) +{ + if ( ! _zyppProduct ) + _zyppProduct = tryCastToZyppProduct( selectable->theObj() ); + + if ( ! _zyppProduct ) + return; + + setStatusIcon(); + + if ( vendorCol() > -1 ) + setText( vendorCol(), zyppProduct->vendor() ); + +} + + +YQPkgProductListItem::~YQPkgProductListItem() +{ + // NOP +} + + + + +void +YQPkgProductListItem::applyChanges() +{ + solveResolvableCollections(); +} + + + +#include "YQPkgProductList.moc" diff --git a/src/pkg/YQPkgProductList.h b/src/pkg/YQPkgProductList.h new file mode 100644 index 0000000..14623ae --- /dev/null +++ b/src/pkg/YQPkgProductList.h @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgProductList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgProductList_h +#define YQPkgProductList_h + +#include +#include "YQPkgObjList.h" + +using std::string; + +class YQPkgProductListItem; + + +/** + * @short Display a list of zypp::Product objects. + **/ +class YQPkgProductList : public YQPkgObjList +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgProductList( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgProductList(); + + +public slots: + + /** + * Add a product to the list. Connect a filter's filterMatch() signal to + * this slot. Remember to connect filterStart() to clear() (inherited from + * QListView). + **/ + void addProductItem( ZyppSel selectable, + ZyppProduct zyppProduct ); + + /** + * Fill the product list. + **/ + void fillList(); + + +public: + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgProductListItem * selection() const; + + /** + * Returns the column for the product's vendor. + **/ + int vendorCol() const { return _vendorCol; } + + +protected: + + + // Data members + + int _vendorCol; +}; + + + +class YQPkgProductListItem: public YQPkgObjListItem +{ +public: + + /** + * Constructor. Creates a YQPkgProductList item that corresponds to + * zyppProduct. + **/ + YQPkgProductListItem( YQPkgProductList * productList, + ZyppSel selectable, + ZyppProduct zyppProduct ); + + /** + * Destructor + **/ + virtual ~YQPkgProductListItem(); + + /** + * Returns the original zyppProduct object. + **/ + ZyppProduct zyppProduct() const { return _zyppProduct; } + + + // Columns + + int statusCol() const { return _productList->statusCol(); } + int summaryCol() const { return _productList->summaryCol(); } + int versionCol() const { return _productList->versionCol(); } + int vendorCol() const { return _productList->vendorCol(); } + + +protected: + + /** + * Propagate status changes in this list to other lists: + * Have the solver transact all products, patterns, etc. + * + * Reimplemented from YQPkgObjListItem. + **/ + virtual void applyChanges(); + + + // Data members + + YQPkgProductList * _productList; + ZyppProduct _zyppProduct; +}; + + +#endif // ifndef YQPkgProductList_h diff --git a/src/pkg/YQPkgRepoFilterView.cc b/src/pkg/YQPkgRepoFilterView.cc new file mode 100644 index 0000000..2a23d05 --- /dev/null +++ b/src/pkg/YQPkgRepoFilterView.cc @@ -0,0 +1,219 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgRepoFilterView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include + +#include "QY2ComboTabWidget.h" +#include "QY2LayoutUtils.h" +#include "YQPkgRepoFilterView.h" +#include "YQPkgRepoList.h" +#include "YQPkgRpmGroupTagsFilterView.h" +#include "YQPkgSearchFilterView.h" +#include "YQPkgStatusFilterView.h" +#include "YQi18n.h" + +#define MARGIN 4 + + +YQPkgRepoFilterView::YQPkgRepoFilterView( QWidget * parent ) + : QVBox( parent ) +{ + QSplitter * splitter = new QSplitter( QSplitter::Vertical, this ); + CHECK_PTR( splitter ); + + QVBox * upper_vbox = new QVBox( splitter ); + _repoList = new YQPkgRepoList( upper_vbox ); + CHECK_PTR( _repoList ); + _repoList->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Expanding ) );// hor/vert + + addVSpacing( upper_vbox, MARGIN ); + + + // Directly propagate signals filterStart() and filterFinished() + // from primary filter to the outside + + connect( _repoList, SIGNAL( filterStart() ), + this, SIGNAL( filterStart() ) ); + + connect( _repoList, SIGNAL( filterFinished() ), + this, SIGNAL( filterFinished() ) ); + + + // Redirect filterMatch() and filterNearMatch() signals to secondary filter + + connect( _repoList, SIGNAL( filterMatch ( ZyppSel, ZyppPkg ) ), + this, SLOT ( primaryFilterMatch ( ZyppSel, ZyppPkg ) ) ); + + connect( _repoList, SIGNAL( filterNearMatch ( ZyppSel, ZyppPkg ) ), + this, SLOT ( primaryFilterNearMatch ( ZyppSel, ZyppPkg ) ) ); + +#if 0 + QWidget * secondary_filters = +#endif + layoutSecondaryFilters( splitter ); + +#if 0 + splitter->setResizeMode( _repoList, QSplitter::Stretch ); + splitter->setResizeMode( secondary_filters, QSplitter::FollowSizeHint ); +#endif +} + + +YQPkgRepoFilterView::~YQPkgRepoFilterView() +{ + // NOP +} + + +QWidget * +YQPkgRepoFilterView::layoutSecondaryFilters( QWidget * parent ) +{ + QVBox *vbox = new QVBox( parent ); + CHECK_PTR( vbox ); + addVSpacing( vbox, MARGIN ); + + // Translators: This is a combo box where the user can apply a secondary filter + // in addition to the primary filter by repository - one of + // "all packages", "RPM groups", "search", "summary" + _secondaryFilters = new QY2ComboTabWidget( _( "&Secondary Filter:" ), vbox ); + CHECK_PTR( _secondaryFilters ); + + _secondaryFilters->setFrameStyle( QFrame::Plain ); + _secondaryFilters->setLineWidth( 0 ); + _secondaryFilters->setMidLineWidth( 0 ); + _secondaryFilters->setMargin( 0 ); + + + // + // All Packages + // + + _allPackages = new QWidget( vbox ); + CHECK_PTR( _allPackages ); + _secondaryFilters->addPage( _( "All Packages" ), _allPackages ); + + + // + // RPM Groups + // + + _rpmGroupTagsFilterView = new YQPkgRpmGroupTagsFilterView( vbox ); + CHECK_PTR( _rpmGroupTagsFilterView ); + _secondaryFilters->addPage( _( "Package Groups" ), _rpmGroupTagsFilterView ); + + connect( _rpmGroupTagsFilterView, SIGNAL( filterStart() ), + _repoList, SLOT ( filter() ) ); + + + // + // Package search view + // + + _searchFilterView = new YQPkgSearchFilterView( vbox ); + CHECK_PTR( _searchFilterView ); + _secondaryFilters->addPage( _( "Search" ), _searchFilterView ); + + connect( _searchFilterView, SIGNAL( filterStart() ), + _repoList, SLOT ( filter() ) ); + + connect( _secondaryFilters, SIGNAL( currentChanged( QWidget * ) ), + this, SLOT ( filter() ) ); + + + // + // Status change view + // + + _statusFilterView = new YQPkgStatusFilterView( parent ); + CHECK_PTR( _statusFilterView ); + _secondaryFilters->addPage( _( "Installation Summary" ), _statusFilterView ); + + connect( _statusFilterView, SIGNAL( filterStart() ), + _repoList, SLOT ( filter() ) ); + + + return _secondaryFilters; +} + + +void YQPkgRepoFilterView::filter() +{ + _repoList->filter(); +} + + +void YQPkgRepoFilterView::filterIfVisible() +{ + _repoList->filterIfVisible(); +} + + +void YQPkgRepoFilterView::primaryFilterMatch( ZyppSel selectable, + ZyppPkg pkg ) +{ + if ( secondaryFilterMatch( selectable, pkg ) ) + emit filterMatch( selectable, pkg ); +} + + +void YQPkgRepoFilterView::primaryFilterNearMatch( ZyppSel selectable, + ZyppPkg pkg ) +{ + if ( secondaryFilterMatch( selectable, pkg ) ) + emit filterNearMatch( selectable, pkg ); +} + + +bool +YQPkgRepoFilterView::secondaryFilterMatch( ZyppSel selectable, + ZyppPkg pkg ) +{ + if ( _allPackages->isVisible() ) + { + return true; + } + else if ( _rpmGroupTagsFilterView->isVisible() ) + { + return _rpmGroupTagsFilterView->check( selectable, pkg ); + } + else if ( _searchFilterView->isVisible() ) + { + return _searchFilterView->check( selectable, pkg ); + } + else if ( _statusFilterView->isVisible() ) + { + return _statusFilterView->check( selectable, pkg ); + } + else + { + return true; + } +} + + + + + + +#include "YQPkgRepoFilterView.moc" diff --git a/src/pkg/YQPkgRepoFilterView.h b/src/pkg/YQPkgRepoFilterView.h new file mode 100644 index 0000000..a35be40 --- /dev/null +++ b/src/pkg/YQPkgRepoFilterView.h @@ -0,0 +1,139 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgRepoFilterView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgRepoFilterView_h +#define YQPkgRepoFilterView_h + +#include "YQZypp.h" +#include + + +class YQPkgRepoList; +class QY2ComboTabWidget; +class YQPkgRpmGroupTagsFilterView; +class YQPkgSearchFilterView; +class YQPkgStatusFilterView; + + +class YQPkgRepoFilterView : public QVBox +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgRepoFilterView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgRepoFilterView(); + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter + * and the candidate package comes from the respective repository + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted during filtering for each pkg that matches the filter + * and the candidate package does not come from the respective repository + **/ + void filterNearMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + +protected slots: + + /** + * Propagate a filter match from the primary filter + * and appy any selected secondary filter(s) to it + **/ + void primaryFilterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Propagate a filter near match from the primary filter + * and appy any selected secondary filter(s) to it + **/ + void primaryFilterNearMatch( ZyppSel selectable, + ZyppPkg pkg ); + + +protected: + + /** + * Widget layout for the secondary filters + **/ + QWidget * layoutSecondaryFilters( QWidget * parent ); + + /** + * Check if pkg matches the the currently selected secondary filter + **/ + bool secondaryFilterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + + // Data members + + YQPkgRepoList * _repoList; + QY2ComboTabWidget * _secondaryFilters; + QWidget * _allPackages; + YQPkgRpmGroupTagsFilterView * _rpmGroupTagsFilterView; + YQPkgSearchFilterView * _searchFilterView; + YQPkgStatusFilterView * _statusFilterView; +}; + + + +#endif // ifndef YQPkgRepoFilterView_h diff --git a/src/pkg/YQPkgRepoList.cc b/src/pkg/YQPkgRepoList.cc new file mode 100644 index 0000000..58c7751 --- /dev/null +++ b/src/pkg/YQPkgRepoList.cc @@ -0,0 +1,305 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgRepoList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#include +#include + +#define y2log_component "qt-pkg" +#include +#include + +#include "YQPkgRepoList.h" +#include "YQi18n.h" +#include "utf8.h" + +using std::list; +using std::set; +using std::vector; + + + +YQPkgRepoList::YQPkgRepoList( QWidget * parent ) + : QY2ListView( parent ) +{ + y2debug( "Creating repository list" ); + + _nameCol = -1; + _urlCol = -1; + + int numCol = 0; + + // Column headers for repository list + addColumn( _( "Name" ) ); _nameCol = numCol++; + addColumn( _( "URL" ) ); _urlCol = numCol++; + + setAllColumnsShowFocus( true ); + setSelectionMode( QListView::Extended ); // allow multi-selection with Ctrl-mouse + + connect( this, SIGNAL( selectionChanged() ), + this, SLOT ( filterIfVisible()) ); + + fillList(); + selectSomething(); + + y2debug( "Creating repository list done" ); +} + + +YQPkgRepoList::~YQPkgRepoList() +{ + // NOP +} + + +void +YQPkgRepoList::fillList() +{ + clear(); + y2debug( "Filling repository list" ); + + for ( ZyppRepositoryIterator it = ZyppRepositoriesBegin(); + it != ZyppRepositoriesEnd(); + ++it ) + { + addRepo( *it ); + } + + y2debug( "Inst repository filled" ); +} + + +int +YQPkgRepoList::countEnabledRepositories() +{ + return zyppPool().knownRepositoriesSize(); +} + + +void +YQPkgRepoList::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgRepoList::filter() +{ + emit filterStart(); + + y2milestone( "Collecting packages in selected repositories..." ); + QTime stopWatch; + stopWatch.start(); + + + // + // Collect all packages on this repository + // + + set exactMatches; + set nearMatches; + + QListViewItem * item = firstChild(); // take multi selection into account + + while ( item ) + { + if ( item->isSelected() ) + { + YQPkgRepoListItem * repoItem = dynamic_cast (item); + + if ( repoItem ) + { + ZyppRepo currentRepo = repoItem->zyppRepo(); + + for ( ZyppPoolIterator sel_it = zyppPkgBegin(); + sel_it != zyppPkgEnd(); + ++sel_it ) + { + if ( (*sel_it)->candidateObj() && + (*sel_it)->candidateObj()->repository() == currentRepo ) + { + exactMatches.insert( *sel_it ); + } + else + { + zypp::ui::Selectable::available_iterator pkg_it = (*sel_it)->availableBegin(); + + while ( pkg_it != (*sel_it)->availableEnd() ) + { + if ( (*pkg_it)->repository() == currentRepo ) + nearMatches.insert( *sel_it ); + + ++pkg_it; + } + } + } + + } + } + + item = item->nextSibling(); + } + + + // + // Send all exact matches to the list + // (emit a filterMatch signal for each one) + // + + set::const_iterator sel_it = exactMatches.begin(); + + while ( sel_it != exactMatches.end() ) + { + emit filterMatch( (*sel_it), tryCastToZyppPkg( (*sel_it)->theObj() ) ); + nearMatches.erase( *sel_it ); + ++sel_it; + } + + + // + // Send all near matches to the list + // (emit a filterNearMatch signal for each one) + // + + sel_it = nearMatches.begin(); + + while ( sel_it != nearMatches.end() ) + { + emit filterNearMatch( *sel_it, tryCastToZyppPkg( (*sel_it)->theObj() ) ); + ++sel_it; + } + + y2debug( "Packages sent to package list. Elapsed time: %f sec", stopWatch.elapsed() / 1000.0 ); + + emit filterFinished(); +} + + +void +YQPkgRepoList::addRepo( ZyppRepo repo ) +{ + new YQPkgRepoListItem( this, repo ); +} + + +YQPkgRepoListItem * +YQPkgRepoList::selection() const +{ + QListViewItem * item = selectedItem(); + + if ( ! item ) + return 0; + + return dynamic_cast (item); +} + + + + + + +YQPkgRepoListItem::YQPkgRepoListItem( YQPkgRepoList * repoList, + ZyppRepo repo ) + : QY2ListViewItem( repoList ) + , _repoList( repoList ) + , _zyppRepo( repo ) +{ + if ( nameCol() >= 0 ) + { + string name = repo.info().name(); + +#if SHOW_SINGLE_PRODUCT + ZyppProduct product = singleProduct( _zyppRepo ); + + if ( product ) // only if the repository provides exactly one product + { // (which is the most common case) + name = product->summary(); + } +#endif + + if ( ! name.empty() ) + setText( nameCol(), fromUTF8( name )); + } + + if ( urlCol() >= 0 ) + { + zypp::Url repoUrl; + + if ( ! repo.info().baseUrlsEmpty() ) + repoUrl = *repo.info().baseUrlsBegin(); + + setText( urlCol(), repoUrl.asString().c_str() ); + } +} + + + +YQPkgRepoListItem::~YQPkgRepoListItem() +{ + // NOP +} + + +ZyppProduct +YQPkgRepoListItem::singleProduct( ZyppRepo zyppRepo ) +{ + ZyppProduct product; + + zypp::ResStore::iterator it = zyppRepo.resolvables().begin(); + + // + // Find the first product on this repository + // + + while ( it != zyppRepo.resolvables().end() && ! product ) + { + product = zypp::dynamic_pointer_cast( *it ); + ++it; + } + + // + // Check if there is another product on this repository + // + + while ( it != zyppRepo.resolvables().end() ) + { + if ( zypp::dynamic_pointer_cast( *it ) ) + { + y2milestone( "Multiple products in repository %s", + zyppRepo.info().alias().c_str() ); + ZyppProduct null; + return null; + } + + ++it; + } + + if ( ! product ) + y2milestone( "No product in repository %s", + zyppRepo.info().alias().c_str() ); + + return product; +} + + + +#include "YQPkgRepoList.moc" diff --git a/src/pkg/YQPkgRepoList.h b/src/pkg/YQPkgRepoList.h new file mode 100644 index 0000000..1431d49 --- /dev/null +++ b/src/pkg/YQPkgRepoList.h @@ -0,0 +1,189 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgRepoList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgRepoList_h +#define YQPkgRepoList_h + +#include "YQZypp.h" +#include "QY2ListView.h" +#include +#include + + +class YQPkgRepoListItem; + +typedef zypp::Repository ZyppRepo; + + +/** + * @short Display a list of zypp::Selection objects. + **/ +class YQPkgRepoList : public QY2ListView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgRepoList( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgRepoList(); + + /** + * Returns the number of enabled repositories. + **/ + static int countEnabledRepositories(); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + /** + * Add a repository to the list. + **/ + void addRepo( ZyppRepo repo ); + + +public: + + // Column numbers + + int nameCol() const { return _nameCol; } + int urlCol() const { return _urlCol; } + + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgRepoListItem * selection() const; + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter + * and the candidate package comes from the respective repository + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted during filtering for each pkg that matches the filter + * and the candidate package does not come from the respective repository + **/ + void filterNearMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected slots: + + /** + * Fill the list. + **/ + void fillList(); + + +private: + + // + // Data members + // + + int _nameCol; + int _urlCol; + +}; + + + +class YQPkgRepoListItem: public QY2ListViewItem +{ +public: + + /** + * Constructor + **/ + YQPkgRepoListItem( YQPkgRepoList *parentList, ZyppRepo repo ); + + /** + * Destructor + **/ + virtual ~YQPkgRepoListItem(); + + /** + * Returns the ZYPP repository this item corresponds to + **/ + ZyppRepo zyppRepo() const { return _zyppRepo; } + + /** + * Returns the parent list + **/ + const YQPkgRepoList * repoList() const { return _repoList; } + + /** + * Returns the product on a source if it has one single product + * or 0 if there are no or multiple products. + **/ + static ZyppProduct singleProduct( ZyppRepo repo ); + + + // Columns + + int nameCol() const { return _repoList->nameCol(); } + int urlCol() const { return _repoList->urlCol(); } + +protected: + + // Data members + + YQPkgRepoList * _repoList; + ZyppRepo _zyppRepo; +}; + + +#endif // ifndef YQPkgRepoList_h diff --git a/src/pkg/YQPkgRpmGroupTagsFilterView.cc b/src/pkg/YQPkgRpmGroupTagsFilterView.cc new file mode 100644 index 0000000..12142ed --- /dev/null +++ b/src/pkg/YQPkgRpmGroupTagsFilterView.cc @@ -0,0 +1,273 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgRpmGroupTagsFilterView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include "YQPkgRpmGroupTagsFilterView.h" +#include "YQi18n.h" +#include "utf8.h" + + + +YRpmGroupsTree * YQPkgRpmGroupTagsFilterView::_rpmGroupsTree = 0; + + +YQPkgRpmGroupTagsFilterView::YQPkgRpmGroupTagsFilterView( QWidget * parent ) + : QListView( parent ) +{ + addColumn( _( "Package Groups" ) ); + setRootIsDecorated( true ); + cloneTree( rpmGroupsTree()->root(), 0 ); + + new YQPkgRpmGroupTag( this, _( "zzz All" ), 0 ); + + connect( this, SIGNAL( selectionChanged ( QListViewItem * ) ), + this, SLOT ( slotSelectionChanged ( QListViewItem * ) ) ); + + selectSomething(); +} + + +YQPkgRpmGroupTagsFilterView::~YQPkgRpmGroupTagsFilterView() +{ +} + + +YRpmGroupsTree * +YQPkgRpmGroupTagsFilterView::rpmGroupsTree() +{ + if ( ! _rpmGroupsTree ) + { + _rpmGroupsTree = new YRpmGroupsTree(); + CHECK_PTR( _rpmGroupsTree ); + + fillRpmGroupsTree(); + } + + return _rpmGroupsTree; +} + + +void +YQPkgRpmGroupTagsFilterView::fillRpmGroupsTree() +{ + y2debug( "Filling RPM groups tree" ); + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppPkg zyppPkg = tryCastToZyppPkg( (*it)->theObj() ); + + if ( zyppPkg ) + rpmGroupsTree()->addRpmGroup( zyppPkg->group() ); + } + + y2debug( "Filling RPM groups tree done" ); +} + + +void +YQPkgRpmGroupTagsFilterView::cloneTree( YStringTreeItem * parentRpmGroup, + YQPkgRpmGroupTag * parentClone ) +{ + YStringTreeItem * child = parentRpmGroup->firstChild(); + YQPkgRpmGroupTag * clone; + + while ( child ) + { + if ( parentClone ) + clone = new YQPkgRpmGroupTag( this, parentClone, child ); + else + clone = new YQPkgRpmGroupTag( this, child ); + + CHECK_PTR( clone ); + clone->setOpen( clone->depth() < 1 ); + + cloneTree( child, clone ); + child = child->next(); + } +} + + +void +YQPkgRpmGroupTagsFilterView::selectSomething() +{ + QListViewItem * item = firstChild(); + + if ( item ) + setSelected( item, true ); +} + + +void +YQPkgRpmGroupTagsFilterView::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgRpmGroupTagsFilterView::filter() +{ + emit filterStart(); + // y2debug( "Filtering packages for RPM group \"%s\"", selectedRpmGroup().c_str() ); + + if ( selection() ) + { + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppSel selectable = *it; + + // Multiple instances of this package may or may not be in the same + // RPM group, so let's check both the installed version (if there + // is any) and the candidate version. + // + // Make sure we emit only one filterMatch() signal if both exist + // and both are in the same RPM group. We don't want multiple list + // entries for the same package! + + bool match = + check( selectable, tryCastToZyppPkg( selectable->candidateObj() ) ) || + check( selectable, tryCastToZyppPkg( selectable->installedObj() ) ); + + // If there is neither an installed nor a candidate package, check + // any other instance. + + if ( ! match && + ! selectable->candidateObj() && + ! selectable->installedObj() ) + check( selectable, tryCastToZyppPkg( selectable->theObj() ) ); + } + } + + emit filterFinished(); +} + + +void +YQPkgRpmGroupTagsFilterView::slotSelectionChanged( QListViewItem * newSelection ) +{ + YQPkgRpmGroupTag * sel = dynamic_cast( newSelection ); + + if ( sel ) + { + if ( sel->rpmGroup() ) + _selectedRpmGroup = rpmGroupsTree()->rpmGroup( sel->rpmGroup() ); + else + _selectedRpmGroup = "*"; // "zzz_All" + } + else + { + _selectedRpmGroup = ""; + } + + filter(); +} + + +bool +YQPkgRpmGroupTagsFilterView::check( ZyppSel selectable, + ZyppPkg pkg ) +{ + if ( ! pkg || ! selection() ) + return false; + + if ( selection()->rpmGroup() == 0 ) // Special case: All packages + { + emit filterMatch( selectable, pkg ); + return true; + } + + if ( selectedRpmGroup().empty() ) + return false; + + if ( pkg->group() == selectedRpmGroup() || // full match? + pkg->group().find( selectedRpmGroup() + "/" ) == 0 ) // starts with selected? + { + emit filterMatch( selectable, pkg ); + return true; + } + + return false; +} + + +YQPkgRpmGroupTag * +YQPkgRpmGroupTagsFilterView::selection() const +{ + QListViewItem * item = selectedItem(); + + if ( ! item ) + return 0; + + return dynamic_cast ( selectedItem() ); +} + + + + + + +YQPkgRpmGroupTag::YQPkgRpmGroupTag( YQPkgRpmGroupTagsFilterView * parentFilterView, + YStringTreeItem * rpmGroup ) + : QListViewItem( parentFilterView ) + , _filterView( parentFilterView ) + , _rpmGroup( rpmGroup ) +{ + setText( 0, fromUTF8( _rpmGroup->value().translation() ) ); +} + + +YQPkgRpmGroupTag::YQPkgRpmGroupTag( YQPkgRpmGroupTagsFilterView * parentFilterView, + YQPkgRpmGroupTag * parentGroupTag, + YStringTreeItem * rpmGroup ) + : QListViewItem( parentGroupTag ) + , _filterView( parentFilterView ) + , _rpmGroup( rpmGroup ) +{ + setText( 0, fromUTF8( _rpmGroup->value().translation() ) ); +} + + +YQPkgRpmGroupTag::YQPkgRpmGroupTag( YQPkgRpmGroupTagsFilterView * parentFilterView, + const QString & rpmGroupName, + YStringTreeItem * rpmGroup ) + : QListViewItem( parentFilterView ) + , _filterView( parentFilterView ) + , _rpmGroup( rpmGroup ) +{ + setText( 0, rpmGroupName ); +} + + +YQPkgRpmGroupTag::~YQPkgRpmGroupTag() +{ + // NOP +} + + + +#include "YQPkgRpmGroupTagsFilterView.moc" diff --git a/src/pkg/YQPkgRpmGroupTagsFilterView.h b/src/pkg/YQPkgRpmGroupTagsFilterView.h new file mode 100644 index 0000000..3cfd162 --- /dev/null +++ b/src/pkg/YQPkgRpmGroupTagsFilterView.h @@ -0,0 +1,209 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgRpmGroupTagsFilterView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgRpmGroupTagsFilterView_h +#define YQPkgRpmGroupTagsFilterView_h + +#include "YQZypp.h" +#include +#include + + +using std::string; + +class YQPkgRpmGroupTag; + + +/** + * @short RPM group tags filter view: Display the RPM group tags tree and emit + * signals if any group tag is selected so a package list can be filled or + * updated. + **/ +class YQPkgRpmGroupTagsFilterView : public QListView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgRpmGroupTagsFilterView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgRpmGroupTagsFilterView(); + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgRpmGroupTag * selection() const; + + /** + * Check if 'pkg' matches the selected RPM group. + * Returns true if there is a match, false otherwise. + **/ + bool check( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Returns the (untranslated!) currently selected RPM group as string. + * Special case: "*" is returned if "zzz_All" is selected. + **/ + const string & selectedRpmGroup() const { return _selectedRpmGroup; } + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + /** + * Select a list entry (if there is any). + * Usually this will be the first list entry, but don't rely on that - this + * might change without notice. Emits signal selectionChanged(). + **/ + void selectSomething(); + + /** + * Returns the internal RPM groups tree and fills it + * if it doesn't exist yet. + **/ + static YRpmGroupsTree * rpmGroupsTree(); + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected slots: + + /** + * Update _selectedRpmGroup and filter data + **/ + void slotSelectionChanged( QListViewItem * newSelection ); + + +protected: + + /** + * Fill the internal RPM groups tree with RPM groups of all packages + * currently in the pool + **/ + static void fillRpmGroupsTree(); + + /** + * Recursively clone the RPM group tag tree for the QListView widget: + * Make a deep copy of the tree starting at 'parentRpmGroup' and + * 'parentClone'. + **/ + void cloneTree( YStringTreeItem * parentRpmGroup, + YQPkgRpmGroupTag * parentClone = 0 ); + + // + // Data members + // + + string _selectedRpmGroup; + + static YRpmGroupsTree * _rpmGroupsTree; +}; + + + +class YQPkgRpmGroupTag: public QListViewItem +{ +public: + + /** + * Constructor for toplevel RPM group tags + **/ + YQPkgRpmGroupTag( YQPkgRpmGroupTagsFilterView * parentFilterView, + YStringTreeItem * rpmGroup ); + + /** + * Constructor for RPM group tags that have a parent + **/ + YQPkgRpmGroupTag( YQPkgRpmGroupTagsFilterView * parentFilterView, + YQPkgRpmGroupTag * parentGroupTag, + YStringTreeItem * rpmGroup ); + + /** + * Constructor for toplevel RPM group tags via STL string + * ( for special cases like "zzz All" ) + **/ + YQPkgRpmGroupTag( YQPkgRpmGroupTagsFilterView * parentFilterView, + const QString & rpmGroupName, + YStringTreeItem * rpmGroup ); + + /** + * Destructor + **/ + virtual ~YQPkgRpmGroupTag(); + + + /** + * Returns the parent filter view + **/ + YQPkgRpmGroupTagsFilterView * filterView() const { return _filterView; } + + /** + * Returns the original tree item + **/ + const YStringTreeItem * rpmGroup() const { return _rpmGroup; } + + +private: + + // Data members + + YQPkgRpmGroupTagsFilterView * _filterView; + YStringTreeItem * _rpmGroup; +}; + + +#endif // ifndef YQPkgRpmGroupTagsFilterView_h diff --git a/src/pkg/YQPkgSearchFilterView.cc b/src/pkg/YQPkgSearchFilterView.cc new file mode 100644 index 0000000..e9c290e --- /dev/null +++ b/src/pkg/YQPkgSearchFilterView.cc @@ -0,0 +1,362 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSearchFilterView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define y2log_component "qt-pkg" +#include + +#include "YQPkgSearchFilterView.h" +#include "QY2LayoutUtils.h" +#include "YQi18n.h" +#include "utf8.h" +#include "YQApplication.h" +#include "YQUI.h" + +using std::list; +using std::string; + + +#define SPACING 6 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgSearchFilterView::YQPkgSearchFilterView( QWidget * parent ) + : QVBox( parent ) +{ + _matchCount = 0; + setMargin( MARGIN ); + setSpacing( SPACING ); + + addVStretch( this ); + + // Headline + QLabel * label = new QLabel( _( "Searc&h:" ), this ); + CHECK_PTR( label ); + label->setFont( YQUI::yqApp()->headingFont() ); + + // Input field ( combo box ) for search text + _searchText = new QComboBox( this ); + CHECK_PTR( _searchText ); + _searchText->setEditable( true ); + label->setBuddy( _searchText ); + + + // Box for search button + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + + addHStretch( hbox ); + + // Search button + _searchButton = new QPushButton( _( "&Search" ), hbox ); + CHECK_PTR( _searchButton ); + + connect( _searchButton, SIGNAL( clicked() ), + this, SLOT ( filter() ) ); + + addVStretch( this ); + + // + // Where to search + // + + QVGroupBox * gbox = new QVGroupBox( _( "Search in" ), this ); + CHECK_PTR( gbox ); + + + _searchInName = new QCheckBox( _( "&Name" ), gbox ); CHECK_PTR( _searchInName ); + _searchInSummary = new QCheckBox( _( "Su&mmary" ), gbox ); CHECK_PTR( _searchInSummary ); + _searchInDescription = new QCheckBox( _( "Descr&iption" ), gbox ); CHECK_PTR( _searchInDescription ); + + addVStretch( gbox ); + + // Intentionally NOT marking RPM tags for translation + _searchInProvides = new QCheckBox( "RPM \"&Provides\"" , gbox ); CHECK_PTR( _searchInProvides ); + _searchInRequires = new QCheckBox( "RPM \"Re&quires\"" , gbox ); CHECK_PTR( _searchInRequires ); + + _searchInName->setChecked( true ); + _searchInSummary->setChecked( true ); + + addVStretch( this ); + + + // + // Search mode + // + + label = new QLabel( _( "Search &Mode:" ), this ); + CHECK_PTR( label ); + + _searchMode = new QComboBox( this ); + CHECK_PTR( _searchMode ); + _searchMode->setEditable( false ); + + label->setBuddy( _searchMode ); + + // Caution: combo box items must be inserted in the same order as enum SearchMode! + _searchMode->insertItem( _( "Contains" ) ); + _searchMode->insertItem( _( "Begins with" ) ); + _searchMode->insertItem( _( "Exact Match" ) ); + _searchMode->insertItem( _( "Use Wild Cards" ) ); + _searchMode->insertItem( _( "Use Regular Expression" ) ); + + _searchMode->setCurrentItem( Contains ); + + + addVStretch( this ); + + _caseSensitive = new QCheckBox( _( "Case Sensiti&ve" ), this ); + CHECK_PTR( _caseSensitive ); + + for ( int i=0; i < 6; i++ ) + addVStretch( this ); +} + + +YQPkgSearchFilterView::~YQPkgSearchFilterView() +{ + // NOP +} + + +void +YQPkgSearchFilterView::keyPressEvent( QKeyEvent * event ) +{ + if ( event ) + { + if ( event->state() == 0 ) // No Ctrl / Alt / Shift etc. pressed + { + if ( event->key() == Qt::Key_Return || + event->key() == Qt::Key_Enter ) + { + _searchButton->animateClick(); + return; + } + } + + } + + QVBox::keyPressEvent( event ); +} + + +void +YQPkgSearchFilterView::setFocus() +{ + _searchText->setFocus(); +} + + +QSize +YQPkgSearchFilterView::minimumSizeHint() const +{ + return QSize( 0, 0 ); +} + + +void +YQPkgSearchFilterView::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgSearchFilterView::filter() +{ + emit filterStart(); + _matchCount = 0; + + if ( ! _searchText->currentText().isEmpty() ) + { + // Create a progress dialog that is only displayed if the search takes + // longer than a couple of seconds ( default: 4 ). + + QProgressDialog progress( _( "Searching..." ), // text + _( "&Cancel" ), // cancelButtonLabel +#ifdef FIXME + Y2PM::packageManager().size(), // totalSteps +#else + 1000, +#endif + this, 0, // parent, name + true ); // modal + progress.setCaption( "" ); + progress.setMinimumDuration( 2000 ); // millisec + QTime timer; + + QRegExp regexp = _searchText->currentText(); + regexp.setCaseSensitive( _caseSensitive->isChecked() ); + regexp.setWildcard( _searchMode->currentItem() == UseWildcards ); + + timer.start(); + + + int count = 0; + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd() && ! progress.wasCancelled(); + ++it ) + { + ZyppSel selectable = *it; + + bool match = + check( selectable, selectable->candidateObj(), regexp ) || + check( selectable, selectable->installedObj(), regexp ); + + // If there is neither an installed nor a candidate package, check + // any other instance. + + if ( ! match && + ! selectable->candidateObj() && + ! selectable->installedObj() ) + check( selectable, selectable->theObj(), regexp ); + + + progress.setProgress( count++ ); + + if ( timer.elapsed() > 300 ) // milisec + { + // Process events only every 300 milliseconds - this is very + // expensive since both the progress dialog and the package + // list change all the time, thus display updates are necessary + // each time. + + qApp->processEvents(); + timer.restart(); + } + } + + if ( _matchCount == 0 ) + emit message( _( "No Results." ) ); + } + + emit filterFinished(); +} + + +bool +YQPkgSearchFilterView::check( ZyppSel selectable, + ZyppObj zyppObj ) +{ + QRegExp regexp = _searchText->currentText(); + regexp.setCaseSensitive( _caseSensitive->isChecked() ); + regexp.setWildcard( _searchMode->currentItem() == UseWildcards ); + + return check( selectable, zyppObj, regexp ); +} + + +bool +YQPkgSearchFilterView::check( ZyppSel selectable, + ZyppObj zyppObj, + const QRegExp & regexp ) +{ + if ( ! zyppObj ) + return false; + + bool match = + ( _searchInName->isChecked() && check( zyppObj->name(), regexp ) ) || + ( _searchInSummary->isChecked() && check( zyppObj->summary(), regexp ) ) || + ( _searchInDescription->isChecked() && check( zyppObj->description(), regexp ) ) || + ( _searchInProvides->isChecked() && check( zyppObj->dep( zypp::Dep::PROVIDES ), regexp ) ) || + ( _searchInRequires->isChecked() && check( zyppObj->dep( zypp::Dep::REQUIRES ), regexp ) ); + + if ( match ) + { + ZyppPkg zyppPkg = tryCastToZyppPkg( zyppObj ); + + if ( zyppPkg ) + { + _matchCount++; + emit filterMatch( selectable, zyppPkg ); + } + } + + return match; +} + + +bool +YQPkgSearchFilterView::check( const string & attribute, + const QRegExp & regexp ) +{ + QString att = fromUTF8( attribute ); + QString searchText = _searchText->currentText(); + bool match = false; + + switch ( _searchMode->currentItem() ) + { + case Contains: + match = att.contains( searchText, _caseSensitive->isChecked() ); + break; + + case BeginsWith: + match = att.startsWith( searchText ); // only case sensitive + break; + + case ExactMatch: + match = ( att == searchText ); + break; + + case UseWildcards: + case UseRegExp: + // Both cases differ in how the regexp is set up during initialization + match = att.contains( regexp ); + break; + + // Intentionally omitting "default" branch - let gcc watch for unhandled enums + } + + return match; +} + + +bool +YQPkgSearchFilterView::check( const zypp::CapSet & capSet, const QRegExp & regexp ) +{ + for ( zypp::CapSet::const_iterator it = capSet.begin(); + it != capSet.end(); + ++it ) + { + if ( check( ( *it).index(), regexp ) ) + { + // y2debug( "Match for %s", (*it).asString().c_str() ); + return true; + } + } + + return false; +} + + + +#include "YQPkgSearchFilterView.moc" diff --git a/src/pkg/YQPkgSearchFilterView.h b/src/pkg/YQPkgSearchFilterView.h new file mode 100644 index 0000000..b71a3e8 --- /dev/null +++ b/src/pkg/YQPkgSearchFilterView.h @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSearchFilterView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgSearchFilterView_h +#define YQPkgSearchFilterView_h + +#include "YQZypp.h" +#include +#include + + +class QComboBox; +class QCheckBox; +class QPushButton; +class QRadioButton; + +using std::list; +using std::string; + + +/** + * @short Filter view for searching within packages + **/ +class YQPkgSearchFilterView : public QVBox +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgSearchFilterView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgSearchFilterView(); + + /** + * Returns the minimum size required for this widget. + * Inherited from QWidget. + **/ + virtual QSize minimumSizeHint() const; + + /** + * Check one ResObject against the currently selected values. + * Returns true if the package matches, false if not. + **/ + bool check( ZyppSel selectable, + ZyppObj zyppObj ); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + /** + * Set the keyboard focus into this view's input field. + **/ + void setFocus(); + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + /** + * Send a short message about unsuccessful searches. + **/ + void message( const QString & text ); + + +protected: + + // Caution: Enum order must match corresponding message strings in combo box! + typedef enum SearchMode + { + Contains = 0, + BeginsWith, + ExactMatch, + UseWildcards, + UseRegExp + }; + + + /** + * Check if pkg matches the search criteria. + **/ + bool check( ZyppSel selectable, + ZyppObj zyppObj, + const QRegExp & regexp ); + + /** + * Check if a single pkg attribute matches the search criteria. + **/ + bool check( const string & attribute, const QRegExp & regexp ); + + /** + * Check capability like + * zypp::Resolvable::dep( zypp::Dep::PROVIDES ), + * zypp::Resolvable::dep( zypp::Dep::REQUIRES ) + **/ + bool check( const zypp::CapSet & capSet, const QRegExp & regexp ); + + /** + * Key press event: Execute search upon 'Return' + * Reimplemented from QVBox / QWidget. + **/ + virtual void keyPressEvent( QKeyEvent * event ); + + + // Data members + + QComboBox * _searchText; + QPushButton * _searchButton; + + QCheckBox * _searchInName; + QCheckBox * _searchInSummary; + QCheckBox * _searchInDescription; + QCheckBox * _searchInRequires; + QCheckBox * _searchInProvides; + + QComboBox * _searchMode; + QCheckBox * _caseSensitive; + + int _matchCount; +}; + + + +#endif // ifndef YQPkgSearchFilterView_h diff --git a/src/pkg/YQPkgSelDescriptionView.cc b/src/pkg/YQPkgSelDescriptionView.cc new file mode 100644 index 0000000..85992cb --- /dev/null +++ b/src/pkg/YQPkgSelDescriptionView.cc @@ -0,0 +1,178 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSelDescriptionView.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include +#include + +#include "YQPkgSelDescriptionView.h" +#include "YQUI.h" +#include "YQi18n.h" +#include "utf8.h" + +using std::list; +using std::string; + + +YQPkgSelDescriptionView::YQPkgSelDescriptionView( QWidget * parent ) + : YQPkgDescriptionView( parent ) +{ +} + + +YQPkgSelDescriptionView::~YQPkgSelDescriptionView() +{ + // NOP +} + + +void +YQPkgSelDescriptionView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( ! selectable ) + { + clear(); + return; + } + + QString html_text = htmlHeading( selectable ); + + QString description = fromUTF8( selectable->theObj()->description() ); + + if ( ! description.contains( "" ) ) + description = simpleHtmlParagraphs( description ); + + html_text += description; + + setTextFormat( Qt::RichText ); + setText( html_text ); + ensureVisible( 0, 0 ); // Otherwise hyperlinks will be centered +} + + + +QString +YQPkgSelDescriptionView::htmlHeading( ZyppSel selectable ) +{ + ZyppObj zyppObj = selectable->theObj(); + ZyppSelection selection = tryCastToZyppSelection( zyppObj ); + ZyppPattern pattern = tryCastToZyppPattern ( zyppObj ); + + if ( ! selection && ! pattern ) + return YQPkgGenericDetailsView::htmlHeading( selectable ); + + QString summary = fromUTF8( zyppObj->summary() ); + bool useBigFont = ( summary.length() <= 40 ); + + if ( summary.isEmpty() ) // No summary? + summary = fromUTF8( zyppObj->name() ); // Use name instead (internal only normally) + + QString icon = pattern ? pattern->icon().asString().c_str() : ""; + + if ( icon.isEmpty() ) + { + icon = zyppObj->name().c_str(); + icon.replace( ' ', '_' ); + } + + if ( icon ) + { + if ( icon.startsWith( "./" ) ) + icon.replace( QRegExp( "^\\./" ), "" ); + + if ( ! icon.endsWith( ".png", false ) && + ! icon.endsWith( ".jpg", false ) ) + icon += ".png"; + + QString origIconName = icon; + + if ( ! icon.contains( "/" ) ) // no path at all + { + // Look in icon directories: + // + // /usr/share/YaST2/theme/current/icons/32x32/apps/ + // /usr/share/YaST2/theme/current/icons/48x48/apps/ + + QString iconBaseName = icon; + icon = findIcon( QString( THEMEDIR ) + "/icons/32x32/apps/" + iconBaseName ); + + if ( icon.isEmpty() ) + icon = findIcon( QString( THEMEDIR ) + "/icons/48x48/apps/" + iconBaseName ); + } + else if ( ! icon.startsWith( "/" ) ) // relative path + { + // Use path relative to theme directory: + // + // /usr/share/YaST2/theme/current/ + icon + + icon = findIcon( QString( THEMEDIR ) + "/" + icon ); + } + + if ( pattern && icon.isEmpty() ) + y2warning( "No icon for pattern %s - icon name: %s", + zyppObj->name().c_str(), (const char *) origIconName ); + } + + + QString html = "usingVisionImpairedPalette() ) + html += " bgcolor=#C8C8F8"; // or #E0E0F8 (very light blueish grey) + + html += ">" + + "
      " + + ( useBigFont ? QString( "

      " ) : QString( "" ) ) + + summary + + ( useBigFont ? QString( "

      " ) : QString( "" ) ) + + "
      "; + + if ( ! icon.isEmpty() ) + { + html = QString( "" ) + + "" + + "" + + "
      " + html + "
      "; + } + + return html; +} + + + +QString +YQPkgSelDescriptionView::findIcon( const QString & icon ) const +{ + if ( access( icon, R_OK ) == 0 ) + { + y2debug( "Found icon %s", (const char *) icon ); + return icon; + } + else + { + y2debug( "No icon %s", (const char *) icon ); + return ""; + } +} + + +#include "YQPkgSelDescriptionView.moc" diff --git a/src/pkg/YQPkgSelDescriptionView.h b/src/pkg/YQPkgSelDescriptionView.h new file mode 100644 index 0000000..9dcf422 --- /dev/null +++ b/src/pkg/YQPkgSelDescriptionView.h @@ -0,0 +1,68 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSelDescriptionView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgSelDescriptionView_h +#define YQPkgSelDescriptionView_h + +#include "YQPkgDescriptionView.h" + + +/** + * @short Display the description of a zypp::ResObject derived object along with its + * name and summary. + **/ +class YQPkgSelDescriptionView : public YQPkgDescriptionView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgSelDescriptionView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgSelDescriptionView(); + + /** + * Show details for the specified package: + * In this case the package description. + * Overwritten from YQPkgGenericDetailsView. + **/ + virtual void showDetails( ZyppSel selectable ); + +protected: + + /** + * Format the heading in HTML + **/ + QString htmlHeading( ZyppSel selectable ); + + /** + * Check if 'icon' exists. Returns 'icon' if it exists and an empty string + * if it doesn't exist. + **/ + QString findIcon( const QString & icon ) const; +}; + + +#endif // ifndef YQPkgSelDescriptionView_h diff --git a/src/pkg/YQPkgSelList.cc b/src/pkg/YQPkgSelList.cc new file mode 100644 index 0000000..ef06e79 --- /dev/null +++ b/src/pkg/YQPkgSelList.cc @@ -0,0 +1,231 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSelList.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include +#include +#include +#include + + +#include "YQi18n.h" +#include "utf8.h" +#include "YQPkgSelList.h" + + +YQPkgSelList::YQPkgSelList( QWidget * parent, bool autoFill, bool autoFilter ) + : YQPkgObjList( parent ) +{ + y2debug( "Creating selection list" ); + + int numCol = 0; + addColumn( "" ); _statusCol = numCol++; + addColumn( _( "Selection" ) ); _summaryCol = numCol++; + setAllColumnsShowFocus( true ); + + _satisfiedIconCol = _summaryCol; + _brokenIconCol = _summaryCol; + + if ( autoFilter ) + { + connect( this, SIGNAL( selectionChanged( QListViewItem * ) ), + this, SLOT ( filter() ) ); + } + + if ( autoFill ) + { + fillList(); + selectSomething(); + } + + y2debug( "Creating selection list done" ); +} + + +YQPkgSelList::~YQPkgSelList() +{ + // NOP +} + + +void +YQPkgSelList::fillList() +{ + clear(); + y2debug( "Filling selection list" ); + + + for ( ZyppPoolIterator it = zyppSelectionsBegin(); + it != zyppSelectionsEnd(); + ++it ) + { + ZyppSelection zyppSelection = tryCastToZyppSelection( (*it)->theObj() ); + + if ( zyppSelection ) + { + if ( zyppSelection->visible() && ! zyppSelection->isBase() ) + { + addPkgSelItem( *it, zyppSelection ); + } + } + else + { + y2error( "Found non-Selection selectable" ); + } + } + + y2debug( "Selection list filled" ); +} + + +void +YQPkgSelList::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgSelList::filter() +{ + emit filterStart(); + + if ( selection() ) // The seleted QListViewItem + { + ZyppSelection zyppSelection = selection()->zyppSelection(); + + if ( zyppSelection ) + { + set wanted = zyppSelection->install_packages(); + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + string name = (*it)->theObj()->name(); + + if ( contains( wanted, name ) ) + { + ZyppPkg zyppPkg = tryCastToZyppPkg( (*it)->theObj() ); + + if ( zyppPkg ) + { + emit filterMatch( *it, zyppPkg ); + } + } + } + } + } + + emit filterFinished(); +} + + +void +YQPkgSelList::addPkgSelItem( ZyppSel selectable, + ZyppSelection zyppSelection ) +{ + if ( ! selectable ) + { + y2error( "NULL ZyppSel!" ); + return; + } + + YQPkgSelListItem * item = new YQPkgSelListItem( this, selectable, zyppSelection ); + applyExcludeRules( item ); +} + + +YQPkgSelListItem * +YQPkgSelList::selection() const +{ + QListViewItem * item = selectedItem(); + + if ( ! item ) + return 0; + + return dynamic_cast (item); +} + + + + + + +YQPkgSelListItem::YQPkgSelListItem( YQPkgSelList * pkgSelList, + ZyppSel selectable, + ZyppSelection zyppSelection ) + : YQPkgObjListItem( pkgSelList, selectable, zyppSelection ) + , _pkgSelList( pkgSelList ) + , _zyppSelection( zyppSelection ) +{ + if ( ! _zyppSelection ) + _zyppSelection = tryCastToZyppSelection( selectable->theObj() ); + + QString text = fromUTF8( _zyppSelection->summary() ); + + // You don't want to know why we need this. + text.replace( QRegExp( "Graphical Basis System" ), "Graphical Base System" ); + text.replace( QRegExp( "Gnome" ), "GNOME" ); + + setText( summaryCol(), text ); + + setStatusIcon(); +} + + +YQPkgSelListItem::~YQPkgSelListItem() +{ + // NOP +} + + +void +YQPkgSelListItem::applyChanges() +{ + solveResolvableCollections(); +} + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgSelListItem::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + YQPkgSelListItem * other = ( YQPkgSelListItem * ) otherListViewItem; + + if ( ! _zyppSelection || ! other || ! other->zyppSelection() ) + return 0; + + return _zyppSelection->order().compare( other->zyppSelection()->order() ); +} + + + +#include "YQPkgSelList.moc" diff --git a/src/pkg/YQPkgSelList.h b/src/pkg/YQPkgSelList.h new file mode 100644 index 0000000..e521997 --- /dev/null +++ b/src/pkg/YQPkgSelList.h @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSelList.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgSelList_h +#define YQPkgSelList_h + +#include + + +class YQPkgSelListItem; + + +/** + * @short Display a list of zypp::Selection objects. + **/ +class YQPkgSelList : public YQPkgObjList +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * Set 'autoFill' to 'false' if you don't want the list to be filled in the + * constructor. In that case, use fillList() (e.g., when connections are + * set up). + * + * Set 'autoFilter' to 'false' if there is no need to do (expensive) + * filtering because the 'filterMatch' signal is not connected anyway. + **/ + YQPkgSelList( QWidget * parent, bool autoFill = true, bool autoFilter = true ); + + /** + * Destructor + **/ + virtual ~YQPkgSelList(); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + + /** + * Add a selection to the list. Connect a filter's filterMatch() signal to + * this slot. Remember to connect filterStart() to clear() (inherited from + * QListView). + **/ + void addPkgSelItem( ZyppSel selectable, + ZyppSelection selection ); + + /** + * Fill the selection list. + **/ + void fillList(); + +public: + + /** + * Returns the currently selected item or 0 if there is none. + **/ + YQPkgSelListItem * selection() const; + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); +}; + + + +class YQPkgSelListItem: public YQPkgObjListItem +{ +public: + + /** + * Constructor + **/ + YQPkgSelListItem( YQPkgSelList * pkgSelList, + ZyppSel selectable, + ZyppSelection zyppSelection ); + + /** + * Destructor + **/ + virtual ~YQPkgSelListItem(); + + /** + * Returns the original object within the package manager backend. + **/ + ZyppSelection zyppSelection() const { return _zyppSelection; } + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem: + * Sort by zypp::Selection::order() only. + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + // Columns + + int statusCol() const { return _pkgSelList->statusCol(); } + int summaryCol() const { return _pkgSelList->summaryCol(); } + + +protected: + + /** + * Propagate status changes in this list to other lists: + * Have the solver transact all selections. + * + * Reimplemented from YQPkgObjListItem. + **/ + virtual void applyChanges(); + + + // Data members + + YQPkgSelList * _pkgSelList; + ZyppSelection _zyppSelection; +}; + + +#endif // ifndef YQPkgSelList_h diff --git a/src/pkg/YQPkgSelMapper.cc b/src/pkg/YQPkgSelMapper.cc new file mode 100644 index 0000000..730f655 --- /dev/null +++ b/src/pkg/YQPkgSelMapper.cc @@ -0,0 +1,102 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSelMapper.cc + + Author: Stefan Hundhammer + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include "YQPkgSelMapper.h" + + + +int YQPkgSelMapper::_refCount = 0; +YQPkgSelMapper::Cache YQPkgSelMapper::_cache; + + +YQPkgSelMapper::YQPkgSelMapper() +{ + if ( ++_refCount == 1 ) + rebuildCache(); +} + + +YQPkgSelMapper::~YQPkgSelMapper() +{ + if ( --_refCount == 0 ) + { + y2debug( "Destroying pkg -> selectable cache" ); + _cache.clear(); + } +} + + +void YQPkgSelMapper::rebuildCache() +{ + _cache.clear(); + y2debug( "Building pkg -> selectable cache" ); + + for ( ZyppPoolIterator sel_it = zyppPkgBegin(); + sel_it != zyppPkgEnd(); + ++sel_it ) + { + ZyppSel sel = *sel_it; + + if ( sel->installedObj() ) + { + // The installed package (if there is any) may or may not be in the list + // of available packages. Better make sure to insert it. + + ZyppPkg installedPkg = tryCastToZyppPkg( sel->installedObj() ); + + if ( installedPkg ) + _cache.insert( CachePair( installedPkg, sel ) ); + } + + zypp::ui::Selectable::available_iterator it = sel->availableBegin(); + + while ( it != sel->availableEnd() ) + { + ZyppPkg pkg = tryCastToZyppPkg( *it ); + + if ( pkg ) + _cache.insert( CachePair( pkg, sel ) ); + + ++it; + } + } + + y2debug( "Building pkg -> selectable cache done" ); +} + + +ZyppSel +YQPkgSelMapper::findZyppSel( ZyppPkg pkg ) +{ + YQPkgSelMapper mapper; // This will build a cache, if there is none yet + ZyppSel sel; + + YQPkgSelMapper::CacheIterator it = YQPkgSelMapper::_cache.find( pkg ); + + if ( it != YQPkgSelMapper::_cache.end() ) + sel = it->second; + else + y2warning( "No selectable found for package %s", pkg->name().c_str() ); + + return sel; +} + diff --git a/src/pkg/YQPkgSelMapper.h b/src/pkg/YQPkgSelMapper.h new file mode 100644 index 0000000..2f1c221 --- /dev/null +++ b/src/pkg/YQPkgSelMapper.h @@ -0,0 +1,84 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgSelMapper.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgSelMapper_h +#define YQPkgSelMapper_h + +#include "YQZypp.h" +#include + + + +/** + * Mapping from ZyppPkg to the correspoinding ZyppSel. + * + * All instances of this class share the same cache. The cache remains alive as + * long as any instance of this class exists. + **/ +class YQPkgSelMapper +{ +public: + + /** + * Constructor. Builds a cache, if necessary. + **/ + YQPkgSelMapper(); + + /** + * Destructor. Clears the cache if this was the last YQPkgSelMapper + * (i.e. if refCount() reaches 0) + **/ + virtual ~YQPkgSelMapper(); + + /** + * Find the corresponding ZyppSel to a ZyppPkg. + * Returns 0 if there is no corresponding ZyppSel. + **/ + + ZyppSel findZyppSel( ZyppPkg pkg ); + + /** + * Reference count - indicates how many instances of this class are alive + * right now. + **/ + static int refCount() { return _refCount; } + + /** + * Rebuild the shared cache. This is expensive. Call this only when the + * ZyppPool has changed, i.e. after installation sources were added or + * removed. + * + * Since the cache is shared, this affects all instances of this class. + **/ + void rebuildCache(); + + +protected: + + typedef std::map Cache; + typedef std::pair CachePair; + typedef Cache::iterator CacheIterator; + + static int _refCount; + static Cache _cache; +}; + + + +#endif // YQPkgSelMapper_h diff --git a/src/pkg/YQPkgStatusFilterView.cc b/src/pkg/YQPkgStatusFilterView.cc new file mode 100644 index 0000000..5161a35 --- /dev/null +++ b/src/pkg/YQPkgStatusFilterView.cc @@ -0,0 +1,273 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgStatusFilterView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include +#include +#include +#include +#include + +#define y2log_component "qt-pkg" +#include + +#include "YQPkgStatusFilterView.h" +#include "YQIconPool.h" +#include "YQi18n.h" +#include "QY2LayoutUtils.h" +#include "utf8.h" +#include "YQUI.h" + + +#define SPACING 6 // between subwidgets +#define MARGIN 4 // around the widget + + +YQPkgStatusFilterView::YQPkgStatusFilterView( QWidget * parent ) + : QVBox( parent ) +{ + setMargin( MARGIN ); + setSpacing( SPACING ); + + addVStretch( this ); + +#if 0 + // Headline + QLabel * label = new QLabel( _( "Changes Overview" ), this ); + CHECK_PTR( label ); + label->setFont( YQUI::ui()->headingFont() ); +#endif + + + // + // Packages with what status to show + // + + QGroupBox * gbox = new QGroupBox( 3, Qt::Horizontal, _( "Show packages with status" ), this ); + CHECK_PTR( gbox ); + + _showDel = addStatusCheckBox( gbox, _( "Delete" ), YQIconPool::disabledPkgDel(), true ); + _showInstall = addStatusCheckBox( gbox, _( "Install" ), YQIconPool::disabledPkgInstall(), true ); + _showUpdate = addStatusCheckBox( gbox, _( "Update" ), YQIconPool::disabledPkgUpdate(), true ); + _showAutoDel = addStatusCheckBox( gbox, _( "Autodelete" ), YQIconPool::disabledPkgAutoDel(), true ); + _showAutoInstall = addStatusCheckBox( gbox, _( "Autoinstall" ), YQIconPool::disabledPkgAutoInstall(), true ); + _showAutoUpdate = addStatusCheckBox( gbox, _( "Autoupdate" ), YQIconPool::disabledPkgAutoUpdate(), true ); + _showTaboo = addStatusCheckBox( gbox, _( "Taboo" ), YQIconPool::disabledPkgTaboo(), true ); + _showProtected = addStatusCheckBox( gbox, _( "Protected" ), YQIconPool::disabledPkgProtected(), true ); + + addVSpacing( gbox, 8 ); + addHStretch( gbox ); // For the other columns of the QGroupBox ( prevent wraparound ) + addHStretch( gbox ); + + _showKeepInstalled = addStatusCheckBox( gbox, _( "Keep" ), YQIconPool::disabledPkgKeepInstalled(), false ); + _showNoInst = addStatusCheckBox( gbox, _( "Do not install" ), YQIconPool::disabledPkgNoInst(), false ); + + addVStretch( this ); + + + // Box for refresh button + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + + addHStretch( hbox ); + + // Refresh button + _refreshButton = new QPushButton( _( "&Refresh List" ), hbox ); + CHECK_PTR( _refreshButton ); + addHStretch( hbox ); + + connect( _refreshButton, SIGNAL( clicked() ), + this, SLOT ( filter() ) ); + + for ( int i=0; i < 6; i++ ) + addVStretch( this ); +} + + +YQPkgStatusFilterView::~YQPkgStatusFilterView() +{ + // NOP +} + + + +QCheckBox * +YQPkgStatusFilterView::addStatusCheckBox( QWidget * parent, + const QString & text, + const QPixmap & icon, + bool initiallyChecked ) +{ + QCheckBox * checkBox = new QCheckBox( text, parent ); + CHECK_PTR( checkBox ); + checkBox->setChecked( initiallyChecked ); + + QLabel * label = new QLabel( parent ); + CHECK_PTR( label ); + label->setPixmap( icon ); + + addHStretch( parent ); + + connect( checkBox, SIGNAL( clicked() ), + this, SLOT ( filter() ) ); + + return checkBox; +} + + +QSize +YQPkgStatusFilterView::minimumSizeHint() const +{ + return QSize( 0, 0 ); +} + + +void +YQPkgStatusFilterView::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgStatusFilterView::filter() +{ + emit filterStart(); + + for ( ZyppPoolIterator it = zyppPkgBegin(); + it != zyppPkgEnd(); + ++it ) + { + ZyppSel selectable = *it; + + bool match = + check( selectable, selectable->candidateObj() ) || + check( selectable, selectable->installedObj() ); + + // If there is neither an installed nor a candidate package, check + // any other instance. + + if ( ! match && + ! selectable->candidateObj() && + ! selectable->installedObj() ) + check( selectable, selectable->theObj() ); + } + + emit filterFinished(); +} + + +bool +YQPkgStatusFilterView::check( ZyppSel selectable, + ZyppObj zyppObj ) +{ + bool match = false; + + if ( ! zyppObj ) + return false; + + switch ( selectable->status() ) + { + case S_AutoDel: match = _showAutoDel->isChecked(); break; + case S_AutoInstall: match = _showAutoInstall->isChecked(); break; + case S_AutoUpdate: match = _showAutoUpdate->isChecked(); break; + case S_Del: match = _showDel->isChecked(); break; + case S_Install: match = _showInstall->isChecked(); break; + case S_KeepInstalled: match = _showKeepInstalled->isChecked(); break; + case S_NoInst: match = _showNoInst->isChecked(); break; + case S_Protected: match = _showProtected->isChecked(); break; + case S_Taboo: match = _showTaboo->isChecked(); break; + case S_Update: match = _showUpdate->isChecked(); break; + + // Intentionally omitting 'default' branch so the compiler can + // catch unhandled enum states + } + + if ( match ) + { + ZyppPkg zyppPkg = tryCastToZyppPkg( zyppObj ); + + if ( zyppPkg ) + emit filterMatch( selectable, zyppPkg ); + } + + return match; +} + + + +void YQPkgStatusFilterView::clear() +{ + _showDel->setChecked( false ); + _showInstall->setChecked( false ); + _showUpdate->setChecked( false ); + _showAutoDel->setChecked( false ); + _showAutoInstall->setChecked( false ); + _showAutoUpdate->setChecked( false ); + _showTaboo->setChecked( false ); + _showProtected->setChecked( false ); + _showKeepInstalled->setChecked( false ); + _showNoInst->setChecked( false ); +} + + +void YQPkgStatusFilterView::showTransactions() +{ + showManualTransactions(); + showAutoTransactions(); +} + + +void YQPkgStatusFilterView::showManualTransactions() +{ + _showDel->setChecked( true ); + _showInstall->setChecked( true ); + _showUpdate->setChecked( true ); +} + + +void YQPkgStatusFilterView::showAutoTransactions() +{ + _showAutoDel->setChecked( true ); + _showAutoInstall->setChecked( true ); + _showAutoUpdate->setChecked( true ); +} + + +void YQPkgStatusFilterView::showLocks() +{ + _showTaboo->setChecked( true ); + _showProtected->setChecked( true ); +} + + +void YQPkgStatusFilterView::showInstalled() +{ + _showKeepInstalled->setChecked( true ); +} + + +void YQPkgStatusFilterView::showNotInstalled() +{ + _showNoInst->setChecked( true ); +} + + + +#include "YQPkgStatusFilterView.moc" diff --git a/src/pkg/YQPkgStatusFilterView.h b/src/pkg/YQPkgStatusFilterView.h new file mode 100644 index 0000000..3078aaa --- /dev/null +++ b/src/pkg/YQPkgStatusFilterView.h @@ -0,0 +1,168 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgStatusFilterView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgStatusFilterView_h +#define YQPkgStatusFilterView_h + +#include "YQZypp.h" +#include +#include + + +class QComboBox; +class QCheckBox; +class QPushButton; + + +/** + * @short Filter view for packages that made problems during update + **/ +class YQPkgStatusFilterView : public QVBox +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgStatusFilterView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgStatusFilterView(); + + /** + * Returns the minimum size required for this widget. + * Inherited from QWidget. + **/ + virtual QSize minimumSizeHint() const; + + /** + * Check if pkg matches the filter criteria. + **/ + bool check( ZyppSel selectable, + ZyppObj pkg ); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + + /** + * Reset all check boxes (set them all to "off") + **/ + void clear(); + + /** + * Set up the check boxes so all pending transactions are displayed. + **/ + void showTransactions(); + + /** + * Set up the check boxes so pending manual transactions (no "auto" states) + * are displayed. + **/ + void showManualTransactions(); + + /** + * Set up the check boxes so pending automatic transactions (the "auto" states) + * are displayed. + **/ + void showAutoTransactions(); + + /** + * Set the check boxes for locked packages ("Taboo" and "Protected") to "on". + **/ + void showLocks(); + + /** + * Set the check box for installed packages to "on". + **/ + void showInstalled(); + + /** + * Set the check box for not installed packages to "on". + **/ + void showNotInstalled(); + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected: + + /** + * Add a check box + **/ + QCheckBox * addStatusCheckBox( QWidget * parent, + const QString & label, + const QPixmap & icon, + bool initiallyChecked ); + + // Data members + + QCheckBox * _showAutoDel; + QCheckBox * _showAutoInstall; + QCheckBox * _showAutoUpdate; + QCheckBox * _showDel; + QCheckBox * _showInstall; + QCheckBox * _showKeepInstalled; + QCheckBox * _showNoInst; + QCheckBox * _showTaboo; + QCheckBox * _showProtected; + QCheckBox * _showUpdate; + + QPushButton * _refreshButton; +}; + + + +#endif // ifndef YQPkgStatusFilterView_h diff --git a/src/pkg/YQPkgTechnicalDetailsView.cc b/src/pkg/YQPkgTechnicalDetailsView.cc new file mode 100644 index 0000000..fd599c4 --- /dev/null +++ b/src/pkg/YQPkgTechnicalDetailsView.cc @@ -0,0 +1,201 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgTechnicalDetailsView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define y2log_component "qt-pkg" +#include + +#include "YQPkgTechnicalDetailsView.h" +#include "YQi18n.h" +#include "utf8.h" + +using std::list; +using std::string; + + +YQPkgTechnicalDetailsView::YQPkgTechnicalDetailsView( QWidget * parent ) + : YQPkgGenericDetailsView( parent ) +{ +} + + +YQPkgTechnicalDetailsView::~YQPkgTechnicalDetailsView() +{ + // NOP +} + + +void +YQPkgTechnicalDetailsView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( ! selectable ) + { + clear(); + return; + } + + QString html_text = htmlHeading( selectable ); + + ZyppPkg candidate = tryCastToZyppPkg( selectable->candidateObj() ); + ZyppPkg installed = tryCastToZyppPkg( selectable->installedObj() ); + + if ( candidate && installed && candidate != installed ) + { + html_text += complexTable( selectable, installed, candidate ); + } + else + { + if ( candidate ) + html_text += simpleTable( selectable, candidate ); + + if ( installed ) + html_text += simpleTable( selectable, installed ); + } + + setTextFormat( Qt::RichText ); + setText( html_text ); +} + + +QString +YQPkgTechnicalDetailsView::authorsListCell( ZyppPkg pkg ) const +{ + QString html = ""; + QString line; + list authors = pkg->authors(); + list::const_iterator it = authors.begin(); + + while ( it != authors.end() ) + { + line = fromUTF8( *it ); + line = htmlEscape( line ); + html += line + "
      "; + ++it; + } + + html += ""; + + return html; +} + + +QString +YQPkgTechnicalDetailsView::formatRpmGroup( ZyppPkg pkg ) const +{ + QStringList groups = QStringList::split( '/', // delimiter + fromUTF8( pkg->group() ), + false ); // allow empties + + // Translate group path components + + QStringList translated; + + for ( QValueList::const_iterator it = groups.begin(); + it != groups.end(); + ++it ) + { + translated.append( QString::fromUtf8( dgettext( "rpm-groups", (*it).utf8() ) ) ); + } + + return translated.join( "/" ); +} + + +QString +YQPkgTechnicalDetailsView::simpleTable( ZyppSel selectable, + ZyppPkg pkg ) +{ + QString html; + + html += row( hcell( _( "Version:" ) ) + cell( pkg->edition().asString() ) ); + html += row( hcell( _( "Build Time:" ) ) + cell( pkg->buildtime() ) ); + + html += + pkg == selectable->installedObj() ? + row( hcell( _( "Install Time:" ) ) + cell( pkg->installtime() ) ) : ""; + + html += row( hcell( _( "Package Group:" ) ) + cell( formatRpmGroup( pkg ) ) ); + html += row( hcell( _( "License:" ) ) + cell( pkg->license() ) ); + html += row( hcell( _( "Installed Size:" ) ) + cell( pkg->size().asString() ) ); + html += row( hcell( _( "Download Size:" ) ) + cell( pkg->downloadSize().asString() ) ); + html += row( hcell( _( "Distribution:" ) ) + cell( pkg->distribution() ) ); + html += row( hcell( _( "Vendor:" ) ) + cell( pkg->vendor() ) ); + html += row( hcell( _( "Packager:" ) ) + cell( pkg->packager() ) ); + html += row( hcell( _( "Architecture:" ) ) + cell( pkg->arch().asString() ) ); + html += row( hcell( _( "OS:" ) ) + cell( pkg->os() ) ); + html += row( hcell( _( "Build Host:" ) ) + cell( pkg->buildhost() ) ); + html += row( hcell( _( "URL:" ) ) + cell( pkg->url() ) ); + +#ifdef FIXME_missing_in_zypp + html += row( hcell( _( "Source RPM:" ) ) + cell( pkg->sourceloc() ) ); +#endif + html += row( hcell( _( "Media No.:" ) ) + cell( pkg->mediaNr() ) ); + html += row( hcell( _( "Authors:" ) ) + authorsListCell( pkg ) ); + + html = "
      " + table( html ); + + return html; +} + + +QString +YQPkgTechnicalDetailsView::complexTable( ZyppSel selectable, + ZyppPkg installed, + ZyppPkg candidate ) +{ + ZyppPkg p1 = candidate; + ZyppPkg p2 = installed; + + QString p1_header = _( "Alternate Version" ); + QString p2_header = _( "Installed Version" ); + + QString html; + + html += row( hcell( QString( "" ) ) + hcell( "" + p1_header + "" ) + hcell( "" + p2_header + "" ) ); + + html += row( hcell( _( "Version:" ) ) + cell( p1->edition().asString() ) + cell( p2->edition().asString() ) ); + html += row( hcell( _( "Build Time:" ) ) + cell( p1->buildtime() ) + cell( p2->buildtime() ) ); + html += row( hcell( _( "Install Time:" ) ) + cell( p1->installtime() ) + cell( p2->installtime() ) ); + html += row( hcell( _( "Package Group:" ) ) + cell( formatRpmGroup( p1 ) ) + cell( formatRpmGroup( p2 ) ) ); + html += row( hcell( _( "License:" ) ) + cell( p1->license() ) + cell( p2->license() ) ); + html += row( hcell( _( "Installed Size:" ) ) + cell( p1->size().asString() ) + cell( p2->size().asString() ) ); + html += row( hcell( _( "Download Size:" ) ) + cell( p1->downloadSize().asString() ) + cell( p2->downloadSize().asString() ) ); + html += row( hcell( _( "Distribution:" ) ) + cell( p1->distribution() ) + cell( p2->distribution() ) ); + html += row( hcell( _( "Vendor:" ) ) + cell( p1->vendor() ) + cell( p2->vendor() ) ); + html += row( hcell( _( "Packager:" ) ) + cell( p1->packager() ) + cell( p2->packager() ) ); + html += row( hcell( _( "Architecture:" ) ) + cell( p1->arch().asString() ) + cell( p2->arch().asString() ) ); + html += row( hcell( _( "OS:" ) ) + cell( p1->os() ) + cell( p2->os() ) ); + html += row( hcell( _( "Build Host:" ) ) + cell( p1->buildhost() ) + cell( p2->buildhost() ) ); + html += row( hcell( _( "URL:" ) ) + cell( p1->url() ) + cell( p2->url() ) ); +#ifdef FIXME_missing_in_zypp + html += row( hcell( _( "Source RPM:" ) ) + cell( p1->sourceloc() ) + cell( p2->sourceloc() ) ); +#endif + html += row( hcell( _( "Media No.:" ) ) + cell( p1->mediaNr() ) + cell( p2->mediaNr() ) ); + html += row( hcell( _( "Authors:" ) ) + authorsListCell( p1 ) + authorsListCell( p2 ) ); + + + html = "
      " + table( html ); + + return html; +} + + +#include "YQPkgTechnicalDetailsView.moc" diff --git a/src/pkg/YQPkgTechnicalDetailsView.h b/src/pkg/YQPkgTechnicalDetailsView.h new file mode 100644 index 0000000..63c3489 --- /dev/null +++ b/src/pkg/YQPkgTechnicalDetailsView.h @@ -0,0 +1,87 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgTechnicalDetailsView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgTechnicalDetailsView_h +#define YQPkgTechnicalDetailsView_h + +#include "YQPkgGenericDetailsView.h" + + +/** + * @short Display technical details (very much like 'rpm -qi') for a ZYPP + * object - the installed instance, the candidate instance or both ( in two + * columns ) if both exist. All other available instances are ignored. + **/ +class YQPkgTechnicalDetailsView : public YQPkgGenericDetailsView +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgTechnicalDetailsView( QWidget * parent ); + + + /** + * Destructor + **/ + virtual ~YQPkgTechnicalDetailsView(); + + +protected: + + /** + * Show details for the specified zypp::ResObject: + * In this case technical data, very much like "rpm -qi". + * Overwritten from YQPkgGenericDetailsView. + **/ + virtual void showDetails( ZyppSel selectable ); + + /** + * Returns a string containing a HTML table for technical details for one + * package. + **/ + QString simpleTable( ZyppSel selectable, + ZyppPkg pkg ); + + + /** + * Returns a string containing a HTML table for technical details for two + * package instances: The installed instance and an alternate instance. + * ( usually the candidate instance ). + **/ + QString complexTable( ZyppSel selectable, + ZyppPkg installedPkg, + ZyppPkg candidatePkg ); + + /** + * Returns a string containing HTML code for a package's authors list. + **/ + QString authorsListCell( ZyppPkg pkg ) const; + + /** + * Format an RPM group. Retrieves the translated ( ! ) version. + **/ + QString formatRpmGroup( ZyppPkg pkg ) const; +}; + + +#endif // ifndef YQPkgTechnicalDetailsView_h diff --git a/src/pkg/YQPkgTextDialog.cc b/src/pkg/YQPkgTextDialog.cc new file mode 100644 index 0000000..a6f587d --- /dev/null +++ b/src/pkg/YQPkgTextDialog.cc @@ -0,0 +1,327 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgTextDialog.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + + +#include +#include +#include +#include +#include + +#include "YQPkgTextDialog.h" + +#include "QY2LayoutUtils.h" +#include "YQi18n.h" +#include "utf8.h" + +#define SPACING 6 // between subwidgets +#define MARGIN 4 // around the widget + +using std::string; + + + +YQPkgTextDialog::YQPkgTextDialog( const QString & text, QWidget * parent ) + : QDialog( parent ) +{ + buildDialog( text, parent, _( "&OK" ) ); +} + + +YQPkgTextDialog::YQPkgTextDialog( const QString & text, + QWidget * parent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ) + : QDialog( parent ) +{ + buildDialog( text, parent, acceptButtonLabel, rejectButtonLabel ); +} + + +YQPkgTextDialog::~YQPkgTextDialog() +{ + // NOP +} + + +void YQPkgTextDialog::buildDialog( const QString & text, + QWidget * parent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ) +{ + // Enable dialog resizing even without window manager + setSizeGripEnabled( true ); + + // Dialog title + setCaption( _( "YaST2" ) ); + + // Layout for the dialog ( can't simply insert a QVBox ) + + QVBoxLayout * layout = new QVBoxLayout( this, MARGIN, SPACING ); + CHECK_PTR( layout ); + + + // Text browser + + _textBrowser = new QTextBrowser( this ); + CHECK_PTR( _textBrowser ); + layout->addWidget( _textBrowser ); + layout->addSpacing(8); + _textBrowser->setText( text ); + _textBrowser->setTextFormat( Qt::RichText ); + _textBrowser->installEventFilter( this ); + + + // Button box + + QHBox * buttonBox = new QHBox( this ); + CHECK_PTR( buttonBox ); + buttonBox->setSpacing( SPACING ); + buttonBox->setMargin ( MARGIN ); + layout->addWidget( buttonBox ); + + addHStretch( buttonBox ); + + // Accept (OK) button + + _acceptButton = new QPushButton( acceptButtonLabel, buttonBox ); + CHECK_PTR( _acceptButton ); + _acceptButton->setDefault( true ); + + connect( _acceptButton, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + addHStretch( buttonBox ); + + if ( ! rejectButtonLabel.isEmpty() ) + { + // Reject (Cancel) button + + _rejectButton = new QPushButton( rejectButtonLabel, buttonBox ); + CHECK_PTR( _rejectButton ); + _rejectButton->setDefault( true ); + + connect( _rejectButton, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + addHStretch( buttonBox ); + } + else + { + _rejectButton = 0; + } + + updateGeometry(); +} + + +QSize +YQPkgTextDialog::sizeHint() const +{ + return limitToScreenSize( this, 500, 450 ); +} + + +bool +YQPkgTextDialog::eventFilter( QObject * obj, QEvent * ev ) +{ + if ( ev && ev->type() == QEvent::KeyPress ) + { + QKeyEvent * keyEvent = dynamic_cast (ev); + + if ( keyEvent ) + { + if ( keyEvent->key() == Key_Return || + keyEvent->key() == Key_Enter ) + { + _acceptButton->animateClick(); + return true; // Stop event processing + } + else if ( keyEvent->key() == Key_Escape ) + { + if ( _rejectButton ) + { + _rejectButton->animateClick(); + return true; // Stop event processing + } + } + } + } + + return false; // Don't stop event processing +} + + +void YQPkgTextDialog::setText( const QString & text ) +{ + _textBrowser->setText( text ); +} + + +void YQPkgTextDialog::setText( const string & text ) +{ + setText( fromUTF8( text ) ); +} + + +void YQPkgTextDialog::setText( ZyppSel selectable, + const string & text ) +{ + setText( htmlHeading( selectable ) + htmlParagraphs( text ) ); +} + + +void YQPkgTextDialog::showText( QWidget * parent, const QString & text ) +{ + YQPkgTextDialog * dia = new YQPkgTextDialog( text, parent ); + CHECK_PTR( dia ); + dia->exec(); + delete dia; +} + + +void YQPkgTextDialog::showText( QWidget * parent, + ZyppSel selectable, + const string & text ) +{ + showText( parent, htmlHeading( selectable ) + fromUTF8( text ) ); +} + + +bool YQPkgTextDialog::confirmText( QWidget * parent, + const QString & text, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ) +{ + YQPkgTextDialog * dia = new YQPkgTextDialog( text, + parent, + acceptButtonLabel, + rejectButtonLabel ); + CHECK_PTR( dia ); + bool confirmed = ( dia->exec() == QDialog::Accepted ); + delete dia; + + return confirmed; +} + + +bool YQPkgTextDialog::confirmText( QWidget * parent, const QString & text ) +{ + // Translators: "Accept" here refers to licenses or similar + return confirmText( parent, text, _( "&Accept" ), _( "&Cancel" ) ); +} + + +bool YQPkgTextDialog::confirmText( QWidget * parent, const char * text ) +{ + return confirmText( parent, QString( text ) ); +} + + +bool YQPkgTextDialog::confirmText( QWidget * parent, + ZyppSel selectable, + const string & text ) +{ + return confirmText( parent, htmlHeading( selectable ) + htmlParagraphs( text ) ); +} + + + + + +QString +YQPkgTextDialog::htmlEscape( const QString & plainText ) +{ + QString html = plainText; + // y2debug( "Escaping '%s'", (const char *) plainText ); + + html.replace( QRegExp( "&" ), "&" ); + html.replace( QRegExp( "<" ), "<" ); + html.replace( QRegExp( ">" ), ">" ); + + return html; +} + + + +QString +YQPkgTextDialog::htmlParagraphs( const string & rawText ) +{ + QString text = fromUTF8( rawText ); + + if ( text.contains( "" ) ) // Special doctype for preformatted HTML + return text; + + text = htmlEscape( text ); // Escape '<', '>', '&' + text.replace( "\n\n", "

      " ); // Empty lines mean new paragraph + text.prepend( "

      " ); + text.append ( "

      " ); + + return text; +} + + + +QString +YQPkgTextDialog::htmlHeading( const QString & text ) +{ + QString html = + "
      " + + text + + "

      "; + + return html; +} + + +QString +YQPkgTextDialog::htmlHeading( ZyppSel selectable ) +{ + if ( ! selectable ) + return ""; + + ZyppObj zyppObj = selectable->theObj(); + + if ( ! zyppObj ) + return ""; + + QString summary = fromUTF8( zyppObj->summary() ); + + QString html = + "
      " + + fromUTF8( zyppObj->name() ) + + ""; + + if ( ! summary.isEmpty() ) + html += " - " + summary; + + html += "

      "; + + return html; +} + + + + +#include "YQPkgTextDialog.moc" diff --git a/src/pkg/YQPkgTextDialog.h b/src/pkg/YQPkgTextDialog.h new file mode 100644 index 0000000..81f59be --- /dev/null +++ b/src/pkg/YQPkgTextDialog.h @@ -0,0 +1,181 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgTextDialog.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgTextDialog_h +#define YQPkgTextDialog_h + +#include "YQZypp.h" +#include +#include + +class QPushButton; +class QTextBrowser; + +using std::string; + + +/** + * @short Dialog that shows a scrolled (HTML) text. + **/ +class YQPkgTextDialog: public QDialog +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * Creates a dialog with a text browser and two buttons. + * This does not pop up a dialog yet. + * Use 'exec()' (inherited from QDialog). + * Or, better yet, use the static confirmText() method. + * + **/ + YQPkgTextDialog( const QString & text, + QWidget * parent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ); + /** + * Constructor. + * + * Creates a dialog with a text browser and an "OK" button. + * This does not pop up a dialog yet. + * Use 'exec()' (inherited from QDialog). + * Or, better yet, use the static showText() method. + **/ + YQPkgTextDialog( const QString & text, QWidget * parent ); + + /** + * Destructor. + **/ + virtual ~YQPkgTextDialog(); + + /** + * Reimplemented from QWidget: + * Reserve a reasonable amount of space. + **/ + virtual QSize sizeHint() const; + + /** + * Show a text and wait until the user confirmed with 'OK'. + **/ + static void showText( QWidget * parent, const QString & text ); + + /** + * Show a text with a headline identifying a selectable (name+summary). + **/ + static void showText( QWidget * parent, + ZyppSel selectable, + const string & text ); + + /** + * Let the user confirm a text. Returns "true" if the user clicked the + * accept button, false if he clicked the reject button. + **/ + static bool confirmText( QWidget * parent, + const QString & text, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel ); + + /** + * Let the use confirm a text with buttons "Accept" and "Cancel". + * Returns "true" if the user clicked "Accept", "false" on "Cancel". + **/ + static bool confirmText( QWidget * parent, const QString & text ); + static bool confirmText( QWidget * parent, const char * text ); + + /** + * Let the use confirm a text with a headline identifying a selectable + * (name+summary) with buttons "Accept" and "Cancel". + * Returns "true" if the user clicked "Accept", "false" on "Cancel". + **/ + static bool confirmText( QWidget * parent, + ZyppSel selectable, + const string & text ); + + /** + * Simple HTML formatting: Wrap paragraphs in

      ...

      + * Paragraphs are delimited by empty lines. + * Return unformatted text if it contains "". + **/ + static QString htmlParagraphs( const string & rawText ); + + /** + * Returns a uniform heading in HTML format. + **/ + static QString htmlHeading( const QString & text ); + + /** + * Returns a uniform heading in HTML format for the specified selectable: + * name and summary + **/ + static QString htmlHeading( ZyppSel selectable ); + + /** + * Escapes characters special to HTML in a ( plain text ) string, such as: + * '<' -> '<' + * '>' -> '>' + * '&' -> '&' + * + * Returns the escaped string. + **/ + static QString htmlEscape( const QString & plainText ); + + +public slots: + + /** + * Set the text contents. + **/ + void setText( const QString & text ); + void setText( const string & text ); + + /** + * Show a text with a headline identifying a zypp::ResObject ( name+summary ). + **/ + void setText( ZyppSel selectable, + const string & text ); + +protected: + + /** + * Create the dialog. Called from all constructors. + **/ + void buildDialog( const QString & text, + QWidget * parent, + const QString & acceptButtonLabel, + const QString & rejectButtonLabel = "" ); + /** + * Grab [Return] press events and close dialog. + * Inherited from QObject. + **/ + bool eventFilter( QObject * obj, QEvent * ev ); + + + // Data members + + QPushButton * _acceptButton; + QPushButton * _rejectButton; + QTextBrowser * _textBrowser; +}; + + + +#endif // ifndef YQPkgTextDialog_h diff --git a/src/pkg/YQPkgUpdateProblemFilterView.cc b/src/pkg/YQPkgUpdateProblemFilterView.cc new file mode 100644 index 0000000..944d005 --- /dev/null +++ b/src/pkg/YQPkgUpdateProblemFilterView.cc @@ -0,0 +1,116 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgUpdateProblemFilterView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + + +#define y2log_component "qt-pkg" +#include + +#include "YQPkgUpdateProblemFilterView.h" +#include "YQi18n.h" +#include "utf8.h" + +#include +#include + +using std::list; + + +YQPkgUpdateProblemFilterView::YQPkgUpdateProblemFilterView( QWidget * parent ) + : QTextBrowser( parent ) +{ + QString html = _( "\ +
      \n\ +

      Update Problem

      \n\ +

      \n\ +\n\ +The packages in this list cannot be updated automatically.\n\ +\n\ +

      \n\ +

      Possible reasons:

      \n\ +
        \n\ +
      • They are obsoleted by other packages\n\ +
      • There is no newer version to update to on any installation media\n\ +
      • They are third-party packages\n\ +
      \n\ +

      \n\ +

      \n\ +Please choose manually what to do with them.\n\ +The safest course of action is to delete them.\n\ +

      \ +" ); + + setTextFormat( Qt::RichText ); + setText( html ); +} + + +YQPkgUpdateProblemFilterView::~YQPkgUpdateProblemFilterView() +{ + // NOP +} + +void +YQPkgUpdateProblemFilterView::filterIfVisible() +{ + if ( isVisible() ) + filter(); +} + + +void +YQPkgUpdateProblemFilterView::filter() +{ + emit filterStart(); + + list problemList = zypp::getZYpp()->resolver()->problematicUpdateItems(); + + for ( list::const_iterator it = problemList.begin(); + it != problemList.end(); + ++it ) + { + ZyppPkg pkg = tryCastToZyppPkg( (*it).resolvable() ); + + if ( pkg ) + { + ZyppSel sel = _selMapper.findZyppSel( pkg ); + + if ( sel ) + { + y2milestone( "Problematic package: %s-%s", + pkg->name().c_str(), pkg->edition().asString().c_str() ); + + emit filterMatch( sel, pkg ); + } + } + + } + + emit filterFinished(); +} + + +bool +YQPkgUpdateProblemFilterView::haveProblematicPackages() +{ + return ! zypp::getZYpp()->resolver()->problematicUpdateItems().empty(); +} + + +#include "YQPkgUpdateProblemFilterView.moc" diff --git a/src/pkg/YQPkgUpdateProblemFilterView.h b/src/pkg/YQPkgUpdateProblemFilterView.h new file mode 100644 index 0000000..a35579d --- /dev/null +++ b/src/pkg/YQPkgUpdateProblemFilterView.h @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgUpdateProblemFilterView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgUpdateProblemFilterView_h +#define YQPkgUpdateProblemFilterView_h + + +#include "YQZypp.h" +#include +#include "YQPkgSelMapper.h" + + +/** + * @short Filter view for packages that made problems during update + **/ +class YQPkgUpdateProblemFilterView : public QTextBrowser +{ + Q_OBJECT + +public: + + /** + * Constructor + **/ + YQPkgUpdateProblemFilterView( QWidget * parent ); + + /** + * Destructor + **/ + virtual ~YQPkgUpdateProblemFilterView(); + + /** + * Check if there are any problematic packages at all, i.e. if it is + * worthwhile to create this widget at all + **/ + static bool haveProblematicPackages(); + + +public slots: + + /** + * Filter according to the view's rules and current selection. + * Emits those signals: + * filterStart() + * filterMatch() for each pkg that matches the filter + * filterFinished() + **/ + void filter(); + + /** + * Same as filter(), but only if this widget is currently visible. + **/ + void filterIfVisible(); + + +signals: + + /** + * Emitted when the filtering starts. Use this to clear package lists + * etc. prior to adding new entries. + **/ + void filterStart(); + + /** + * Emitted during filtering for each pkg that matches the filter. + **/ + void filterMatch( ZyppSel selectable, + ZyppPkg pkg ); + + /** + * Emitted when filtering is finished. + **/ + void filterFinished(); + + +protected: + + YQPkgSelMapper _selMapper; +}; + + + +#endif // ifndef YQPkgUpdateProblemFilterView_h diff --git a/src/pkg/YQPkgVersionsView.cc b/src/pkg/YQPkgVersionsView.cc new file mode 100644 index 0000000..64d495b --- /dev/null +++ b/src/pkg/YQPkgVersionsView.cc @@ -0,0 +1,330 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgVersionsView.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#define y2log_component "qt-pkg" + +#include +#include +#include +#include +#include +#include + +#include "YQPkgVersionsView.h" +#include "YQPkgRepoList.h" +#include "YQIconPool.h" +#include "YQi18n.h" +#include "utf8.h" + + +YQPkgVersionsView::YQPkgVersionsView( QWidget * parent, bool userCanSwitch ) + : QY2ListView( parent ) +{ + _selectable = 0; + _parentTab = dynamic_cast (parent); + _userCanSwitch = userCanSwitch; + + _versionCol = -42; + _archCol = -42; + _productCol = -42; + _urlCol = -42; + _repoCol = -42; + _statusCol = -42; + _nameCol = -42; + _summaryCol = -42; + + int numCol = 0; + addColumn( _( "Version" ) ); _versionCol = numCol++; + addColumn( _( "Arch." ) ); _archCol = numCol++; + addColumn( _( "Product" ) ); _productCol = numCol++; + addColumn( _( "Repository" ) ); _repoCol = numCol++; + addColumn( _( "URL" ) ); _urlCol = numCol++; + _statusCol = _productCol; + + _nameCol = _versionCol; + _summaryCol = _repoCol; + + setSortByInsertionSequence( true ); + + // saveColumnWidths(); // Minimize column widths + // header()->hide(); + + + if ( _parentTab ) + { + connect( parent, SIGNAL( currentChanged(QWidget *) ), + this, SLOT ( reload (QWidget *) ) ); + } + + connect( this, SIGNAL( selectionChanged () ), + this, SLOT ( checkForChangedCandidate() ) ); +} + + +YQPkgVersionsView::~YQPkgVersionsView() +{ + // NOP +} + + +void +YQPkgVersionsView::reload( QWidget * newCurrent ) +{ + if ( newCurrent == this ) + showDetailsIfVisible( _selectable ); +} + + +void +YQPkgVersionsView::showDetailsIfVisible( ZyppSel selectable ) +{ + _selectable = selectable; + + if ( _parentTab ) // Is this view embedded into a tab widget? + { + if ( _parentTab->currentPage() == this ) // Is this page the topmost? + showDetails( selectable ); + } + else // No tab parent - simply show data unconditionally. + { + showDetails( selectable ); + } +} + + +void +YQPkgVersionsView::showDetails( ZyppSel selectable ) +{ + _selectable = selectable; + clear(); + + if ( ! selectable ) + return; + + QY2CheckListItem * root = new QY2CheckListItem( this, selectable->theObj()->name().c_str(), + QCheckListItem::Controller ); + CHECK_PTR( root ); + root->setOpen( true ); + + bool installedIsAvailable = false; + + zypp::ui::Selectable::available_iterator it = selectable->availableBegin(); + + while ( it != selectable->availableEnd() ) + { + new YQPkgVersion( this, root, selectable, *it, _userCanSwitch ); + + if ( selectable->installedObj() && + selectable->installedObj()->edition() == (*it)->edition() && + selectable->installedObj()->arch() == (*it)->arch() ) + // FIXME: In future releases, also the vendor will make a difference + installedIsAvailable = true; + +#if 0 + // DEBUG + new YQPkgVersion( this, root, selectable, *it, _userCanSwitch ); + new YQPkgVersion( this, root, selectable, *it, _userCanSwitch ); + new YQPkgVersion( this, root, selectable, *it, _userCanSwitch ); + // DEBUG +#endif + ++it; + } + + if ( selectable->hasInstalledObj() && ! installedIsAvailable ) + new YQPkgVersion( this, root, selectable, selectable->installedObj(), false ); +} + + +void +YQPkgVersionsView::checkForChangedCandidate() +{ + if ( ! firstChild() || ! _selectable ) + return; + + QListViewItem * item = firstChild()->firstChild(); + + while ( item ) + { + YQPkgVersion * versionItem = dynamic_cast (item); + + if ( versionItem && versionItem->isOn() ) + { + ZyppObj newCandidate = versionItem->zyppObj(); + + if ( newCandidate != _selectable->candidateObj() ) + { + y2milestone( "Candidate changed" ); + + // Change status of selectable + + ZyppStatus status = _selectable->status(); + + if ( _selectable->installedObj() && + _selectable->installedObj()->arch() == newCandidate->arch() && + _selectable->installedObj()->edition() == newCandidate->edition() ) + { + // Switch back to the original instance - + // the version that was previously installed + status = S_KeepInstalled; + } + else + { + switch ( status ) + { + case S_KeepInstalled: + case S_Protected: + case S_AutoDel: + case S_AutoUpdate: + case S_Del: + case S_Update: + + status = S_Update; + break; + + case S_NoInst: + case S_Taboo: + case S_Install: + case S_AutoInstall: + status = S_Install; + break; + } + } + + _selectable->set_status( status ); + + + // Set candidate + + _selectable->setCandidate( newCandidate ); + emit candidateChanged( newCandidate ); + return; + } + } + + item = item->nextSibling(); + } +} + + +QSize +YQPkgVersionsView::minimumSizeHint() const +{ + return QSize( 0, 0 ); +} + + + + + + +YQPkgVersion::YQPkgVersion( YQPkgVersionsView * pkgVersionList, + QY2CheckListItem * parent, + ZyppSel selectable, + ZyppObj zyppObj, + bool enabled ) + : QY2CheckListItem( parent, "", + enabled ? + QCheckListItem::RadioButton : + QCheckListItem::Controller ) // cheap way to make it read-only + , _pkgVersionList( pkgVersionList ) + , _selectable( selectable ) + , _zyppObj( zyppObj ) +{ + setOn( _zyppObj == _selectable->candidateObj() ); + + if ( versionCol() >= 0 ) setText( versionCol(), zyppObj->edition().asString().c_str() ); + if ( archCol() >= 0 ) setText( archCol(), zyppObj->arch().asString().c_str() ); + if ( repoCol() >= 0 ) setText( repoCol(), fromUTF8(zyppObj->repository().info().alias()) ); + if ( productCol() >= 0 ) + { + ZyppProduct product = YQPkgRepoListItem::singleProduct( zyppObj->repository() ); + + if ( product ) + setText( productCol(), product->summary() ); + } + if ( urlCol() >= 0 ) + { + zypp::Url repoUrl; + + if ( ! zyppObj->repository().info().baseUrlsEmpty() ) + repoUrl = *zyppObj->repository().info().baseUrlsBegin(); + + setText( urlCol(), repoUrl.asString().c_str() ); + } + + if ( _selectable->hasInstalledObj() ) + { + if ( _zyppObj->edition() == _selectable->installedObj()->edition() && + _zyppObj->arch() == _selectable->installedObj()->arch() ) + { + setPixmap( statusCol(), YQIconPool::pkgKeepInstalled() ); + setBackgroundColor( QColor( 0xF0, 0xF0, 0xF0 ) ); // light grey + setTextColor( QColor( 0, 0x90, 0 ) ); // green + } + } +} + + +YQPkgVersion::~YQPkgVersion() +{ + // NOP +} + + +QString +YQPkgVersion::toolTip(int) +{ + QString tip; + + if ( zyppObj() == selectable()->installedObj() ) + tip = _( "This version is installed in your system." ); + + return tip; +} + + +/** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + **/ +int +YQPkgVersion::compare( QListViewItem * otherListViewItem, + int col, + bool ascending ) const +{ + YQPkgVersion * other = dynamic_cast (otherListViewItem); + + if ( other ) + { + if ( this->zyppObj()->edition() < other->zyppObj()->edition() ) return -1; + if ( this->zyppObj()->edition() > other->zyppObj()->edition() ) return 1; + return 0; + } + + // Fallback: Use parent class method + return QY2CheckListItem::compare( otherListViewItem, col, ascending ); +} + + + +#include "YQPkgVersionsView.moc" diff --git a/src/pkg/YQPkgVersionsView.h b/src/pkg/YQPkgVersionsView.h new file mode 100644 index 0000000..b52c620 --- /dev/null +++ b/src/pkg/YQPkgVersionsView.h @@ -0,0 +1,203 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQPkgVersionsView.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQPkgVersionsView_h +#define YQPkgVersionsView_h + +#include "QY2ListView.h" +#include "YQZypp.h" + + +class QTabWidget; + + +/** + * @short Package version selector: Display a list of available versions from + * all the different installation sources and let the user change the candidate + * version for installation / update. + **/ +class YQPkgVersionsView : public QY2ListView +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * 'userCanSwitchVersions' specifies whether or not the user is allowed to + * switch between package versions - e.g. in patch mode, he can't. + **/ + YQPkgVersionsView( QWidget * parent, bool userCanSwitchVersions ); + + /** + * Destructor + **/ + virtual ~YQPkgVersionsView(); + + /** + * Returns the minimum size required for this widget. + * Inherited from QWidget. + **/ + virtual QSize minimumSizeHint() const; + + + // Column numbers + + int versionCol() const { return _versionCol; } + int archCol() const { return _archCol; } + int productCol() const { return _productCol; } + int urlCol() const { return _urlCol; } + int repoCol() const { return _repoCol; } + int nameCol() const { return _nameCol; } + int summaryCol() const { return _summaryCol; } + int statusCol() const { return _statusCol; } + + +public slots: + + /** + * Show details for the specified package. + * Delayed ( optimized ) display if this is embedded into a QTabWidget + * parent: In this case, wait until this page becomes visible. + **/ + void showDetailsIfVisible( ZyppSel selectable ); + + // slot clear() inherited from QListView + + + /** + * Show data for the last package. + **/ + void reload( QWidget * newCurrent ); + + +signals: + + /** + * Emitted when the user changes the + **/ + void candidateChanged( ZyppObj newCandidate ); + + +protected slots: + + /** + * Check for changed candidates + **/ + void checkForChangedCandidate(); + + +protected: + + /** + * Show details for the specified package. + **/ + void showDetails( ZyppSel selectable ); + + + // Data members + + QTabWidget * _parentTab; + ZyppSel _selectable; + bool _userCanSwitch; + + int _versionCol; + int _archCol; + int _productCol; + int _urlCol; + int _repoCol; + int _nameCol; + int _summaryCol; + int _statusCol; +}; + + +class YQPkgVersion: public QY2CheckListItem +{ +public: + + /** + * Constructor. Creates a YQPkgVersion item that corresponds to the package + * manager object that 'pkg' refers to. + **/ + YQPkgVersion( YQPkgVersionsView * pkgVersionList, + QY2CheckListItem * parent, + ZyppSel selectable, + ZyppObj zyppObj, + bool enabled = true ); + + /** + * Destructor + **/ + virtual ~YQPkgVersion(); + + /** + * Returns the original ZYPP object + **/ + ZyppObj zyppObj() const { return _zyppObj; } + + /** + * Returns the original ZYPP selectable + **/ + ZyppSel selectable() const { return _selectable; } + + /** + * Comparison function used for sorting the list. + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + /** + * Returns a tool tip text for a specific column of this item. + * 'column' is -1 if the mouse pointer is in the tree indentation area. + * + * Reimplemented from QY2CheckListItem. + **/ + virtual QString toolTip( int column ); + + + // Columns + + int versionCol() const { return _pkgVersionList->versionCol(); } + int productCol() const { return _pkgVersionList->productCol(); } + int urlCol() const { return _pkgVersionList->urlCol(); } + int repoCol() const { return _pkgVersionList->repoCol(); } + int statusCol() const { return _pkgVersionList->statusCol(); } + int archCol() const { return _pkgVersionList->archCol(); } + + +protected: + + // Data members + + YQPkgVersionsView * _pkgVersionList; + ZyppSel _selectable; + ZyppObj _zyppObj; +}; + + +#endif // ifndef YQPkgVersionsView_h diff --git a/src/pkg/YQSimplePatchSelector.cc b/src/pkg/YQSimplePatchSelector.cc new file mode 100644 index 0000000..94d110e --- /dev/null +++ b/src/pkg/YQSimplePatchSelector.cc @@ -0,0 +1,243 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSimplePatchSelector.cc + + Author: Stefan Hundhammer + + Textdomain "packages-qt" + +/-*/ + +#include +#include +#include +#include +#include + +#define y2log_component "qt-pkg" +#include + +#include "QY2LayoutUtils.h" + +#include "YQSimplePatchSelector.h" +#include "YQPkgConflictDialog.h" +#include "YQPkgDiskUsageList.h" +#include "YQPkgPatchFilterView.h" +#include "YQPkgPatchList.h" +#include "YQWizard.h" +#include "YQDialog.h" + +#include "utf8.h" +#include "YQUI.h" +#include "YEvent.h" +#include "YQi18n.h" + + +using std::max; +using std::string; + +#define SHOW_DISK_USAGE 0 + +#define SPACING 6 +#define MARGIN 6 + + + +YQSimplePatchSelector::YQSimplePatchSelector( YWidget * parent, long modeFlags ) + : YQPackageSelectorBase( parent, modeFlags ) +{ + _patchFilterView = 0; + _patchList = 0; + _diskUsageList = 0; + _wizard = findWizard(); + + basicLayout(); + makeConnections(); + +#if 0 + _patchList->fillList(); + _patchList->selectSomething(); +#endif + + if ( _diskUsageList ) + _diskUsageList->updateDiskUsage(); +} + + + +YQWizard * +YQSimplePatchSelector::findWizard() const +{ + YQWizard * wizard = 0; + + YQDialog * dialog = dynamic_cast ( YDialog::currentDialog() ); + + if ( dialog ) + wizard = dialog->findWizard(); + + return wizard; +} + + + +void +YQSimplePatchSelector::basicLayout() +{ + QSplitter * splitter = new QSplitter( QSplitter::Vertical, this ); + CHECK_PTR( splitter ); + splitter->setMargin( MARGIN ); + + // + // PatchFilterView + // + + QVBox * upper_vbox = new QVBox( splitter ); + CHECK_PTR( upper_vbox ); + splitter->setResizeMode( upper_vbox, QSplitter::Stretch ); + + _patchFilterView = new YQPkgPatchFilterView( upper_vbox ); + CHECK_PTR( _patchFilterView ); + + _patchList = _patchFilterView->patchList(); + CHECK_PTR( _patchList ); + + addVSpacing( upper_vbox, MARGIN ); + + // + // Disk Usage + // + + +#if SHOW_DISK_USAGE + QVBox * lower_vbox = new QVBox( splitter ); + CHECK_PTR( lower_vbox ); + addVSpacing( lower_vbox, MARGIN ); + + _diskUsageList = new YQPkgDiskUsageList( lower_vbox ); + CHECK_PTR( _diskUsageList ); + + splitter->setResizeMode( lower_vbox, QSplitter::FollowSizeHint ); +#endif + + + // + // Buttons + // + + if ( _wizard ) // No button box - add "Details..." button here + { + // + // "Details" button + // + + addVSpacing( this, SPACING ); + + QHBox * hbox = new QHBox( this ); + CHECK_PTR( hbox ); + + QPushButton * details_button = new QPushButton( _( "&Details..." ), hbox ); + CHECK_PTR( details_button ); + + connect( details_button, SIGNAL( clicked() ), + this, SLOT ( detailedPackageSelection() ) ); + + addHStretch( hbox ); + } + else // ! _wizard + { + layoutButtons( this ); + } +} + + +void +YQSimplePatchSelector::layoutButtons( QWidget * parent ) +{ + QHBox * button_box = new QHBox( parent ); + CHECK_PTR( button_box ); + button_box->setMargin ( MARGIN ); + button_box->setSpacing( SPACING ); + + + QPushButton * details_button = new QPushButton( _( "&Details..." ), button_box ); + CHECK_PTR( details_button ); + details_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( details_button, SIGNAL( clicked() ), + this, SLOT ( detailedPackageSelection() ) ); + + + addHStretch( button_box ); + + QPushButton * cancel_button = new QPushButton( _( "&Cancel" ), button_box ); + CHECK_PTR( cancel_button ); + cancel_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( cancel_button, SIGNAL( clicked() ), + this, SLOT ( reject() ) ); + + + QPushButton * accept_button = new QPushButton( _( "&Accept" ), button_box ); + CHECK_PTR( accept_button ); + accept_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); // hor/vert + + connect( accept_button, SIGNAL( clicked() ), + this, SLOT ( accept() ) ); + + button_box->setFixedHeight( button_box->sizeHint().height() ); +} + + + +void +YQSimplePatchSelector::makeConnections() +{ + if ( _patchList && _diskUsageList ) + { + connect( _patchList, SIGNAL( updatePackages() ), + _diskUsageList, SLOT ( updateDiskUsage() ) ); + } + + y2milestone( "Connection set up" ); + + if ( _wizard ) + { + connect( _wizard, SIGNAL( nextClicked() ), + this, SLOT ( accept() ) ); + + connect( _wizard, SIGNAL( backClicked() ), + this, SLOT ( reject() ) ); + + connect( _wizard, SIGNAL( abortClicked() ), + this, SLOT ( reject() ) ); + } +} + + +void +YQSimplePatchSelector::detailedPackageSelection() +{ + y2milestone( "\"Details..\" button clicked" ); + YQUI::ui()->sendEvent( new YMenuEvent( YCPSymbol( "details" ) ) ); +} + + +void +YQSimplePatchSelector::debugTrace() +{ + y2warning( "debugTrace" ); +} + + + +#include "YQSimplePatchSelector.moc" diff --git a/src/pkg/YQSimplePatchSelector.h b/src/pkg/YQSimplePatchSelector.h new file mode 100644 index 0000000..900589b --- /dev/null +++ b/src/pkg/YQSimplePatchSelector.h @@ -0,0 +1,88 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQSimplePatchSelector.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQSimplePatchSelector_h +#define YQSimplePatchSelector_h + +#include +#include +#include + +#include "YQPackageSelectorBase.h" + + +class QPushButton; + +class YQPkgPatchFilterView; +class YQPkgPatchList; +class YQWizard; + + +class YQSimplePatchSelector : public YQPackageSelectorBase +{ + Q_OBJECT + +public: + + YQSimplePatchSelector( YWidget * parent, long modeFlags ); + + +protected slots: + + /** + * User clicked on "Details..." - start the detailed package selection. + * This will return from UI::RunPkgSelection() with `details . + **/ + void detailedPackageSelection(); + + /** + * Debugging + **/ + void debugTrace(); + + +protected: + + // Layout methods - create and layout widgets + + void basicLayout(); + void layoutButtons ( QWidget * parent ); + + /** + * Find the wizard in the current dialog, if there is any. + * Returns 0 if there is none. + **/ + YQWizard * findWizard() const; + + /** + * Establish Qt signal / slot connections. + **/ + void makeConnections(); + + + // Data members + + YQPkgPatchFilterView * _patchFilterView; + YQPkgPatchList * _patchList; + YQWizard * _wizard; +}; + + + +#endif // YQSimplePatchSelector_h diff --git a/src/pkg/YQZypp.h b/src/pkg/YQZypp.h new file mode 100644 index 0000000..c55b7a5 --- /dev/null +++ b/src/pkg/YQZypp.h @@ -0,0 +1,136 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: YQZypp.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef YQZypp_h +#define YQZypp_h + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using zypp::ui::S_Protected; +using zypp::ui::S_Taboo; +using zypp::ui::S_Del; +using zypp::ui::S_Update; +using zypp::ui::S_Install; +using zypp::ui::S_AutoDel; +using zypp::ui::S_AutoUpdate; +using zypp::ui::S_AutoInstall; +using zypp::ui::S_KeepInstalled; +using zypp::ui::S_NoInst; + + +// +// Typedefs to make those nested namespaces human-readable +// + +typedef zypp::ui::Status ZyppStatus; +typedef zypp::ui::Selectable::Ptr ZyppSel; +typedef zypp::ResObject::constPtr ZyppObj; +typedef zypp::Package::constPtr ZyppPkg; +typedef zypp::Selection::constPtr ZyppSelection; +typedef zypp::Pattern::constPtr ZyppPattern; +typedef zypp::Language::constPtr ZyppLang; +typedef zypp::Patch::constPtr ZyppPatch; +typedef zypp::Product::constPtr ZyppProduct; + +typedef zypp::ResPoolProxy ZyppPool; +typedef zypp::ResPoolProxy::const_iterator ZyppPoolIterator; +typedef zypp::ResPoolProxy::repository_iterator ZyppRepositoryIterator; + +inline ZyppPool zyppPool() { return zypp::getZYpp()->poolProxy(); } + +template ZyppPoolIterator zyppBegin() { return zyppPool().byKindBegin(); } +template ZyppPoolIterator zyppEnd() { return zyppPool().byKindEnd(); } + +inline ZyppPoolIterator zyppPkgBegin() { return zyppBegin(); } +inline ZyppPoolIterator zyppPkgEnd() { return zyppEnd(); } + +inline ZyppPoolIterator zyppSelectionsBegin() { return zyppBegin(); } +inline ZyppPoolIterator zyppSelectionsEnd() { return zyppEnd(); } + +inline ZyppPoolIterator zyppPatternsBegin() { return zyppBegin(); } +inline ZyppPoolIterator zyppPatternsEnd() { return zyppEnd(); } + +inline ZyppPoolIterator zyppLangBegin() { return zyppBegin(); } +inline ZyppPoolIterator zyppLangEnd() { return zyppEnd(); } + +inline ZyppPoolIterator zyppPatchesBegin() { return zyppBegin(); } +inline ZyppPoolIterator zyppPatchesEnd() { return zyppEnd(); } + +inline ZyppPoolIterator zyppProductsBegin() { return zyppBegin(); } +inline ZyppPoolIterator zyppProductsEnd() { return zyppEnd(); } + +inline ZyppRepositoryIterator ZyppRepositoriesBegin() { return zyppPool().knownRepositoriesBegin(); } +inline ZyppRepositoryIterator ZyppRepositoriesEnd() { return zyppPool().knownRepositoriesEnd(); } + +inline ZyppPkg tryCastToZyppPkg( ZyppObj zyppObj ) +{ + return zypp::dynamic_pointer_cast( zyppObj ); +} + +inline ZyppSelection tryCastToZyppSelection( ZyppObj zyppObj ) +{ + return zypp::dynamic_pointer_cast( zyppObj ); +} + +inline ZyppPattern tryCastToZyppPattern( ZyppObj zyppObj ) +{ + return zypp::dynamic_pointer_cast( zyppObj ); +} + +inline ZyppLang tryCastToZyppLang( ZyppObj zyppObj ) +{ + return zypp::dynamic_pointer_cast( zyppObj ); +} + +inline ZyppPatch tryCastToZyppPatch( ZyppObj zyppObj ) +{ + return zypp::dynamic_pointer_cast( zyppObj ); +} + +inline ZyppProduct tryCastToZyppProduct( ZyppObj zyppObj ) +{ + return zypp::dynamic_pointer_cast( zyppObj ); +} + + +template bool contains( const std::set & container, T search ) +{ + return container.find( search ) != container.end(); +} + + +template bool bsearch( const std::vector & sorted_vector, T search ) +{ + return binary_search( sorted_vector.begin(), sorted_vector.end(), search); +} + + +#endif // YQZypp_h diff --git a/src/pkg/grep-fixme b/src/pkg/grep-fixme new file mode 100755 index 0000000..f6f3229 --- /dev/null +++ b/src/pkg/grep-fixme @@ -0,0 +1,2 @@ +#!/usr/bin/perl -n +print "$ARGV: $_" if /#ifdef FIXME/../#endif/; diff --git a/src/pkg/icons/.cvsignore b/src/pkg/icons/.cvsignore new file mode 100644 index 0000000..859d4da --- /dev/null +++ b/src/pkg/icons/.cvsignore @@ -0,0 +1,4 @@ +Makefile +Makefile.in +*.bak +*~ diff --git a/src/pkg/icons/Makefile.am b/src/pkg/icons/Makefile.am new file mode 100644 index 0000000..468d9d0 --- /dev/null +++ b/src/pkg/icons/Makefile.am @@ -0,0 +1,75 @@ +# +# Makefile.am for qt/src/include/icons +# + +# pkgincludedir = $(includedir)/y2qt/icons + +noinst_HEADERS = \ + autodel.xpm \ + autodel_disabled.xpm \ + autoinstall.xpm \ + autoinstall_disabled.xpm \ + autoupdate.xpm \ + autoupdate_disabled.xpm \ + checklist_off.xpm \ + checklist_on.xpm \ + del.xpm \ + del_disabled.xpm \ + delete_conflict.xpm \ + install.xpm \ + install_disabled.xpm \ + keepinstalled.xpm \ + keepinstalled_disabled.xpm \ + noinst.xpm \ + noinst_disabled.xpm \ + normal_conflict.xpm \ + protected.xpm \ + protected_disabled.xpm \ + satisfied.xpm \ + sel_autodel.xpm \ + sel_autodel_disabled.xpm \ + sel_autoinstall.xpm \ + sel_autoinstall_disabled.xpm \ + sel_autoupdate.xpm \ + sel_autoupdate_disabled.xpm \ + select_conflict.xpm \ + step_current.xpm \ + step_done.xpm \ + step_todo.xpm \ + stop.xpm \ + taboo.xpm \ + taboo_disabled.xpm \ + tree_minus.xpm \ + tree_plus.xpm \ + unresolvable_conflict.xpm \ + update.xpm \ + update_disabled.xpm \ + warning_sign.xpm + + +# Those icons are used at runtime by the online help system. +# For everything else, they are included in the source code - +# no need to install all the other icons as well. +# +# -sh 2003-01-14 + +helpimagesdir = $(imagedir) + +helpimages_DATA = \ + autodel.xpm \ + autoinstall.xpm \ + autoupdate.xpm \ + del.xpm \ + install.xpm \ + keepinstalled.xpm \ + noinst.xpm \ + protected.xpm \ + sel_autodel.xpm \ + sel_autoinstall.xpm \ + sel_autoupdate.xpm \ + taboo.xpm \ + update.xpm + +EXTRA_DIST = $(helpimages_DATA) + +CLEANFILES = y2qt.kdoc diff --git a/src/pkg/icons/autodel.xpm b/src/pkg/icons/autodel.xpm new file mode 100644 index 0000000..eb1c802 --- /dev/null +++ b/src/pkg/icons/autodel.xpm @@ -0,0 +1,52 @@ +/* XPM */ +static const char *autodel_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 30 1", +" c black", +". c #1e1e1e", +"X c #232323", +"o c #2c2c2c", +"O c #323232", +"+ c #3a3a3a", +"@ c gray27", +"# c #4b4b4b", +"$ c #565656", +"% c #595959", +"& c #626262", +"* c #6a6a6a", +"= c #717171", +"- c gray48", +"; c #828282", +": c #8e8e8e", +"> c #929292", +", c #9d9d9d", +"< c #a4a4a4", +"1 c #aaaaaa", +"2 c gray70", +"3 c gray73", +"4 c #c3c3c3", +"5 c #cbcbcb", +"6 c #d5d5d5", +"7 c #d8d8d8", +"8 c #e2e2e2", +"9 c #f4f4f4", +"0 c white", +"q c None", +/* pixels */ +"qqqqqqqqq000>-000qqqqq", +"qqqqqqq005;&08o&<00qqq", +"qqqqqq07$=17, $<%O70qq", +"qqqqqq0$007444353- 0qq", +"00qqqq0$8400005>@# 0qq", +"0 0qqqq7%<77,<;*% 7qqq", +"0 0qqq0$%>+=@OXX 0qqq", +"0 0qq0%<4*>*#+X 0qqq", +"0 0q0$>0,4;:#o 0qqq", +"0 00$:0-9%1%O 0qqq", +"0 00$:0-0%1$O 0qqq", +"0 0q0$:0:9*,$o 0qqq", +"0 0qq0%80,8=;$O 0qqq", +"0 0qqq01O-281<*.10qqq", +"0 0qqqqq03%O @%<0qqqq", +"00qqqqqqq00000000qqqqq" +}; diff --git a/src/pkg/icons/autodel_disabled.xpm b/src/pkg/icons/autodel_disabled.xpm new file mode 100644 index 0000000..084a566 --- /dev/null +++ b/src/pkg/icons/autodel_disabled.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static const char *autodel_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 17 1", +" c gray50", +". c #8e8e8e", +"X c #949494", +"o c #9a9a9a", +"O c #a3a3a3", +"+ c #ababab", +"@ c gray70", +"# c #bbbbbb", +"$ c #c3c3c3", +"% c #cccccc", +"& c #d2d2d2", +"* c #dbdbdb", +"= c #e2e2e2", +"- c #ececec", +"; c #f1f1f1", +": c #fefefe", +"> c None", +/* pixels */ +">>>>>>>>>:::%#:::>>>>>", +">>>>>>>::=#@:;X@%::>>>", +">>>>>>:-+#&;% +%+o-:>>", +">>>>>>:+::-*==*=*# :>>", +"::>>>>:+;=::::=%OO :>>", +": :>>>>-+%--%%$@+ ->>>", +": :>>>:+@%o#OoX. :>>>", +": :>>:+%*@%@OoX :>>>", +": :>:+$:%=$$OX :>>>", +": ::+%:#:+&+X :>>>", +": ::+$:#:@&+o :>>>", +": :>:+$:$;#%+X :>>>", +": :>>:+;:%;#$+X :>>>", +": :>>>:&o#*;%%@X&:>>>", +": :>>>>>:*+o O+%:>>>>", +"::>>>>>>>::::::::>>>>>" +}; diff --git a/src/pkg/icons/autoinstall.xpm b/src/pkg/icons/autoinstall.xpm new file mode 100644 index 0000000..7b41e1d --- /dev/null +++ b/src/pkg/icons/autoinstall.xpm @@ -0,0 +1,40 @@ +/* XPM */ +static const char *autoinstall_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 18 1", +" c #000000", +". c #050805", +"X c #070c08", +"o c #0b0d0a", +"O c #10120f", +"+ c #151a16", +"@ c #1b1c1a", +"# c #1d221e", +"$ c gray57", +"% c gray61", +"& c #adadad", +"* c #d5d5d5", +"= c #d8d8d8", +"- c #e6e6e6", +"; c #efefef", +": c #f2f2f2", +"> c #fefefe", +", c None", +/* pixels */ +",,,,,>>>>>>>>>>>>>>>>,", +",,,,,> @ o X X oO>,", +",,,,,>o>>>>>>>>>>>> >,", +",,,,,> >>>>>>>>>>>> :,", +">>,,,> >>>>>>>>>> >*,", +"> >,,> >>>>>>>>> >,", +"> >,> >>>-:>>> >%,", +"> >> > >*;> > &,", +"> >> >> >$ *,", +"> >> >$& :,", +"> >=> @ >$&* >,", +"> > :*> >$&*: >,", +"> >>X>:*> >$&*:> >,", +"> >,> >>:*>>$&*:>> >,", +"> >,,> # . + >,", +">>,,,>>>>>>:--:>>>>>>," +}; diff --git a/src/pkg/icons/autoinstall_disabled.xpm b/src/pkg/icons/autoinstall_disabled.xpm new file mode 100644 index 0000000..67c6c8a --- /dev/null +++ b/src/pkg/icons/autoinstall_disabled.xpm @@ -0,0 +1,35 @@ +/* XPM */ +static const char *autoinstall_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 13 1", +" c gray50", +". c #7f807f", +"X c #828382", +"o c #878887", +"O c #8b8c8b", +"+ c #8e908e", +"@ c gray78", +"# c #c9c9c9", +"$ c gray84", +"% c #eaeaea", +"& c #f3f3f3", +"* c #fefefe", +"= c None", +/* pixels */ +"=====****************=", +"=====*.O Xo.XX X..oo*=", +"=====*o************.*=", +"=====* ************.*=", +"**===*.********** *%=", +"* *==*.********* *=", +"* *=*.***&**** *@=", +"* **.* *%&* *.$=", +"* ** ** .*@.%=", +"* ** *@$.*=", +"* *%* O *#$%.*=", +"* *X&%* *@$%&.*=", +"* **X**%* *@$%** *=", +"* *=*X**&%**@$%&** *=", +"* *==*.O ...X...OX*=", +"**===*******&%*******=" +}; diff --git a/src/pkg/icons/autoupdate.xpm b/src/pkg/icons/autoupdate.xpm new file mode 100644 index 0000000..00a4a7e --- /dev/null +++ b/src/pkg/icons/autoupdate.xpm @@ -0,0 +1,58 @@ +/* XPM */ +static const char *autoupdate_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 36 1", +" c #000000", +". c #222222", +"X c gray17", +"o c #353535", +"O c #555555", +"+ c #606060", +"@ c #7b7b7b", +"# c #699b23", +"$ c #7ca83f", +"% c #7fa944", +"& c #80aa45", +"* c #8ab055", +"= c #9cba71", +"- c #a0bf75", +"; c #838383", +": c #939393", +"> c gray64", +", c gray68", +"< c #b3b3b3", +"1 c #bcbcbc", +"2 c #aac584", +"3 c #b1cb8d", +"4 c #c1d1aa", +"5 c #c9dab2", +"6 c #c6c6c6", +"7 c #cbcbcb", +"8 c gray84", +"9 c #d6dbd0", +"0 c #dadada", +"q c #dde9ce", +"w c #e4e4e4", +"e c #ebebeb", +"r c #ecf1e6", +"t c #f4f4f4", +"y c #fefefe", +"u c None", +/* pixels */ +"uuuuuuuuuuuuuuuuuuuuuu", +"uuuuuuuuuuyyttttuuuuuu", +"uuuuuuuuyt5-%#%=4tuuuu", +"uuuuuuuyr2######e7euuu", +"yyuuuuyy2#$3qyqyyw0euu", +"y yuuuy5#$5yyyyyy 80uu", +"y yuyy=#3yyyyyy o7eu", +"y yy#######yy 1wu", +"y y*#####yy X0u", +"y e####yy 0u", +"y t*##yyyyyy@ O<0u", +"y yye#yyyyyy>. ;1uu", +"y yuyweyy6y6@. +,7uu", +"y yuuut9w +>1uuu", +"y yuuuuue:O. XO;,1uuuu", +"yyuuuuuuuu071<<1uuuuuu" +}; diff --git a/src/pkg/icons/autoupdate_disabled.xpm b/src/pkg/icons/autoupdate_disabled.xpm new file mode 100644 index 0000000..84bf9b6 --- /dev/null +++ b/src/pkg/icons/autoupdate_disabled.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static const char *autoupdate_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 17 1", +" c gray50", +". c #818181", +"X c gray56", +"o c #939393", +"O c #9a9a9a", +"+ c #aeaeae", +"@ c gray69", +"# c #bababa", +"$ c #c0c0c0", +"% c #cacaca", +"& c #d3d3d3", +"* c #dcdcdc", +"= c #e3e3e3", +"- c #ececec", +"; c #f4f4f4", +": c #fefefe", +"> c None", +/* pixels */ +">>>>>>>>>>>>>>>>>>>>>>", +">>>>>>>>>>:::;;:>>>>>>", +">>>>>>>>::=%#+#%=:>>>>", +">>>>>>>:;&++++++;=;>>>", +"::>>>>::&+#&-:-::;=;>>", +": :>>>:=+#=:::::: -;>>", +": :>::%+&:::::: O=;>", +": ::+++++++:: *;>", +": :$+++++:: o->", +": :++++:: ->", +": ;#++::::::# +*->", +": ::;+::::::&o #*>>", +": :>:;;::=:=#X +*=>>", +": :>>>:=; +%*>>>", +": :>>>>>;%+X o+$&=>>>>", +"::>>>>>>>>-==&**>>>>>>" +}; diff --git a/src/pkg/icons/checklist_off.xpm b/src/pkg/icons/checklist_off.xpm new file mode 100644 index 0000000..cb70c3a --- /dev/null +++ b/src/pkg/icons/checklist_off.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static const char *checklist_off_xpm[]={ +"20 20 3 1", +". c None", +"a c #000000", +"# c #ffffff", +"....................", +"....................", +"..################..", +"..#aaaaaaaaaaaaaa#..", +"..#aaaaaaaaaaaaaa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aaaaaaaaaaaaaa#..", +"..#aaaaaaaaaaaaaa#..", +"..################..", +"....................", +"...................."}; diff --git a/src/pkg/icons/checklist_on.xpm b/src/pkg/icons/checklist_on.xpm new file mode 100644 index 0000000..df1ed2d --- /dev/null +++ b/src/pkg/icons/checklist_on.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static const char *checklist_on_xpm[]={ +"20 20 3 1", +". c None", +"a c #000000", +"# c #ffffff", +"....................", +"....................", +"..################..", +"..#aaaaaaaaaaaaaa#..", +"..#aaaaaaaaaaaaaa#..", +"..#aa##########aa#..", +"..#aa#######aa#aa#..", +"..#aa######aaa#aa#..", +"..#aa#####aaa##aa#..", +"..#aaaa##aaa###aa#..", +"..#aaaaaaaa####aa#..", +"..#aa#aaaa#####aa#..", +"..#aa##aa######aa#..", +"..#aa##########aa#..", +"..#aa##########aa#..", +"..#aaaaaaaaaaaaaa#..", +"..#aaaaaaaaaaaaaa#..", +"..################..", +"....................", +"...................."}; diff --git a/src/pkg/icons/del.xpm b/src/pkg/icons/del.xpm new file mode 100644 index 0000000..2748962 --- /dev/null +++ b/src/pkg/icons/del.xpm @@ -0,0 +1,52 @@ +/* XPM */ +static const char *del_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 30 1", +" c black", +". c #1e1e1e", +"X c #232323", +"o c #2c2c2c", +"O c #323232", +"+ c #3a3a3a", +"@ c gray27", +"# c #4b4b4b", +"$ c #565656", +"% c #595959", +"& c #626262", +"* c #6a6a6a", +"= c #717171", +"- c gray48", +"; c #828282", +": c #8e8e8e", +"> c #929292", +", c #9d9d9d", +"< c #a4a4a4", +"1 c #aaaaaa", +"2 c gray70", +"3 c gray73", +"4 c #c3c3c3", +"5 c #cbcbcb", +"6 c #d5d5d5", +"7 c #d8d8d8", +"8 c #e2e2e2", +"9 c #f4f4f4", +"0 c white", +"q c None", +/* pixels */ +"qqqqqqqqq000>-000qqqqq", +"qqqqqqq005;&08o&<00qqq", +"qqqqqq07$=17, $<%O70qq", +"qqqqqq0$007444353- 0qq", +"qqqqqq0$8400005>@# 0qq", +"qqqqqqq7%<77,<;*% 7qqq", +"qqqqqqq0$%>+=@OXX 0qqq", +"qqqqqqq0%<4*>*#+X 0qqq", +"qqqqqqq0$>0,4;:#o 0qqq", +"qqqqqqq0$:0-9%1%O 0qqq", +"qqqqqqq0$:0-0%1$O 0qqq", +"qqqqqqq0$:0:9*,$o 0qqq", +"qqqqqqq0%80,8=;$O 0qqq", +"qqqqqqq01O-281<*.10qqq", +"qqqqqqqq03%O @%<0qqqq", +"qqqqqqqqq00000000qqqqq" +}; diff --git a/src/pkg/icons/del_disabled.xpm b/src/pkg/icons/del_disabled.xpm new file mode 100644 index 0000000..8330880 --- /dev/null +++ b/src/pkg/icons/del_disabled.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static const char *del_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 17 1", +" c gray50", +". c #8e8e8e", +"X c #949494", +"o c #9a9a9a", +"O c #a3a3a3", +"+ c #ababab", +"@ c gray70", +"# c #bbbbbb", +"$ c #c3c3c3", +"% c #cccccc", +"& c #d2d2d2", +"* c #dbdbdb", +"= c #e2e2e2", +"- c #ececec", +"; c #f1f1f1", +": c #fefefe", +"> c None", +/* pixels */ +">>>>>>>>>:::%#:::>>>>>", +">>>>>>>::=#@:;X@%::>>>", +">>>>>>:-+#&;% +%+o-:>>", +">>>>>>:+::-*==*=*# :>>", +">>>>>>:+;=::::=%OO :>>", +">>>>>>>-+%--%%$@+ ->>>", +">>>>>>>:+@%o#OoX. :>>>", +">>>>>>>:+%*@%@OoX :>>>", +">>>>>>>:+$:%=$$OX :>>>", +">>>>>>>:+%:#:+&+X :>>>", +">>>>>>>:+$:#:@&+o :>>>", +">>>>>>>:+$:$;#%+X :>>>", +">>>>>>>:+;:%;#$+X :>>>", +">>>>>>>:&o#*;%%@X&:>>>", +">>>>>>>>:*+o O+%:>>>>", +">>>>>>>>>::::::::>>>>>" +}; diff --git a/src/pkg/icons/delete_conflict.xpm b/src/pkg/icons/delete_conflict.xpm new file mode 100644 index 0000000..0b0a136 --- /dev/null +++ b/src/pkg/icons/delete_conflict.xpm @@ -0,0 +1,187 @@ +/* XPM */ +static const char * delete_conflict_xpm[] = { +"23 23 161 2", +" c None", +". c #FFFFFF", +"+ c #939393", +"@ c #797979", +"# c #CDCDCD", +"$ c #818181", +"% c #626262", +"& c #E5E5E5", +"* c #2A2A2A", +"= c #676767", +"- c #A2A2A2", +"; c #D6D6D6", +"> c #565656", +", c #737373", +"' c #ACACAC", +") c #E0E0E0", +"! c #9F9F9F", +"~ c #000000", +"{ c #545454", +"] c #A4A4A4", +"^ c #606060", +"/ c #2F2F2F", +"( c #575757", +"_ c #D4D4D4", +": c #C2C2C2", +"< c #C3C3C3", +"[ c #C5C5C5", +"} c #BABABA", +"| c #C8C8C8", +"1 c #B8B8B8", +"2 c #817D76", +"3 c #DD9107", +"4 c #FEBD09", +"5 c #E4E4E4", +"6 c #C1C1C1", +"7 c #CCCCCC", +"8 c #989898", +"9 c #474747", +"0 c #C58417", +"a c #FFFFA1", +"b c #FFFF7F", +"c c #FFFF26", +"d c #FFFF2A", +"e c #C87A00", +"f c #D8D8D8", +"g c #A1A1A1", +"h c #656565", +"i c #585858", +"j c #FBDB60", +"k c #FFFFD7", +"l c #FFFF79", +"m c #FFFF24", +"n c #FFFF15", +"o c #862E2D", +"p c #5F5F5F", +"q c #919191", +"r c #373737", +"s c #727272", +"t c #353535", +"u c #242424", +"v c #734915", +"w c #FFFDCC", +"x c #FFFFC0", +"y c #FFFF1E", +"z c #C97902", +"A c #C4C4C4", +"B c #696969", +"C c #969696", +"D c #494949", +"E c #3A3A3A", +"F c #ECA01C", +"G c #FFFFDB", +"H c #FFFF93", +"I c #FFFF23", +"J c #FFE012", +"K c #909090", +"L c #878787", +"M c #72563C", +"N c #F9E530", +"O c #FFFFC8", +"P c #FFFF4A", +"Q c #EAAF0E", +"R c #FFA108", +"S c #8F8F8F", +"T c #7A7A7A", +"U c #F4F4F4", +"V c #616161", +"W c #A7A7A7", +"X c #EF8801", +"Y c #FFFF3B", +"Z c #FFFF5C", +"` c #FFFF49", +" . c #FCF545", +".. c #FFFF89", +"+. c #FFFF4C", +"@. c #FFFF27", +"#. c #AC4A02", +"$. c #555555", +"%. c #A8A8A8", +"&. c #815D36", +"*. c #381E1E", +"=. c #110000", +"-. c #FFECB4", +";. c #FFFFA7", +">. c #FFE918", +",. c #FFFF21", +"'. c #FFA00A", +"). c #8C8C8C", +"!. c #6F6F6F", +"~. c #9C9C9C", +"{. c #303030", +"]. c #E49C5E", +"^. c #FFFFD1", +"/. c #FFF7B6", +"(. c #FFFF1B", +"_. c #FFE514", +":. c #E1E1E1", +"<. c #707070", +"[. c #822A00", +"}. c #FFF5A5", +"|. c #FFFCD0", +"1. c #FFE840", +"2. c #FFF415", +"3. c #B52A00", +"4. c #AAAAAA", +"5. c #343434", +"6. c #B3B3B3", +"7. c #A6A6A6", +"8. c #686868", +"9. c #2C201B", +"0. c #FBB30C", +"a. c #FFFF91", +"b. c #FFF3A3", +"c. c #FFD512", +"d. c #FED213", +"e. c #FFEA15", +"f. c #FFFF16", +"g. c #9A2E00", +"h. c #BCBCBC", +"i. c #595959", +"j. c #414141", +"k. c #5A5A5A", +"l. c #BA6807", +"m. c #873E02", +"n. c #FFE110", +"o. c #FFD00F", +"p. c #D45F03", +"q. c #FFDE0F", +"r. c #FFE510", +"s. c #FF8F05", +"t. c #CA5C03", +"u. c #FFDE0E", +"v. c #FFC408", +"w. c #FFCA09", +"x. c #FFDC09", +"y. c #FFE205", +"z. c #E65C00", +"A. c #F89801", +"B. c #FF9801", +"C. c #FFAE00", +"D. c #E95E00", +" . . . + @ . . . ", +" . . # $ % . & * = - . . ", +" . ; > , ' ) ! ~ { ] ^ / ; . . . ", +" . ( . . _ : < [ } | 1 2 3 3 3 4 . ", +" . ( 5 6 . . . . 7 8 9 0 a b c d e . ", +" f > ! ) ) ! g $ h i j k l m n o . ", +" . ( p q r s 9 t u v w x y c z . ", +" . ( - A B C B D E F G H I J o . . . ", +" . > K . ! [ $ L M N O P m Q 3 3 3 R . ", +" . > S . T U V W X Y Z ` ...+.m @.#.. ", +" . $.S . T . V %.&.*.=.o -.;.>.,.'.o . ", +" . $.S . ).U !.~.i {.~ ].^./.(._.o . ", +" . > 5 . ! :.<.$ i / [.}.|.1.2.3.o . ", +" . 4.5.T 6.& ] 7.8.9.0.a.b.c.d.e.f.g.. ", +" . h.i.5.~ ~ j.k.o l.m.o n.o.n p.o . ", +" . . . . . . . . . . o q.r.s.o . ", +" . t.u.v.o . ", +" . o w.x.o . ", +" . t.y.z.o . ", +" . A.B.o . ", +" . [.C.o . ", +" . D.o . ", +" . . "}; diff --git a/src/pkg/icons/install.xpm b/src/pkg/icons/install.xpm new file mode 100644 index 0000000..bfc4abd --- /dev/null +++ b/src/pkg/icons/install.xpm @@ -0,0 +1,40 @@ +/* XPM */ +static const char *install_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 18 1", +" c #000000", +". c #050805", +"X c #070c08", +"o c #0b0d0a", +"O c #10120f", +"+ c #151a16", +"@ c #1b1c1a", +"# c #1d221e", +"$ c gray57", +"% c gray61", +"& c #adadad", +"* c #d5d5d5", +"= c #d8d8d8", +"- c #e6e6e6", +"; c #efefef", +": c #f2f2f2", +"> c #fefefe", +", c None", +/* pixels */ +",,,,,>>>>>>>>>>>>>>>>,", +",,,,,> @ o . . oO>,", +",,,,,>o>>>>>>>>>>>> >,", +",,,,,> >>>>>>>>>>>> :,", +",,,,,> >>>>>>>>>> >*,", +",,,,,> >>>>>>>>> >,", +",,,,,> >>>-:>>> >%,", +",,,,,> > >*;> > &,", +",,,,,>> >> >$ *,", +",,,,,> > >$& :,", +",,,,,> => @ >$&* >,", +",,,,,> :*> >$&*: >,", +",,,,,>X>:*> >$&*:> >,", +",,,,,> >>:*>>$&*:>> >,", +",,,,,> # . + >,", +",,,,,>>>>>>:--:>>>>>>," +}; diff --git a/src/pkg/icons/install_disabled.xpm b/src/pkg/icons/install_disabled.xpm new file mode 100644 index 0000000..1773c39 --- /dev/null +++ b/src/pkg/icons/install_disabled.xpm @@ -0,0 +1,34 @@ +/* XPM */ +static const char *install_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 12 1", +" c gray46", +". c #8d8d8d", +"X c #939393", +"o c #9c9c9c", +"O c #a0a0a0", +"+ c #c3c3c3", +"@ c gray79", +"# c LightGray", +"$ c #e8e8e8", +"% c #f2f2f2", +"& c #fefefe", +"* c None", +/* pixels */ +"*****&&&&&&&&&&&&&&&&*", +"*****&OOOOOOOOOOOOOO&*", +"*****&O&&&&&&&&&&&&o&*", +"*****&O&&&&&&&&&&&&o&*", +"*****&O&&&&&&&&&& &$*", +"*****&O&&&&&&&&& &*", +"*****&O&&&%&&&& &@*", +"*****&O& &$%& &.#*", +"*****&& && &@X$*", +"*****&o& &O#o%*", +"*****&o$& &+#$o&*", +"*****&o&$& &+#$&O&*", +"*****&O&%$& &+#$%&O&*", +"*****&O&&&$&&+#$&&&O&*", +"*****&OOOOoXXXooOOOO&*", +"*****&&&&&&&%%%&&&&&&*" +}; diff --git a/src/pkg/icons/keepinstalled.xpm b/src/pkg/icons/keepinstalled.xpm new file mode 100644 index 0000000..3f28022 --- /dev/null +++ b/src/pkg/icons/keepinstalled.xpm @@ -0,0 +1,42 @@ +/* XPM */ +static const char *keepinstalled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 20 1", +" c #000200", +". c #060906", +"X c #070c08", +"o c #0b0d0b", +"O c #0e110e", +"+ c #10120f", +"@ c #141514", +"# c #151a16", +"$ c #1c1e1b", +"% c #1d221e", +"& c #2d2d2d", +"* c #4a6ead", +"= c #a4a4a4", +"- c gray68", +"; c #bbbbbb", +": c #dcdcdc", +"> c #eaeaea", +", c #f4f4f4", +"< c #fefefe", +"1 c None", +/* pixels */ +"11111<<<<<<<<<<<<<<<<1", +"11111< $ o . . oO<1", +"11111,<<<****<-1", +"11111< <**<:><****<@;1", +"11111<<****<<****<=o:1", +"11111< <********<=;.,1", +"11111< :<******<=;: <1", +"11111< ,:<****<=;:, <1", +"11111>,<<<<<<1" +}; diff --git a/src/pkg/icons/keepinstalled_disabled.xpm b/src/pkg/icons/keepinstalled_disabled.xpm new file mode 100644 index 0000000..6db54a3 --- /dev/null +++ b/src/pkg/icons/keepinstalled_disabled.xpm @@ -0,0 +1,32 @@ +/* XPM */ +static const char *keepinstalled_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 10 1", +" c #2d2d2d", +". c gray50", +"X c #b0b0b0", +"o c #bbbbbb", +"O c gainsboro", +"+ c #e3e3e3", +"@ c #ebebeb", +"# c #f4f4f4", +"$ c #fefefe", +"% c None", +/* pixels */ +"%%%%%$$$$$$$$$$$$$$$$%", +"%%%%%$..............$%", +"%%%%%$.$$$$$$$$$$$$.$%", +"%%%%%$.$$$$$$$$$$$$.#%", +"%%%%%$.$$$$$$$$$$XX$+%", +"%%%%%$.$$$$$$$$$XXXX$%", +"%%%%%$.$$$@#$$$XXXX$o%", +"%%%%%$.$XX$+#$XXXX$.o%", +"%%%%%$$XXXX$$XXXX$X.O%", +"%%%%%$.$XXXXXXXX$oo.#%", +"%%%%%$.+$XXXXXX$XoO.$%", +"%%%%%$.#O$XXXX$XoO#.$%", +"%%%%%$.$#+$XX$ooO#$.$%", +"%%%%%$.$$#+$$XoO#$$.$%", +"%%%%%$..............$%", +"%%%%%$$$$$$#@+#$$$$$$%" +}; diff --git a/src/pkg/icons/noinst.xpm b/src/pkg/icons/noinst.xpm new file mode 100644 index 0000000..f63a079 --- /dev/null +++ b/src/pkg/icons/noinst.xpm @@ -0,0 +1,32 @@ +/* XPM */ +static const char *noinst_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 10 1", +" c #000200", +". c #050805", +"X c #070c08", +"o c #0b0d0a", +"O c #10120f", +"+ c #151a16", +"@ c #1c1e1b", +"# c #1d221e", +"$ c white", +"% c None", +/* pixels */ +"%%%%%$$$$$$$$$$$$$$$$%", +"%%%%%$ @ X . . oO$%", +"%%%%%$o$$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$.$$$$$$$$$$$$ $%", +"%%%%%$ $$$$$$$$$$$$ $%", +"%%%%%$ # . +.$%", +"%%%%%$$$$$$$$$$$$$$$$%" +}; diff --git a/src/pkg/icons/noinst_disabled.xpm b/src/pkg/icons/noinst_disabled.xpm new file mode 100644 index 0000000..0227f93 --- /dev/null +++ b/src/pkg/icons/noinst_disabled.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * noinst_disabled_xpm[] = { +"22 16 3 1", +" c None", +". c #FFFFFF", +"+ c #A0A0A0", +" ................ ", +" .++++++++++++++. ", +" .+............+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+.++++++++++.+. ", +" .+............+. ", +" .++++++++++++++. ", +" ................ "}; diff --git a/src/pkg/icons/normal_conflict.xpm b/src/pkg/icons/normal_conflict.xpm new file mode 100644 index 0000000..d3763d3 --- /dev/null +++ b/src/pkg/icons/normal_conflict.xpm @@ -0,0 +1,230 @@ +/* XPM */ +static const char * normal_conflict_xpm[] = { +"23 23 204 2", +" c None", +". c #FFFFFF", +"+ c #C1966A", +"@ c #C7A58A", +"# c #CA9228", +"$ c #B67F46", +"% c #A36623", +"& c #FFFF38", +"* c #C48A24", +"= c #F0E5DA", +"- c #9E6D58", +"; c #E2AA0F", +"> c #FFFFEB", +", c #FEC826", +"' c #9B551E", +") c #E0D0C4", +"! c #9B5400", +"~ c #FFFF85", +"{ c #FFFFEA", +"] c #FFFEA6", +"^ c #CC8000", +"/ c #CBA37D", +"( c #86471F", +"_ c #F0FC35", +": c #DDE5C0", +"< c #1D1E23", +"[ c #CBC8B6", +"} c #FDE346", +"| c #B87314", +"1 c #CFB9B0", +"2 c #C88F00", +"3 c #FFFFB8", +"4 c #262747", +"5 c #000000", +"6 c #040614", +"7 c #FFFFB2", +"8 c #F3AF05", +"9 c #C59065", +"0 c #82430A", +"a c #FFFF88", +"b c #47453A", +"c c #302D20", +"d c #FFFFD2", +"e c #FFF681", +"f c #C07B19", +"g c #B28E79", +"h c #D8B552", +"i c #FFFFFA", +"j c #938C6C", +"k c #7F7251", +"l c #FFFFB3", +"m c #FFF09B", +"n c #FBD470", +"o c #B76817", +"p c #874D11", +"q c #FFFFBF", +"r c #FFFFEE", +"s c #FFFFDF", +"t c #DED19F", +"u c #C8B479", +"v c #FFFF98", +"w c #FFE07E", +"x c #FFF78E", +"y c #CF953A", +"z c #F6EBDE", +"A c #93664F", +"B c #D7B857", +"C c #FFFFF2", +"D c #FFFBD4", +"E c #FFFDCC", +"F c #FFFFC2", +"G c #000003", +"H c #FFED9B", +"I c #FFEB8A", +"J c #FFDF7C", +"K c #FFE47D", +"L c #BC6C1B", +"M c #D8C7C0", +"N c #86521C", +"O c #FFFFC9", +"P c #FFFFE5", +"Q c #FFF7CD", +"R c #FFF5C4", +"S c #1F1D28", +"T c #FFF694", +"U c #FFE480", +"V c #FFDD79", +"W c #FFF189", +"X c #DC9F3B", +"Y c #D9AA71", +"Z c #682A0F", +"` c #FFF64C", +" . c #FFFADF", +".. c #FFF19E", +"+. c #FFEE89", +"@. c #FFF88E", +"#. c #8A7D55", +"$. c #FFE77E", +"%. c #FFE37F", +"&. c #FFDE87", +"*. c #FED534", +"=. c #CD8520", +"-. c #D1BFBD", +";. c #B38A11", +">. c #FFFF95", +",. c #FFFEDF", +"'. c #FFF49D", +"). c #FFEE82", +"!. c #FFEB87", +"~. c #FFFF99", +"{. c #FFFF9C", +"]. c #FFFF92", +"^. c #FFE17F", +"/. c #FFDC8B", +"(. c #FFCE2C", +"_. c #F1A715", +":. c #D9AC6E", +"<. c #6E340C", +"[. c #FFFF68", +"}. c #FFFFF7", +"|. c #FFF7AD", +"1. c #FFF181", +"2. c #FFEF8D", +"3. c #FFFF9D", +"4. c #A39355", +"5. c #807040", +"6. c #FFFF8F", +"7. c #FFE07D", +"8. c #FFDD7A", +"9. c #FFDB89", +"0. c #FFBF10", +"a. c #FFBF0C", +"b. c #D89223", +"c. c #FDFBF7", +"d. c #AC8E8E", +"e. c #C7AA18", +"f. c #FFF7B1", +"g. c #FFF04F", +"h. c #FFF29B", +"i. c #FFF08E", +"j. c #FFFFAA", +"k. c #1E190E", +"l. c #FFE17D", +"m. c #FFDE8C", +"n. c #FFD15C", +"o. c #FFBB00", +"p. c #FFBC0D", +"q. c #F9AE11", +"r. c #D79A48", +"s. c #6A310A", +"t. c #FFFF9E", +"u. c #FFF228", +"v. c #FFEE3B", +"w. c #FFF199", +"x. c #FFF197", +"y. c #E4CE77", +"z. c #1E1910", +"A. c #CAB165", +"B. c #FFE28A", +"C. c #FFDD89", +"D. c #FFC412", +"E. c #FFBD0F", +"F. c #FFBB0F", +"G. c #FFB909", +"H. c #DF9723", +"I. c #92696A", +"J. c #E8DB48", +"K. c #FFFFBA", +"L. c #FFFF6D", +"M. c #FFFF47", +"N. c #FFFF4B", +"O. c #FFFF42", +"P. c #FFFC9D", +"Q. c #FFED87", +"R. c #FFF490", +"S. c #FFF291", +"T. c #FFED75", +"U. c #FFD217", +"V. c #FFC80F", +"W. c #FFC414", +"X. c #FFB90A", +"Y. c #F8AC0B", +"Z. c #E1A449", +"`. c #794A32", +" + c #906933", +".+ c #875516", +"++ c #8A581B", +"@+ c #8D5C2F", +"#+ c #925F2F", +"$+ c #996228", +"%+ c #9E6418", +"&+ c #A16A25", +"*+ c #A66B2E", +"=+ c #AF742D", +"-+ c #B1752E", +";+ c #B87928", +">+ c #BE7717", +",+ c #C27F23", +"'+ c #C78827", +")+ c #CD8C25", +"!+ c #D08E24", +"~+ c #D89424", +"{+ c #DF9822", +"]+ c #DD9629", +" . ", +" . + . ", +" . @ # $ . ", +" . % & * = ", +" . - ; > , ' . ", +" . ) ! ~ { ] ^ / . ", +" . ( _ : < [ } | . ", +" . 1 2 3 4 5 6 7 8 9 . ", +" . 0 a . b 5 c d e f . ", +" . g h i . j 5 k l m n o . ", +" . p q r s t 5 u v w x y z ", +" . A B C D E F G H I J K n L . ", +" . M N O P Q R q S T U J V W X Y . ", +" . Z ` . ...+.@.#.$.%.J V &.*.=.. ", +" . -.;.>.,.'.).!.~.{.].^.J V /.(._.:.. ", +" . <.[.}.|.1.2.3.4.5 5.6.7.8.9.0.a.b.c. ", +" . d.e.. f.g.h.i.j.k.5 5 ~.l.m.n.o.p.q.r.. ", +" . s.t.> u.v.w.x.>.y.z.A.a B.C.D.E.F.G.H.. ", +". I.J.K.L.M.N.O.~ t.P.Q.R.S.T.U.V.W.E.X.Y.Z.. ", +". `. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+. ", +" . . . . . . . . . . . . . . . . . . . . . ", +" ", +" "}; diff --git a/src/pkg/icons/protected.xpm b/src/pkg/icons/protected.xpm new file mode 100644 index 0000000..b5d2bf7 --- /dev/null +++ b/src/pkg/icons/protected.xpm @@ -0,0 +1,116 @@ +/* XPM */ +static const char * protected_xpm[] = { +"22 16 97 2", +" c None", +". c #B0B1C2", +"+ c #B1B2C3", +"@ c #C5C5D2", +"# c #AAAABD", +"$ c #A2A3B7", +"% c #F0F0F3", +"& c #FBFBFB", +"* c #F5F5F5", +"= c #F9F9F9", +"- c #9393AA", +"; c #F7F7F9", +"> c #EBEBED", +", c #A2A3B5", +"' c #9394AA", +") c #9D9EB0", +"! c #DEDEE0", +"~ c #B8B8C7", +"{ c #9697AC", +"] c #898AA0", +"^ c #E2E2E2", +"/ c #B2B2C2", +"( c #D8D9E1", +"_ c #CECED4", +": c #A9A9BB", +"< c #AEAEB6", +"[ c #ADADBE", +"} c #D1D1DA", +"| c #BCBCC4", +"1 c #9FA0A8", +"2 c #C5C5CE", +"3 c #B3B4BC", +"4 c #9D9EA6", +"5 c #E3B97A", +"6 c #DDA039", +"7 c #E2AE48", +"8 c #E6C088", +"9 c #C9953F", +"0 c #FAF46E", +"a c #F9F356", +"b c #F9EF5B", +"c c #C98C2F", +"d c #B88A45", +"e c #F8E339", +"f c #F8BA28", +"g c #B77826", +"h c #A47943", +"i c #F8D533", +"j c #F8D332", +"k c #F8B224", +"l c #F8A51F", +"m c #A36725", +"n c #966C42", +"o c #F8C72D", +"p c #F8BD29", +"q c #F8AA21", +"r c #F8A31E", +"s c #F89E1C", +"t c #955A23", +"u c #966A41", +"v c #F8B827", +"w c #F8B626", +"x c #F8AB21", +"y c #F8A61F", +"z c #F8A11D", +"A c #F89C1B", +"B c #F89619", +"C c #955822", +"D c #966841", +"E c #F8BC29", +"F c #F8B727", +"G c #F8B225", +"H c #F8AD22", +"I c #F8A820", +"J c #F8991A", +"K c #F89418", +"L c #F88F16", +"M c #955622", +"N c #966B42", +"O c #F8BC2E", +"P c #F8B526", +"Q c #F8B024", +"R c #F8AB22", +"S c #F89719", +"T c #F89217", +"U c #F88D15", +"V c #F88813", +"W c #955421", +"X c #8E674F", +"Y c #8D5C2D", +"Z c #955F25", +"` c #955E25", +" . c #955D24", +".. c #955B24", +"+. c #955923", +"@. c #955521", +"#. c #8D5022", +" . + @ + # ", +" $ % & * = % $ ", +" - ; > , ' ) ! ; - ", +" ~ * { ] ^ ~ ", +" / ( _ : < ( / ", +" [ } | [ 1 } [ ", +" : 2 3 : 4 2 : ", +" 5 6 7 7 7 7 7 7 7 7 7 6 8 ", +" 9 0 a a a a a a a a a b c ", +" d e e e e e e e e e e f g ", +" h i i i i i i i i j k l m ", +" n o o o o o o o p q r s t ", +" u v p p f w k x y z A B C ", +" D p E F G H I r s J K L M ", +" N O P Q R y z A S T U V W ", +" X Y Z ` ...t +.C M @.#.X "}; diff --git a/src/pkg/icons/protected_disabled.xpm b/src/pkg/icons/protected_disabled.xpm new file mode 100644 index 0000000..760cbcd --- /dev/null +++ b/src/pkg/icons/protected_disabled.xpm @@ -0,0 +1,75 @@ +/* XPM */ +static const char * protected_disabled_xpm[] = { +"22 16 56 1", +" g None", +". g #C7C7C7", +"+ g #CFCFCF", +"@ g #DFDFDF", +"# g #C4C4C4", +"$ g #C2C2C2", +"% g #EFEFEF", +"& g #C3C3C3", +"* g #B6B6B6", +"= g #BABABA", +"- g #C0C0C0", +"; g #D5D5D5", +"> g #BBBBBB", +", g #B0B0B0", +"' g #D4D4D4", +") g #EDEDED", +"! g #E5E5E5", +"~ g #BEBEBE", +"{ g #CCCCCC", +"] g #E8E8E8", +"^ g #D8D8D8", +"/ g #BFBFBF", +"( g #BCBCBC", +"_ g #D1D1D1", +": g #DEDEDE", +"< g #CBCBCB", +"[ g #D3D3D3", +"} g #C1C1C1", +"| g #B8B8B8", +"1 g #AFAFAF", +"2 g #ABABAB", +"3 g #ECECEC", +"4 g #EBEBEB", +"5 g #DADADA", +"6 g #A2A2A2", +"7 g #A1A1A1", +"8 g #D6D6D6", +"9 g #D0D0D0", +"0 g #989898", +"a g #A0A0A0", +"b g #DDDDDD", +"c g #E0E0E0", +"d g #DBDBDB", +"e g #D7D7D7", +"f g #D2D2D2", +"g g #979797", +"h g #9F9F9F", +"i g #DCDCDC", +"j g #CECECE", +"k g #CACACA", +"l g #D9D9D9", +"m g #C9C9C9", +"n g #C8C8C8", +"o g #9B9B9B", +"p g #999999", +"q g #929292", +" .+@+# ", +" $%%%%%& ", +" *%%#=-%%* ", +" ;%> ,%' ", +" &)!~ {)& ", +" -]^/ $]- ", +" (@_( -:( ", +" _<[[[['[[[[<' ", +" }%%%%%%%%%%%( ", +" |%%%%%%%%%%:1 ", +" 23333333345'6 ", +" 7!!!!!!!@8[90 ", +" abc@@d5e'f+{g ", +" h@@i5^8[_j c gray35", +", c #323232", +"< c #c3c3c3", +"1 c gray73", +"2 c gray27", +"3 c #4b4b4b", +"4 c #6a6a6a", +"5 c #3a3a3a", +"6 c #232323", +"7 c #f4f4f4", +"8 c #8e8e8e", +"9 c gray70", +"0 c #1e1e1e", +/* pixels */ +" ...Xo... ", +" ..O+@.#$@%.. ", +" .&*=-&;:*%>,&. ", +" .*..&<<<1O1o:. ", +".. .*#<....OX23:. ", +".:. &>%&&;%+4>:& ", +".::. .*>X5=2,66:. ", +".:7:. .>%<4X4356:. ", +".:77:. .*X.;<+83$:. ", +".:777:..*8.o7>->,:. ", +".:777:..*8.o.>-*,:. ", +".:77:. .*8.874;*$:. ", +".:7:. .>#.;#=+*,:. ", +".::. .-,o9#-%40-. ", +".:. .1>,::2>%. ", +".. ........ "}; diff --git a/src/pkg/icons/sel_autodel_disabled.xpm b/src/pkg/icons/sel_autodel_disabled.xpm new file mode 100644 index 0000000..b743ad2 --- /dev/null +++ b/src/pkg/icons/sel_autodel_disabled.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static const char * sel_autodel_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 18 1", +" c None", +". c #fefefe", +"X c gray80", +"o c #bbbbbb", +"O c #e2e2e2", +"+ c gray70", +"@ c #f1f1f1", +"# c gray58", +"$ c #ececec", +"% c gray67", +"& c #d2d2d2", +"* c gray50", +"= c #9a9a9a", +"- c gray86", +"; c gray64", +": c #c3c3c3", +"> c #8e8e8e", +", c white", +/* pixels */ +" ...Xo... ", +" ..Oo+.@#+X.. ", +" .$%o&@X*%X%=$. ", +" .%..$-OO-O-o*. ", +".. .%@O....OX;;*. ", +".*. $%X$$XX:+%*$ ", +".**. .%+X=o;=#>*. ", +".*,*. .%X-+X+;=#*. ", +".*,,*. .%:.XO::;#*. ", +".*,,,*..%X.o.%&%#*. ", +".*,,,*..%:.o.+&%=*. ", +".*,,*. .%:.:@oX%#*. ", +".*,*. .%@.X@o:%#*. ", +".**. .&=o-@XX+#&. ", +".*. .-%=**;%X. ", +".. ........ "}; diff --git a/src/pkg/icons/sel_autoinstall.xpm b/src/pkg/icons/sel_autoinstall.xpm new file mode 100644 index 0000000..e18e2a7 --- /dev/null +++ b/src/pkg/icons/sel_autoinstall.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static const char * sel_autoinstall_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 18 1", +" c None", +". c #fefefe", +"X c black", +"o c #1b1c1a", +"O c #0b0d0a", +"+ c #070c08", +"@ c #10120f", +"# c gray95", +"$ c #d5d5d5", +"% c #e6e6e6", +"& c gray61", +"* c #efefef", +"= c gray68", +"- c gray57", +"; c #d8d8d8", +": c #1d221e", +"> c #050805", +", c #151a16", +/* pixels */ +" ................ ", +" .XoXXOXX+X+XXO@. ", +" .O............X. ", +" .X............X# ", +".. .X..........XX.$ ", +".X. .X.........XXXX. ", +".XX. .X...%#...XXXX.& ", +".X.X..X.XX.$*.XXXX.X= ", +".X..X..XXXX..XXXX.-X$ ", +".X...X..XXXXXXXX.-=X# ", +".X...X.;.XXXoXX.-=$X. ", +".X..X.X#$.XXXX.-=$#X. ", +".X.X..+.#$.XX.-=$#.X. ", +".XX. .X..#$..-=$#..X. ", +".X. .X:XXX>XXXXXX,X. ", +".. ......#%%#...... "}; diff --git a/src/pkg/icons/sel_autoinstall_disabled.xpm b/src/pkg/icons/sel_autoinstall_disabled.xpm new file mode 100644 index 0000000..85bd929 --- /dev/null +++ b/src/pkg/icons/sel_autoinstall_disabled.xpm @@ -0,0 +1,34 @@ +/* XPM */ +static const char * sel_autoinstall_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 13 1", +" c None", +". c #fefefe", +"X c #7f807f", +"o c #8b8c8b", +"O c gray50", +"+ c #828382", +"@ c #878887", +"# c #eaeaea", +"$ c #f3f3f3", +"% c gray78", +"& c white", +"* c gray84", +"= c gray79", +/* pixels */ +" ................ ", +" .XoO+@X++O+XX@@. ", +" .@............X. ", +" .O............X. ", +".. .X..........OO.# ", +".O. .X.........OOOO. ", +".OO. .X...$....OOOO.% ", +".O&O..X.OO.#$.OOOO.X* ", +".O&&O..OOOO..OOOX.%X# ", +".O&&&O..OOOOOOOO.%*X. ", +".O&&&O.#.OOOoOO.=*#X. ", +".O&&O.+$#.OOOO.%*#$X. ", +".O&O..+..#.OO.%*#..O. ", +".OO. .+..$#..%*#$..O. ", +".O. .XoOOOXXX+XXXo+. ", +".. .......$#....... "}; diff --git a/src/pkg/icons/sel_autoupdate.xpm b/src/pkg/icons/sel_autoupdate.xpm new file mode 100644 index 0000000..d93bfd0 --- /dev/null +++ b/src/pkg/icons/sel_autoupdate.xpm @@ -0,0 +1,57 @@ +/* XPM */ +static const char * sel_autoupdate_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 36 1", +" c None", +". c #fefefe", +"X c #f4f4f4", +"o c #c9dab2", +"O c #a0bf75", +"+ c #7fa944", +"@ c #699b23", +"# c #9cba71", +"$ c #c1d1aa", +"% c #ecf1e6", +"& c #aac584", +"* c gray92", +"= c #cbcbcb", +"- c #7ca83f", +"; c #b1cb8d", +": c #dde9ce", +"> c #e4e4e4", +", c #dadada", +"< c black", +"1 c gray84", +"2 c #353535", +"3 c white", +"4 c #bcbcbc", +"5 c #8ab055", +"6 c gray17", +"7 c #7b7b7b", +"8 c #555555", +"9 c gray70", +"0 c gray64", +"q c #222222", +"w c #838383", +"e c #c6c6c6", +"r c #606060", +"t c gray68", +"y c #d6dbd0", +"u c #939393", +/* pixels */ +" ", +" ..XXXX ", +" .XoO+@+#$X ", +" .%&@@@@@@*=* ", +".. ..&@-;:.:..>,* ", +".<. .o@-o......<1, ", +".<<. ..#@;......<<2=* ", +".<3<..@@@@@@@..<<<<4> ", +".<33<.5@@@@@..<<<<<6, ", +".<333<*@@@@..<<<<<<<, ", +".<333*..e.e7q<<<<< c #111111", +", c #545454", +"' c #DDDDDE", +") c #777777", +"! c #808080", +"~ c #878787", +"{ c #818181", +"] c #929292", +"^ c #A5A5A5", +"/ c #A0A0A0", +"( c #BEBEBE", +"_ c #C4C4C4", +": c #CBCBCB", +"< c #D7D7D7", +"[ c #B9B9B9", +"} c #969696", +"| c #9E9E9E", +"1 c #999999", +"2 c #8E8E8E", +"3 c #868686", +"4 c #F7F7F7", +"5 c #B4B4B4", +"6 c #A1A1A1", +"7 c #C6C6C6", +"8 c #D5D5D5", +"9 c #DEDEDE", +"0 c #E2E2E2", +"a c #DCDCDC", +"b c #2B2B2B", +"c c #727272", +"d c #C8C8C8", +"e c #C7C7C7", +"f c #A8A8A8", +"g c #ABABAB", +"h c #BABABA", +"i c #BDBDBD", +"j c #DDDDDD", +"k c #D6D6D6", +"l c #D3D3D3", +"m c #DFDFDF", +"n c #3B3B3B", +"o c #2C2C2C", +"p c #C1C1C1", +"q c #B1B1B1", +"r c #A9A9A9", +"s c #858585", +"t c #E5E5E5", +"u c #E8E8E8", +"v c #E6E6E6", +"w c #EDEDED", +"x c #F1F1F1", +"y c #F0F0F0", +"z c #F5F5F5", +"A c #F4F4F4", +"B c #F9F9F9", +"C c #E3E3E3", +"D c #101010", +"E c #E4E3E3", +"F c #E5E5E4", +"G c #BAB9B9", +"H c #222222", +"I c #F6F6F6", +"J c #E7E7E7", +"K c #FEFEFE", +"L c #525252", +"M c #F3F3F3", +"N c #888888", +"O c #FDFDFD", +"P c #D3D2D3", +"Q c #F1F1F0", +"R c #F2F2F2", +"S c #EBEBEB", +"T c #828282", +"U c #FDFEFD", +"V c #737373", +"W c #EBECEB", +"X c #848484", +"Y c #FEFFFE", +"Z c #FBFBFB", +"` c #FAFAFA", +" . c #EFEFEF", +".. c #EAEBEB", +"+. c #EAEAEA", +"@. c #FBFBFC", +"#. c #F7F6F6", +"$. c #F2F1F1", +"%. c #ECECEC", +"&. c #E9E9E9", +"*. c #898989", +"=. c #FCFCFC", +"-. c #E9EAEA", +";. c #D8D8D8", +">. c #8C8C8C", +",. c #FEFDFD", +"'. c #FCFBFC", +"). c #DADADA", +"!. c #959595", +"~. c #DEDEDD", +"{. c #CBCACB", +"]. c #DAD9DA", +"^. c #717171", +"/. c #F3F3F2", +"(. c #DFDEDE", +"_. c #BCBDBD", +":. c #7F7F7F", +"<. c #B3B3B3", +"[. c #636363", +"}. c #A2A2A2", +"|. c #9D9D9D", +"1. c #7C7C7C", +"2. c #434343", +" . . . . . ", +" . + @ # $ % & . ", +" . * # # # # = - . ", +" . . . . . . ; > > , ' ) # - . . . . . . ", +" . ! ~ { ] ^ / ( _ : < [ } = ^ ^ | 1 2 . ", +" . 3 4 5 6 [ 7 8 9 0 0 0 a b c d : e ] . ", +" . 3 f g 1 - h i j k k l m n o p q r ~ . ", +" . s t u v & w x y z A B C D # & E F | . ", +" . ! v . . . . . h h G ~ H # # 4 I I ! . ", +" . { J . . . K . # # # # # # L M A x N . ", +" . { v . . K O . # # # # # > P Q R S ! . ", +" . T v . . K U . # # # @ V 0 y W & S 2 . ", +" . X u . Y O Z . # . ` I A .S u ..J T . ", +" . T +.. K O @.. # . #.A $.S %.&.t k ! . ", +" . *.J . K =.Z . . . I A .-.&.v ;.k ! . ", +" . >.u . ,.=.'.).X !.A .w v C ~.8 {.s . ", +" . ! S . K O ].> # # ^./.w (.8 8 e _.! . ", +" . *.:.>.] <.[.# # # # }.- |.s X 1.:.:.. ", +" . . . . . . 1 # # # 2.. . . . . . . . . ", +" . ) # $ . ", +" . . . ", +" "}; diff --git a/src/pkg/icons/step_current.xpm b/src/pkg/icons/step_current.xpm new file mode 100644 index 0000000..04eb813 --- /dev/null +++ b/src/pkg/icons/step_current.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static const char * step_current_xpm[] = { +"14 14 2 1", +" c None", +". c #000000", +" ", +" . ", +" .. ", +" ... ", +" .... ", +" ........... ", +" ............ ", +" ............ ", +" ........... ", +" .... ", +" ... ", +" .. ", +" . ", +" "}; diff --git a/src/pkg/icons/step_done.xpm b/src/pkg/icons/step_done.xpm new file mode 100644 index 0000000..f06d1fc --- /dev/null +++ b/src/pkg/icons/step_done.xpm @@ -0,0 +1,31 @@ +/* XPM */ +static const char * step_done_xpm[] = { +"14 14 14 1", +" c None", +". c #C5C8C9", +"+ c #333333", +"@ c #767778", +"# c #AEB1B2", +"$ c #DBDFE1", +"% c #D0D3D5", +"& c #B9BCBE", +"* c #6B6C6D", +"= c #3E3E3E", +"- c #818384", +"; c #545555", +"> c #8C8E8F", +", c #A3A5A7", +" ", +" ", +" .+@ ", +" @++ ", +" #$ %++@ ", +" &+@ @++% ", +" *++.=+- ", +" @++=+=$ ", +" $;+++> ", +" .=+=$ ", +" #+, ", +" % ", +" ", +" "}; diff --git a/src/pkg/icons/step_todo.xpm b/src/pkg/icons/step_todo.xpm new file mode 100644 index 0000000..910ecb0 --- /dev/null +++ b/src/pkg/icons/step_todo.xpm @@ -0,0 +1,20 @@ +/* XPM */ +static const char * step_todo_xpm[] = { +"14 14 3 1", +" c None", +". c #5F6061", +"+ c #333333", +" ", +" ", +" ", +" ", +" .++. ", +" .++++. ", +" ++++++ ", +" ++++++ ", +" .++++. ", +" .++. ", +" ", +" ", +" ", +" "}; diff --git a/src/pkg/icons/stop.xpm b/src/pkg/icons/stop.xpm new file mode 100644 index 0000000..5ac9924 --- /dev/null +++ b/src/pkg/icons/stop.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static const char * stop_xpm[] = { +"18 18 3 1", +" c None", +". c #000000", +"+ c #FFFFFF", +" ...... ", +" ..+++.++.. ", +" .+++++..+++. ", +" .++++++...+++. ", +" .++++.......++.. ", +" .++..........++. ", +".++...........++..", +".++.....+....+++..", +".+.....++...++++..", +".+....+++..+++++..", +".+...++++.+++++...", +"....+++++++++++...", +" ...++++++++++... ", +" ....+++++++..... ", +" ....+++....... ", +" ....++...... ", +" ....+..... ", +" ...... "}; diff --git a/src/pkg/icons/taboo.xpm b/src/pkg/icons/taboo.xpm new file mode 100644 index 0000000..ddb26f5 --- /dev/null +++ b/src/pkg/icons/taboo.xpm @@ -0,0 +1,161 @@ +/* XPM */ +static const char * taboo_xpm[] = { +"22 16 142 2", +" c None", +". c #FFFFFF", +"+ c #E4E4E4", +"@ c #BCBCBC", +"# c #9C9C9C", +"$ c #8A8B8A", +"% c #8E8E8E", +"& c #A4A4A4", +"* c #C1C1C1", +"= c #E3E3E3", +"- c #FAFAFA", +"; c #C9C9C9", +"> c #998787", +", c #AA6464", +"' c #9F3737", +") c #9B1212", +"! c #9A1212", +"~ c #9D3636", +"{ c #B06969", +"] c #A89697", +"^ c #CBCBCB", +"/ c #F4F4F4", +"( c #987474", +"_ c #9F3A3A", +": c #B24040", +"< c #CD7C7C", +"[ c #DEA9A9", +"} c #DEA8A8", +"| c #C97979", +"1 c #AC3D3D", +"2 c #983838", +"3 c #AB8787", +"4 c #F2F2F2", +"5 c #958383", +"6 c #9D3939", +"7 c #BA4E4E", +"8 c #E9BEBE", +"9 c #EABFBF", +"0 c #E2B8B8", +"a c #B14A4A", +"b c #943636", +"c c #AC9999", +"d c #D8D8D8", +"e c #BDBDBD", +"f c #A55F5F", +"g c #9A0000", +"h c #D38282", +"i c #E0A2A2", +"j c #E1A2A2", +"k c #E2A2A2", +"l c #E3A2A2", +"m c #CB7C7C", +"n c #910000", +"o c #B26B6B", +"p c #BEBEBF", +"q c #E6E6E6", +"r c #9D9D9D", +"s c #9B3434", +"t c #9E0000", +"u c #C85F5F", +"v c #D37777", +"w c #D57777", +"x c #D67777", +"y c #D77777", +"z c #C65D5D", +"A c #960000", +"B c #903131", +"C c #B1B1B1", +"D c #D7D7D7", +"E c #8B8B8B", +"F c #961111", +"G c #A00000", +"H c #980000", +"I c #8B1010", +"J c #A9A9A9", +"K c #971313", +"L c #9F0000", +"M c #8A1111", +"N c #A5A5A5", +"O c #C3C3C3", +"P c #A3A3A3", +"Q c #9D3B3B", +"R c #A50000", +"S c #A90000", +"T c #AD0000", +"U c #B00000", +"V c #AF0000", +"W c #A10000", +"X c #913535", +"Y c #BFBFBF", +"Z c #BC7777", +"` c #920000", +" . c #AD1010", +".. c #AF1010", +"+. c #B01010", +"@. c #B21010", +"#. c #B11010", +"$. c #AB1010", +"%. c #970000", +"&. c #880000", +"*. c #BE7777", +"=. c #C6C6C6", +"-. c #E1E1E1", +";. c #BCAAAA", +">. c #9F4343", +",. c #AA2727", +"'. c #B02727", +"). c #B22727", +"!. c #AF2727", +"~. c #A72727", +"{. c #8A0000", +"]. c #953E3E", +"^. c #DAD2D2", +"/. c #A8A8A8", +"(. c #F8F8F8", +"_. c #C8A5A5", +":. c #9C4242", +"<. c #8D0000", +"[. c #AB3D3D", +"}. c #AD3D3D", +"|. c #AA3D3D", +"1. c #860000", +"2. c #B5B5B5", +"3. c #EDEDED", +"4. c #C7C7C7", +"5. c #D2C0C0", +"6. c #D48F8F", +"7. c #973A3A", +"8. c #891111", +"9. c #881111", +"0. c #933939", +"a. c #D58F8F", +"b. c #E6DDDD", +"c. c #A7A7A7", +"d. c #E7E7E7", +"e. c #DEDEDE", +"f. c #F5F5F5", +"g. c #DBDBDB", +"h. c #BBBBBB", +"i. c #D0D0D0", +"j. c #B9B9B9", +"k. c #9F9F9F", +" . . . . . . ", +" . + @ # $ % & * = - ", +" . ; > , ' ) ! ~ { ] ^ / ", +" . ; ( _ : < [ } | 1 2 3 ^ 4 ", +" + 5 6 7 8 9 9 9 9 0 a b c d ", +" . e f g h i j k l k j m n o p q ", +" . r s t u v w x y x w z A B C D ", +" . E F G . . . . . . . . H I J ^ ", +" . % K L . . . . . . . . A M N O ", +" . P Q g R S T U U V T W n X P * ", +" . Y Z ` t ...+.@.#.$.%.&.*.& =. ", +" -.;.>.` ,.'.).).!.~.{.].^./. ", +" (.=._.:.<.[.}.1 |.1.].. r 2. ", +" 3.4.5.6.7.8.9.0.a.b.& c. ", +" d.4.; e.f.f.g.h.# /. ", +" i.j.J k.k.J "}; diff --git a/src/pkg/icons/taboo_disabled.xpm b/src/pkg/icons/taboo_disabled.xpm new file mode 100644 index 0000000..00f88be --- /dev/null +++ b/src/pkg/icons/taboo_disabled.xpm @@ -0,0 +1,92 @@ +/* XPM */ +static const char * taboo_disabled_xpm[] = { +"22 16 73 1", +" c None", +". c #FFFFFF", +"+ c #F1F1F1", +"@ c #DDDDDD", +"# c #CDCDCD", +"$ c #C4C4C4", +"% c #C6C6C6", +"& c #D1D1D1", +"* c #E0E0E0", +"= c #FCFCFC", +"- c #E4E4E4", +"; c #C7C7C7", +"> c #C2C2C2", +", c #B5B5B5", +"' c #AAAAAA", +") c #B4B4B4", +"! c #C5C5C5", +"~ c #CECECE", +"{ c #E5E5E5", +"] c #F9F9F9", +"^ c #BBBBBB", +"/ c #E1E1E1", +"( c #D0D0D0", +"_ c #B9B9B9", +": c #B3B3B3", +"< c #CCCCCC", +"[ c #F8F8F8", +"} c #C1C1C1", +"| c #E9E9E9", +"1 c #BEBEBE", +"2 c #B1B1B1", +"3 c #EBEBEB", +"4 c #DEDEDE", +"5 c #C0C0C0", +"6 c #A5A5A5", +"7 c #D4D4D4", +"8 c #DFDFDF", +"9 c #A3A3A3", +"0 c #F2F2F2", +"a c #A6A6A6", +"b c #C9C9C9", +"c c #D2D2D2", +"d c #D3D3D3", +"e c #C8C8C8", +"f c #A4A4A4", +"g c #AFAFAF", +"h c #D8D8D8", +"i c #A9A9A9", +"j c #A7A7A7", +"k c #A8A8A8", +"l c #ABABAB", +"m c #AEAEAE", +"n c #A1A1A1", +"o c #E2E2E2", +"p c #F0F0F0", +"q c #B8B8B8", +"r c #EAEAEA", +"s c #FBFBFB", +"t c #DADADA", +"u c #B6B6B6", +"v c #A2A2A2", +"w c #BABABA", +"x c #A0A0A0", +"y c #F6F6F6", +"z c #E3E3E3", +"A c #B2B2B2", +"B c #F3F3F3", +"C c #EEEEEE", +"D c #FAFAFA", +"E c #EDEDED", +"F c #E7E7E7", +"G c #DCDCDC", +"H c #CFCFCF", +" ...... ", +" .+@#$%&*+= ", +" .-;>,'')!~{] ", +" .->,^&/*(_:<{[ ", +" +!,}|||||{12(3 ", +" .45678*****&9%40 ", +" .~:abcccdccefgh3 ", +" .!ij........6a7{ ", +" .%'j........fac/ ", +" .&,6ki'lll'j92&* ", +" .8<9amggggm6n<&o ", +" phq9:,,,,:n)rd ", +" sotuv_w__x).~t ", +" yzzh:a6Ahp&d ", +" Bz-CDDE@#d ", +" FG7HH7 "}; diff --git a/src/pkg/icons/tree_minus.xpm b/src/pkg/icons/tree_minus.xpm new file mode 100644 index 0000000..f950cc8 --- /dev/null +++ b/src/pkg/icons/tree_minus.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * tree_minus_xpm[] = { +"11 11 8 1", +" c #FFF7ED", +". c #B2AB9C", +"+ c #FEF6EC", +"@ c #FAF2E8", +"# c #FAF4EB", +"$ c #FFFFFF", +"% c #FAF4EA", +"& c #000000", +" ", +" ......... ", +" . +@ . ", +" . #$$ . ", +" . %$$ . ", +" . &&&&& . ", +" . $ . ", +" . $ . ", +" . . ", +" ......... ", +" "}; diff --git a/src/pkg/icons/tree_plus.xpm b/src/pkg/icons/tree_plus.xpm new file mode 100644 index 0000000..4ede06e --- /dev/null +++ b/src/pkg/icons/tree_plus.xpm @@ -0,0 +1,17 @@ +/* XPM */ +static const char * tree_plus_xpm[] = { +"11 11 3 1", +" c #FFF7ED", +". c #B2AB9C", +"+ c #000000", +" ", +" ......... ", +" . . ", +" . + . ", +" . + . ", +" . +++++ . ", +" . + . ", +" . + . ", +" . . ", +" ......... ", +" "}; diff --git a/src/pkg/icons/unresolvable_conflict.xpm b/src/pkg/icons/unresolvable_conflict.xpm new file mode 100644 index 0000000..4fe6bbf --- /dev/null +++ b/src/pkg/icons/unresolvable_conflict.xpm @@ -0,0 +1,170 @@ +/* XPM */ +static const char * unresolvable_conflict_xpm[] = { +"22 22 145 2", +" c None", +". c #FFFFFF", +"+ c #FFFFFE", +"@ c #FFCD00", +"# c #FDFDFD", +"$ c #F3F3F3", +"% c #EFEFEF", +"& c #F6F6F6", +"* c #C3C3C3", +"= c #48494C", +"- c #C1B99C", +"; c #CEA500", +"> c #FFEC9A", +", c #E4E4E4", +"' c #A6A6A6", +") c #A2A2A2", +"! c #B2B2B2", +"~ c #9F9F9F", +"{ c #828282", +"] c #6B6B6B", +"^ c #363636", +"/ c #AEAEB2", +"( c #AAA593", +"_ c #F6F4EA", +": c #FFFEF8", +"< c #A3A3A3", +"[ c #B7B7B7", +"} c #BEBEBE", +"| c #CBCBCB", +"1 c #ABABAB", +"2 c #414141", +"3 c #151515", +"4 c #060605", +"5 c #65666B", +"6 c #000000", +"7 c #F2F2F2", +"8 c #FEFEFE", +"9 c #929292", +"0 c #E7E7E7", +"a c #D8D8D8", +"b c #C8C8C8", +"c c #BABABA", +"d c #ACACAC", +"e c #9E9E9E", +"f c #999999", +"g c #636363", +"h c #020202", +"i c #DADADA", +"j c #DEDEDE", +"k c #C6C6C6", +"l c #B8B8B8", +"m c #9D9D9D", +"n c #909090", +"o c #838383", +"p c #787878", +"q c #515151", +"r c #080808", +"s c #D4D4D4", +"t c #949494", +"u c #D0D0D0", +"v c #B5B5B5", +"w c #A8A8A8", +"x c #9A9A9A", +"y c #8D8D8D", +"z c #808080", +"A c #727272", +"B c #656565", +"C c #5B5B5B", +"D c #292929", +"E c #2A2A2A", +"F c #757575", +"G c #AAAAAA", +"H c #8C8C8C", +"I c #7E7E7E", +"J c #646464", +"K c #565656", +"L c #494949", +"M c #353535", +"N c #060606", +"O c #010101", +"P c #545454", +"Q c #9B9B9B", +"R c #8B8B8B", +"S c #7C7C7C", +"T c #6E6E6E", +"U c #616161", +"V c #464646", +"W c #393939", +"X c #282828", +"Y c #0B0B0B", +"Z c #ECECEC", +"` c #202020", +" . c #707070", +".. c #606060", +"+. c #525252", +"@. c #444444", +"#. c #373737", +"$. c #181818", +"%. c #050505", +"&. c #030303", +"*. c #111111", +"=. c #1B1B1B", +"-. c #454545", +";. c #424242", +">. c #343434", +",. c #252525", +"'. c #161616", +"). c #0A0A0A", +"!. c #101010", +"~. c #303030", +"{. c #040404", +"]. c #0C0C0C", +"^. c #232323", +"/. c #1D1D1D", +"(. c #505050", +"_. c #6F6F6F", +":. c #141414", +"<. c #272727", +"[. c #1C1C1C", +"}. c #717171", +"|. c #070707", +"1. c #090909", +"2. c #121212", +"3. c #262626", +"4. c #2F2F2F", +"5. c #3C3C3C", +"6. c #CECECE", +"7. c #1A1A1A", +"8. c #2E2E2E", +"9. c #434343", +"0. c #4D4D4D", +"a. c #1E1E1E", +"b. c #939393", +"c. c #191919", +"d. c #2C2C2C", +"e. c #404040", +"f. c #4E4E4E", +"g. c #626262", +"h. c #2B2B2B", +"i. c #4A4A4A", +"j. c #383838", +"k. c #171717", +"l. c #919191", +"m. c #FAFAFA", +"n. c #3B3B3B", +" ", +" . . . ", +" . . . + @ @ . ", +" . # $ % & . . * = - ; @ > . ", +" . , ' ) ! ~ { ] ) ^ / . ( _ : ", +" # < [ $ & , } | 1 2 3 4 5 6 7 ", +" 8 9 0 $ a b c d e f g 6 6 h ! . ", +" . ) i j k l d m n o p q 6 6 r } . ", +" s t u v w x y z A B C D 6 6 6 E 0 ", +" . F [ G f H I A J K L M N 6 O 6 6 9 . ", +" . P Q R S T U P V W X Y 6 O O O 6 K Z ", +" . ` .A ..+.@.#.X $.%.6 O O 6 h &.6 . ", +" . *.=.-.;.>.,.'.).O 6 O 6 O %.!.*.6 . ", +" . ~.6 h r r &.6 6 O 6 6 {.].'.^./.(.. ", +" . _.6 6 6 6 O O 6 6 &.).:./.<.^ [.}.. ", +" b |.6 O O O 6 h 1.2.[.3.4.5.5.3.6. ", +" . _.6 O O O |.!.7.^.8.#.9.0.a.b.. ", +" $ L 6 %.!.c.^.d.M e.f.f.` P . ", +" & g.&.$.h.#.;.i.f.j.k.l.. ", +" m.e n./.6 6 6 D i.* . ", +" Z . . . . . . ", +" "}; diff --git a/src/pkg/icons/update.xpm b/src/pkg/icons/update.xpm new file mode 100644 index 0000000..270a6b3 --- /dev/null +++ b/src/pkg/icons/update.xpm @@ -0,0 +1,58 @@ +/* XPM */ +static const char *update_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 36 1", +" c #000000", +". c #222222", +"X c gray17", +"o c #353535", +"O c #555555", +"+ c #606060", +"@ c #7b7b7b", +"# c #699b23", +"$ c #7ca83f", +"% c #7fa944", +"& c #80aa45", +"* c #8ab055", +"= c #9cba71", +"- c #a0bf75", +"; c #838383", +": c #939393", +"> c gray64", +", c gray68", +"< c #b3b3b3", +"1 c #bcbcbc", +"2 c #aac584", +"3 c #b1cb8d", +"4 c #c1d1aa", +"5 c #c9dab2", +"6 c #c6c6c6", +"7 c #cbcbcb", +"8 c gray84", +"9 c #d6dbd0", +"0 c #dadada", +"q c #dde9ce", +"w c #e4e4e4", +"e c #ebebeb", +"r c #ecf1e6", +"t c #f4f4f4", +"y c #fefefe", +"u c None", +/* pixels */ +"uuuuuuuuuuuuuuuuuuuuuu", +"uuuuuuuuuuyyttttuuuuuu", +"uuuuuuuuyt5=&#%=4euuuu", +"uuuuuuuyr2######e7euuu", +"uuuuuuyy2#$3qyqyyw0euu", +"uuuuuuy5#$5yyyyyy 80uu", +"uuuuuyy=#3yyyyyy o7eu", +"uuuuuy#######yy 1wu", +"uuuuuy*#####yy X0u", +"uuuuuyt####yy 0u", +"uuuuuye*##yyyyyy@ O<0u", +"uuuuuuye#yyyyyy>. ;1uu", +"uuuuuuyeeyy6y6@. +,7uu", +"uuuuuuue9w +>1uuu", +"uuuuuuuue:O. XO;,1uuuu", +"uuuuuuuuuu071<<1uuuuuu" +}; diff --git a/src/pkg/icons/update_disabled.xpm b/src/pkg/icons/update_disabled.xpm new file mode 100644 index 0000000..40518a9 --- /dev/null +++ b/src/pkg/icons/update_disabled.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static const char *update_disabled_xpm[] = { +/* columns rows colors chars-per-pixel */ +"22 16 17 1", +" c gray50", +". c #818181", +"X c gray56", +"o c #939393", +"O c #9a9a9a", +"+ c #aeaeae", +"@ c gray69", +"# c #bababa", +"$ c #c0c0c0", +"% c #cacaca", +"& c #d3d3d3", +"* c #dcdcdc", +"= c #e3e3e3", +"- c #ececec", +"; c #f4f4f4", +": c #fefefe", +"> c None", +/* pixels */ +">>>>>>>>>>>>>>>>>>>>>>", +">>>>>>>>>>::;:;:>>>>>>", +">>>>>>>>::=%#+#%*:>>>>", +">>>>>>>:;&++++++;=;>>>", +">>>>>>::&+#&-:-::;=:>>", +">>>>>>:=+#=:::::: -->>", +">>>>>::%+&:::::: O=;>", +">>>>>:+++++++:: *;>", +">>>>>:$+++++:: o->", +">>>>>::++++:: ->", +">>>>>:;#++::::::# +*->", +">>>>>>:;+::::::&o #*>>", +">>>>>>:;;::=:=#X +*=>>", +">>>>>>>:=; +%*>>>", +">>>>>>>>;%+X o+$&=>>>>", +">>>>>>>>>>-==&**>>>>>>" +}; diff --git a/src/pkg/icons/warning_sign.xpm b/src/pkg/icons/warning_sign.xpm new file mode 100644 index 0000000..95b898b --- /dev/null +++ b/src/pkg/icons/warning_sign.xpm @@ -0,0 +1,77 @@ +/* XPM */ +static const char * warning_sign_xpm[] = { +"16 16 58 1", +" c None", +". c #760000", +"+ c #770000", +"@ c #9E0000", +"# c #8B0000", +"$ c #D72929", +"% c #BB1414", +"& c #AF0000", +"* c #E1AEAE", +"= c #8C0000", +"- c #D94141", +"; c #E5E5E5", +"> c #B40000", +", c #E2ABAB", +"' c #313131", +") c #8E0000", +"! c #DA3C3C", +"~ c #E8E7E7", +"{ c #404040", +"] c #B80000", +"^ c #E4AAAA", +"/ c #E9E9E9", +"( c #4D4D4D", +"_ c #900000", +": c #DB3939", +"< c #EAE8E8", +"[ c #EAEAEA", +"} c #5B5B5B", +"| c #BC0000", +"1 c #E5A7A7", +"2 c #ECECEC", +"3 c #EBEBEB", +"4 c #686868", +"5 c #920000", +"6 c #DC3333", +"7 c #EDEAEA", +"8 c #EDEDED", +"9 c #E1E1E1", +"0 c #C00000", +"a c #E7A4A4", +"b c #EFEFEF", +"c c #EEEEEE", +"d c #434343", +"e c #940000", +"f c #DC2F2F", +"g c #F0ECEC", +"h c #F0F0F0", +"i c #5A5A5A", +"j c #750000", +"k c #C40000", +"l c #E69393", +"m c #F2F2F2", +"n c #F1F1F1", +"o c #990000", +"p c #D10000", +"q c #D60000", +"r c #930000", +"s c #9F0000", +" .. ", +" +@@+ ", +" #$%# ", +" +&**&+ ", +" =-;;-= ", +" +>,'',>+ ", +" )!~{{~!) ", +" +]^/((/^]+ ", +" _:<[}}[<:_ ", +" .|12344321|. ", +" 567829928765 ", +" #0abc8dd8cba0# ", +" efghbciicbhgfe ", +"jklmnhbccbhnmlkj", +"opqqqqqqqqqqqqpo", +"jrssssssssssssrj"}; diff --git a/src/utf8.h b/src/utf8.h new file mode 100644 index 0000000..3549a0a --- /dev/null +++ b/src/utf8.h @@ -0,0 +1,38 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: utf8.h + + Author: Stefan Hundhammer + +/-*/ + + +#ifndef utf8_h +#define utf8_h + +#include +#include + +inline QString fromUTF8(const string &str) +{ + return QString::fromUtf8(str.c_str() ); +} + + +inline string toUTF8(const QString &str) +{ + QCString result = str.isEmpty() ? QCString("") : str.utf8(); + return string(result.data() ); +} + +#endif // utf8_h diff --git a/testsuite/.cvsignore b/testsuite/.cvsignore new file mode 100644 index 0000000..ae31c79 --- /dev/null +++ b/testsuite/.cvsignore @@ -0,0 +1,12 @@ +Makefile +Makefile.in +site.exp +tmp.out* +tmp.err* +tmp.log* +.deps +.libs +runqt +y2qt +*.log +*.sum diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am new file mode 100644 index 0000000..57289ed --- /dev/null +++ b/testsuite/Makefile.am @@ -0,0 +1,9 @@ +# +# Makefile.am for qt/testsuite +# + + +clean-local: + rm -f tmp.err.* tmp.out.* ycp.log ycp.sum site.exp libycp.log libycp.sum site.bak + +EXTRA_DIST = README diff --git a/testsuite/README b/testsuite/README new file mode 100644 index 0000000..55d949e --- /dev/null +++ b/testsuite/README @@ -0,0 +1,16 @@ +Qt testsuite + +The Qt testsuite test the y2qt component by running all +.ui files in the qt.test directory (qt.test/*.ui) through +runqt. + +Every run results in a stdout and stderr output which is +checked agains .out and .err respectively. + +The file lib/qt.exp defines a function which runs all tests +contained in qt.test (i.e. makes a 'glob' on qt.test/*.ui) + +For every .ui file you put in tests, you must create the proper +.out and .err file with the following command + +runqt file.ui > file.out 2> file.err diff --git a/testsuite/config/default.exp b/testsuite/config/default.exp new file mode 100644 index 0000000..fe1e08a --- /dev/null +++ b/testsuite/config/default.exp @@ -0,0 +1,2 @@ +# default.exp -- empty + diff --git a/testsuite/config/unix.exp b/testsuite/config/unix.exp new file mode 100644 index 0000000..a818617 --- /dev/null +++ b/testsuite/config/unix.exp @@ -0,0 +1,5 @@ +load_lib "y2qt_init.exp" + +proc y2qt_exit {} {} +proc y2qt_version {} {} + diff --git a/testsuite/config/unknown.exp b/testsuite/config/unknown.exp new file mode 100644 index 0000000..fe48c2f --- /dev/null +++ b/testsuite/config/unknown.exp @@ -0,0 +1,2 @@ +perror "No setup for current configuration" +exit 1 diff --git a/testsuite/lib/y2qt.exp b/testsuite/lib/y2qt.exp new file mode 100644 index 0000000..2c48ef1 --- /dev/null +++ b/testsuite/lib/y2qt.exp @@ -0,0 +1 @@ +# qt.exp -- empty diff --git a/testsuite/lib/y2qt_init.exp b/testsuite/lib/y2qt_init.exp new file mode 100644 index 0000000..0827e4d --- /dev/null +++ b/testsuite/lib/y2qt_init.exp @@ -0,0 +1,54 @@ +# +# run a ui file with y2qt +# +proc y2qt-run { src } { + + set path [split $src "/"] + set filename [lindex $path [expr [llength $path]-1]] + + # extract basename and check extension + + set fname [split $filename "."] + + if {[llength $fname] < 2} { + fail "Bad filename syntax '$src'" + return + } + if {[lindex $fname [expr [llength $fname]-1]] != "ui"} { + fail "Not .ui extension '$src'" + return + } + + # setup filenames + + set base_name [lindex $fname 0] + + set stdout_name "tests/$base_name.out" + set tmpout_name "tmp.out.$base_name" + set tmperr_name "tmp.err.$base_name" + + # due to a change of _debug() the stderr will be redirected to a log + # set stderr_name "tests/$base_name.err" + + # run the test for qt + + set result [exec "runqt" "$src" "-l" "$tmperr_name" ">" "$tmpout_name"] + + # check return code + + if {$result != ""} { + warning "Compilation of $base_name results in '$result'" + } + + # check stdout + + if {[diff $stdout_name $tmpout_name] != 1} { + fail "Wrong stdout for $base_name" + } + + # check stderr -- no longer needed ?! + + # ok, all is fine + + pass $base_name +} diff --git a/testsuite/runqt.cc b/testsuite/runqt.cc new file mode 100644 index 0000000..682ef56 --- /dev/null +++ b/testsuite/runqt.cc @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------\ +| | +| __ __ ____ _____ ____ | +| \ \ / /_ _/ ___|_ _|___ \ | +| \ V / _` \___ \ | | __) | | +| | | (_| |___) || | / __/ | +| |_|\__,_|____/ |_| |_____| | +| | +| core system | +| (C) SuSE GmbH | +\----------------------------------------------------------------------/ + + File: runqt.cc + + Author: Klaus Kaempf (kkaempf@suse.de) + Maintainer: Klaus Kaempf (kkaempf@suse.de) + +/-*/ + +#include + +#include "YUIQt.h" + +#include +#include +#include + +extern int yydebug; + +int +main (int argc, char *argv[]) +{ + const char *fname = 0; + FILE *infile = stdin; + + if (argc > 1) { + int argp = 1; + while (argp < argc) { + if ((argv[argp][0] == '-') + && (argv[argp][1] == 'l') + && (argp+1 < argc)) { + argp++; + set_log_filename (argv[argp]); + } + else if (fname == 0) { + fname = argv[argp]; + } else { + fprintf (stderr, "Bad argument '%s'\nUsage: runqt [ name.ycp ]\n", argv[argp]); + } + argp++; + } + } + + YCPParser *parser; + parser = new YCPParser (); + + if (!parser) { + fprintf (stderr, "Failed to create YCPParser\n"); + return 1; + } + + YUIInterpreter *interpreter; + interpreter = new YUIQt (argc, argv, true, NULL); + + if (!interpreter) { + fprintf (stderr, "Failed to create YUIQt\n"); + delete parser; + return 1; + } + + if (fname != 0) { + infile = fopen (fname, "r"); + if (infile == 0) { + fprintf (stderr, "Failed to open '%s'\n", fname); + return 1; + } + } + else { + fname = "stdin"; + } + + parser->setInput (infile, fname); + parser->setBuffered(); + + YCPValue value = YCPVoid(); + + for (;;) { + value = parser->parse(); + if (value.isNull()) + break; + + value = interpreter->evaluate(value); + + printf ("(%s)\n", value->toString().c_str()); + } + + delete interpreter; + delete parser; + + if (infile != stdin) + fclose (infile); + + return 0; +} diff --git a/testsuite/tests/Label1.ui b/testsuite/tests/Label1.ui new file mode 100644 index 0000000..7396d62 --- /dev/null +++ b/testsuite/tests/Label1.ui @@ -0,0 +1,11 @@ +{ + OpenDialog( + `VBox( + `Label("Hello, World!"), + `PushButton("&OK") + ) + ); + UserInput(); + CloseDialog(); + return 0; +} diff --git a/testsuite/tests/aaa.err b/testsuite/tests/aaa.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/aaa.out b/testsuite/tests/aaa.out new file mode 100644 index 0000000..08cd10f --- /dev/null +++ b/testsuite/tests/aaa.out @@ -0,0 +1,2 @@ +(`stdio()) +("After building the test environment new:all make clean, make -f Makefile.cvs, configure --prefix=/,make and make install as root.... there is more information on stderr ...It's a libtool feature :-) When you make a program a script will beinstalled in the source directory which will do the final linkingjust before you run it. (Just do more ui/Qt/qt to see what I mean)\nThe messages are warnings issued by the linker(for some reason these warnings are enabled within SuSE linux). Whenyou run the program a second time, the program is already linked so youwon't get the warnings any more.\nYou can get rid of the warnings by removing the \"-warn-common\" outof your egcs specfile. No idea why it is in there in the first place.") diff --git a/testsuite/tests/aaa.ui b/testsuite/tests/aaa.ui new file mode 100644 index 0000000..4e9d008 --- /dev/null +++ b/testsuite/tests/aaa.ui @@ -0,0 +1,34 @@ + +# --------------------------------------------------------- +# +# Filename: aaa.ui +# +# Purpose: dummy test case for ui test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# Remarks: there is more information on stderr +# +# --------------------------------------------------------- + +{ + return( "After building the test environment new:" + + "all make clean, make -f Makefile.cvs, configure --prefix=/," + + "make and make install as root." + + "... there is more information on stderr ..." + + + "It's a libtool feature :-) When you make a program a script will be" + + "installed in the source directory which will do the final linking" + + "just before you run it. (Just do more ui/Qt/qt to see what I mean)\n" + + + "The messages are warnings issued by the linker" + + "(for some reason these warnings are enabled within SuSE linux). When" + + "you run the program a second time, the program is already linked so you" + + "won't get the warnings any more.\n" + + + "You can get rid of the warnings by removing the \"-warn-common\" out" + + "of your egcs specfile. No idea why it is in there in the first place." ); +} + diff --git a/testsuite/tests/mkdata.sh b/testsuite/tests/mkdata.sh new file mode 100755 index 0000000..1f50408 --- /dev/null +++ b/testsuite/tests/mkdata.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# mkdata make test data +# +../../y2ui < $1.ui > $1.out 2> $1.err diff --git a/testsuite/tests/ru1.err b/testsuite/tests/ru1.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/ru1.out b/testsuite/tests/ru1.out new file mode 100644 index 0000000..f1e42a2 --- /dev/null +++ b/testsuite/tests/ru1.out @@ -0,0 +1,2 @@ +(`stdio()) +("If you get a warning next, something likeWARNING: No font available with requested character set! #1please have a look at the installed fonts.At the moment variable fonts are not installed") diff --git a/testsuite/tests/ru1.ui b/testsuite/tests/ru1.ui new file mode 100644 index 0000000..425c79b --- /dev/null +++ b/testsuite/tests/ru1.ui @@ -0,0 +1,102 @@ + +# --------------------------------------------------------- +# +# Filename: Ru1.ui +# +# Purpose: test cases for ui test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# Remarks: Always the user interaction is removed: +# any answer = UserInput(); +# Furthermore the tested action is set into a loop +# +# --------------------------------------------------------- + +{ + SetCharset("ISO 8859-5"); + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + any vbox = `VBox( + +// Main.cpp:112 + `Label ("Copying system config file."), + `Label ( "Копирование Системной Конфугурации"), + +// Main.cpp:231 Main.cpp:250 MenuAction.cpp:364 MenuAction.cpp:386 MenuAction.cpp:878 + `Label ("DISMISS"), + `Label ( "ПРОДОЛЖИТЬ"), + +// Main.cpp:235 MenuAction.cpp:371 + `Label ("Yudit: information"), + `Label ( "Yudit: информация"), + +// Main.cpp:254 + `Label ("Yudit: error"), + `Label ( "Yudit: ошибка"), + +// MainWidget.cpp:208 + `Label ("File"), + `Label ( "Файл"), + +// MainWidget.cpp:210 + `Label ("Open..."), + `Label ( "Открыть..."), + +// MainWidget.cpp:212 + `Label ("Append..."), + `Label ( "Добавить..."), + +// MainWidget.cpp:214 + `Label ("Re-Load"), + `Label ( "Перезагрузить"), + +// MainWidget.cpp:216 + `Label ("New Window"), + `Label ( "Новое Окно"), + +// MainWidget.cpp:219 + `Label ("Save"), + `Label ( "Записать"), + +// MainWidget.cpp:221 + `Label ("Save As..."), + `Label ( "Записать В Файл..."), + +// MainWidget.cpp:224 MainWidget.cpp:317 + `Label ("Config"), + `Label ( "Конфигурация"), + +// MainWidget.cpp:226 + `Label ("Print..."), + `Label ( "Печать..."), + +// MainWidget.cpp:229 + `Label ("Close"), + `Label ( "Закрыть"), + +// MainWidget.cpp:231 + `Label ("Exit All"), + `Label ( "Конец Работы"), + ok + ); + + integer loop = 0; + while( loop < 10 ) + { + ShowDialog( Dialog( vbox )); + any CurrentMap = QueryDialog( ); + CloseDialog(); + + if( ( is( CurrentMap, map ) == false ) || + ( size( CurrentMap ) != 0 ) ) return false; + + loop = loop + 1; + } + return( "If you get a warning next, something like" + + "WARNING: No font available with requested character set! #1" + + "please have a look at the installed fonts." + + "At the moment variable fonts are not installed" ); +} + diff --git a/testsuite/tests/stretch2.err b/testsuite/tests/stretch2.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/stretch2.out b/testsuite/tests/stretch2.out new file mode 100644 index 0000000..dff4e8f --- /dev/null +++ b/testsuite/tests/stretch2.out @@ -0,0 +1,2 @@ +(`stdio()) +(true) diff --git a/testsuite/tests/stretch2.ui b/testsuite/tests/stretch2.ui new file mode 100644 index 0000000..6c8c89c --- /dev/null +++ b/testsuite/tests/stretch2.ui @@ -0,0 +1,44 @@ + +# --------------------------------------------------------- +# +# Filename: Stretch2.ui +# +# Purpose: test cases for UI test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# --------------------------------------------------------- + + +// Example 2 for Stretch +// +// Syntax: Stretch() +// + + +{ + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + + integer loop = 0; + while( loop < 100 ) + { + ShowDialog( + Dialog(`VBox( + `Stretch(), + `Label("Some text goes here"), + `Stretch(), + `Label("This is some more text"), + ok + ))); + any CurrentMap = QueryDialog( ); + CloseDialog(); + + if( ( is( CurrentMap, map ) == false ) || ( size( CurrentMap ) != 0 )) return( false ); + + loop = loop + 1; + } + + return true; +} diff --git a/testsuite/tests/textentry3.err b/testsuite/tests/textentry3.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/textentry3.out b/testsuite/tests/textentry3.out new file mode 100644 index 0000000..dff4e8f --- /dev/null +++ b/testsuite/tests/textentry3.out @@ -0,0 +1,2 @@ +(`stdio()) +(true) diff --git a/testsuite/tests/textentry3.ui b/testsuite/tests/textentry3.ui new file mode 100644 index 0000000..5fc31a9 --- /dev/null +++ b/testsuite/tests/textentry3.ui @@ -0,0 +1,66 @@ + +# --------------------------------------------------------- +# +# Filename: Textentry3.ui +# +# Purpose: test cases for ui test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# Remarks: Always the user interaction is removed: +# any answer = UserInput(); +# Furthermore the tested action is set into a loop +# +# --------------------------------------------------------- + +// Example 3 for Textentry +// +// Syntax: Textentry( Id id, UTF8 label ,UTF8 defaultText [, int maxLength, [int fieldSize]] ) +// + +{ + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + any dialog = Dialog( `VBox( + `Textentry(`Id("text"), "&Please enter your name:", "Helmut"), + ok + )); + + any CurrentMap = $[]; + integer loop = 0; + while( loop < 100 ) + { + any dialog = Dialog( `VBox( + `Textentry(`Id("text"), "&Please enter your name:", "Helmut"), + ok + )); + + ChangeWidget( dialog, `Id("text"), "Hans-Diether" ); + ShowDialog(); + CurrentMap = QueryDialog( dialog ); + CloseDialog(); + + if( ( is( CurrentMap, map ) == false ) || + ( size( CurrentMap ) != 1 ) || + ( select( CurrentMap, 0 ) != [ `Id("text"), "Hans-Diether" ] ) ) return false; + + dialog = Dialog( `VBox( + `Textentry(`Id("text"), "&Please enter your name:", "Helmut"), + ok + )); + + ChangeWidget( dialog, `Id("text"), "Helmut" ); + ShowDialog(); + CurrentMap = QueryDialog( dialog ); + CloseDialog(); + + if( ( is( CurrentMap, map ) == false ) || + ( size( CurrentMap ) != 1 ) || + ( select( CurrentMap, 0 ) != [ `Id("text"), "Helmut" ] ) ) return false; + + loop = loop + 1; + } + + return true; +} diff --git a/testsuite/tests/thread002.err b/testsuite/tests/thread002.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/thread002.out b/testsuite/tests/thread002.out new file mode 100644 index 0000000..dff4e8f --- /dev/null +++ b/testsuite/tests/thread002.out @@ -0,0 +1,2 @@ +(`stdio()) +(true) diff --git a/testsuite/tests/thread002.ui b/testsuite/tests/thread002.ui new file mode 100644 index 0000000..92f60dc --- /dev/null +++ b/testsuite/tests/thread002.ui @@ -0,0 +1,63 @@ + +# --------------------------------------------------------- +# +# Filename: threadXXX.ui +# +# Purpose: test cases for ui test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# Remarks: Always the user interaction is removed: +# any answer = UserInput(); +# Furthermore the tested action is set into a loop +# +# --------------------------------------------------------- + + +// Example1 for threads, former vbox1 +// +// Syntax: VBox( [Id id, ] widget1, widget2, ... ) +// + +{ + + define Check( ) + `` { + return( ( is( CurrentMap, map ) == true ) && + ( size( CurrentMap ) == 4 ) && + ( select( CurrentMap, 0 ) == [`Id("cb1"), false] ) && + ( select( CurrentMap, 1 ) == [`Id("cb2"), false] ) && + ( select( CurrentMap, 2 ) == [`Id("cb3"), false] ) && + ( select( CurrentMap, 3 ) == [`Id("cb4"), false] ) ); + }; + + if( true ) + { + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + + integer loop = 0; + while( loop < 10 ) + { + any dialog = Dialog( `VBox( + `VBox( + `Checkbox(`Id("cb1"), "Option1"), + `Checkbox(`Id("cb2"), "Option2"), + `Checkbox(`Id("cb3"), "Option3"), + `Checkbox(`Id("cb4"), "Option4") + ), + ok + )); + + ShowDialog( ); + any CurrentMap = QueryDialog( dialog ); + CloseDialog( ); + if( Check() == false ) return false; + + loop = loop + 1; + } + } + return( true ); +} + diff --git a/testsuite/tests/vbox1.err b/testsuite/tests/vbox1.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/vbox1.out b/testsuite/tests/vbox1.out new file mode 100644 index 0000000..dff4e8f --- /dev/null +++ b/testsuite/tests/vbox1.out @@ -0,0 +1,2 @@ +(`stdio()) +(true) diff --git a/testsuite/tests/vbox1.ui b/testsuite/tests/vbox1.ui new file mode 100644 index 0000000..41eee6c --- /dev/null +++ b/testsuite/tests/vbox1.ui @@ -0,0 +1,133 @@ + +# --------------------------------------------------------- +# +# Filename: Vbox1.ui +# +# Purpose: test cases for ui test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# Remarks: Always the user interaction is removed: +# any answer = UserInput(); +# Furthermore the tested action is set into a loop +# +# --------------------------------------------------------- + + +// Example1 for VBox +// +// Syntax: VBox( [Id id, ] widget1, widget2, ... ) +// +// A VBox is used to give the UI a hint about how to +// organize the dialog. All widgets listed inside the VBox +// are laid out from top to bottom. +// +// A VBox can have an Id. This Id will be added as a prefix +// to all widget Ids within the VBox. +// +// This example shows a VBox which organizes 4 checkboxes +// above each other. +// + + +{ + + define Check( boolean CheckBoxTwoState ) + ``{ + return( ( is( CurrentMap, map ) == true ) && + ( size( CurrentMap ) == 4 ) && + ( select( CurrentMap, 0 ) == [`Id("cb1"), false] ) && + ( select( CurrentMap, 1 ) == [`Id("cb2"), CheckBoxTwoState] ) && + ( select( CurrentMap, 2 ) == [`Id("cb3"), false] ) && + ( select( CurrentMap, 3 ) == [`Id("cb4"), false] ) ); + }; + + +// the display function ShowDialog() is called without parameters + if( true ) + { + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + + integer loop = 0; + while( loop < 100 ) + { + any dialog = OpenDialog( `VBox( + `VBox( + `Checkbox(`Id("cb1"), "Option1"), + `Checkbox(`Id("cb2"), "Option2"), + `Checkbox(`Id("cb3"), "Option3"), + `Checkbox(`Id("cb4"), "Option4") + ), + ok + )); + + ShowDialog( ); + any CurrentMap = QueryDialog( dialog ); + CloseDialog( ); + + if( Check( false ) == false ) return false; + + loop = loop + 1; + } + } + +// the display function ShowDialog() is called with the dialog parameter + if( true ) + { + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + + integer loop = 0; + while( loop < 100 ) + { + any dialog = Dialog( `VBox( + `VBox( + `Checkbox(`Id("cb1"), "Option1"), + `Checkbox(`Id("cb2"), "Option2"), + `Checkbox(`Id("cb3"), "Option3"), + `Checkbox(`Id("cb4"), "Option4") + ), + ok + )); + + ShowDialog( dialog ); + any CurrentMap = QueryDialog( dialog ); + CloseDialog( dialog ); + + if( Check( false ) == false ) return false; + + loop = loop + 1; + } + } + +// the display function ShowDialog() is called with the dialog itself + if( true ) + { + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + + integer loop = 0; + while( loop < 100 ) + { + ShowDialog( + Dialog( `VBox( + `VBox( + `Checkbox(`Id("cb1"), "Option1"), + `Checkbox(`Id("cb2"), "Option2", true), + `Checkbox(`Id("cb3"), "Option3"), + `Checkbox(`Id("cb4"), "Option4", false) + ), + ok + ))); + any CurrentMap = QueryDialog( ); + CloseDialog( ); + + if( Check( true ) == false ) return false; + + loop = loop + 1; + } + } + + return true; +} + diff --git a/testsuite/tests/vbox2.err b/testsuite/tests/vbox2.err new file mode 100644 index 0000000..e69de29 diff --git a/testsuite/tests/vbox2.out b/testsuite/tests/vbox2.out new file mode 100644 index 0000000..dff4e8f --- /dev/null +++ b/testsuite/tests/vbox2.out @@ -0,0 +1,2 @@ +(`stdio()) +(true) diff --git a/testsuite/tests/vbox2.ui b/testsuite/tests/vbox2.ui new file mode 100644 index 0000000..909fc14 --- /dev/null +++ b/testsuite/tests/vbox2.ui @@ -0,0 +1,81 @@ + +# --------------------------------------------------------- +# +# Filename: Vbox2.ui +# +# Purpose: test cases for ui test +# +# Creator: jd@suse.de +# +# Maintainer: jd@suse.de +# +# Remarks: Always the user interaction is removed: +# any answer = UserInput(); +# Furthermore the tested action is set into a loop +# +# --------------------------------------------------------- + +// Example 2 for VBox +// +// Syntax: VBox( [Id id, ] widget1, widget2, ... ) +// +// A VBox is used to give the UI a hint about how to +// organize the dialog. All widgets listed inside the VBox +// are laid out from top to bottom. +// +// A VBox can have an Id. This Id will be added as a prefix +// to all widget Ids within the VBox. +// +// This example shows two VBox'es. The first VBox has an Id +// set. The Id's of the checkboxes in this VBox will be +// prefixed with the Id of the VBox. +// + + +{ + define Check( ) + `` { + return( ( ( is( CurrentMap, map ) == true ) && + ( size( CurrentMap ) == 5 ) && + ( select( CurrentMap, 0 ) == [`Id("vb", "cb1", "cb2", "cb3", "cb4"), false] ) && + ( select( CurrentMap, 1 ) == [`Id("cb1"), false] ) && + ( select( CurrentMap, 2 ) == [`Id("cb2"), false] ) && + ( select( CurrentMap, 3 ) == [`Id("cb3"), false] ) && + ( select( CurrentMap, 4 ) == [`Id("cb4"), false] ))); + }; + + + any ok = `HBox(`Stretch(), `Pushbutton(`Id("ok"), "OK"), `Stretch()); + + boolean CheckState = true; + integer loop = 0; + while( loop < 100 ) + { + any dialog = Dialog( `VBox( + `VBox( `Id("vb"), + `Checkbox(`Id("cb1"), "Option1"), + `Checkbox(`Id("cb2"), "Option2"), + `Checkbox(`Id("cb3"), "Option3"), + `Checkbox(`Id("cb4"), "Option4") + ), + `VBox( + `Checkbox(`Id("cb1"), "Option1"), + `Checkbox(`Id("cb2"), "Option2"), + `Checkbox(`Id("cb3"), "Option3"), + `Checkbox(`Id("cb4"), "Option4") + ), + ok + )); + + ShowDialog(); + any CurrentMap = QueryDialog( dialog ); + CloseDialog( dialog ); + + CheckState = Check( ); + if( CheckState == false ) return CheckState; + + loop = loop + 1; + } + + return CheckState; +} diff --git a/testsuite/y2qt.cc b/testsuite/y2qt.cc new file mode 100644 index 0000000..7750331 --- /dev/null +++ b/testsuite/y2qt.cc @@ -0,0 +1 @@ +/* it's all in liby2/src/genericfrontend.cc */ diff --git a/testsuite/y2qt.test/y2qt.exp b/testsuite/y2qt.test/y2qt.exp new file mode 100644 index 0000000..49abf4f --- /dev/null +++ b/testsuite/y2qt.test/y2qt.exp @@ -0,0 +1,12 @@ +# +# y2qt.exp +# 'main' file for all ui tests +# + +# get all files matching tests/*.ui + +set filenames [glob $srcdir/tests/*.ui] + +# foreach file, call ui-run (from testsuite/lib) + +foreach file $filenames { y2qt-run $file } diff --git a/yast2-qt.spec.in b/yast2-qt.spec.in new file mode 100644 index 0000000..0d34db7 --- /dev/null +++ b/yast2-qt.spec.in @@ -0,0 +1,52 @@ +@HEADER-COMMENT@ + + +@HEADER@ +BuildRequires: dbus-1-devel boost-devel libzypp-devel curl-devel docbook-xsl-stylesheets doxygen libdrm-devel libjpeg-devel libxcrypt-devel libxslt perl-XML-Writer qt3-devel rpm-devel sgml-skel update-desktop-files yast2-devtools yast2-core-devel hal-devel + +Summary: - +BuildRequires: yast2-core-devel >= 2.15.6 +Requires: libzypp >= 3.11.8 +Provides: yast2_ui +Provides: y2base:/var/lib/YaST2/servers/qt +Provides: y2base:/usr/lib/YaST2/servers/qt +Provides: y2base:/usr/lib/YaST2/plugin/libpy2qt.so.2 +Provides: yast2-ui-qt yast2-ui-qt-devel +Obsoletes: yast2-ui-qt yast2-ui-qt-devel +Provides: y2qt +Obsoletes: y2qt + +%description +- + +@PREP@ + +@BUILD-QT@ + +@INSTALL@ +rm -f $RPM_BUILD_ROOT/@plugindir@/libpy2qt.la +rm -f $RPM_BUILD_ROOT/@plugindir@/libpy2qt_pkg.la + + +@CLEAN@ + +%if 0%{?suse_version} <= 1010 +%define _xorg7fonts /usr/X11R6/lib/X11/fonts +%else +%define _xorg7fonts /usr/share/fonts +%endif + +%files +%defattr (-, root, root) +@plugindir@/libpy2qt.so.* +@plugindir@/libpy2qt.so +@plugindir@/libpy2qt_pkg.so.* +@plugindir@/libpy2qt_pkg.so +@imagedir@ +%dir %{_xorg7fonts}/uni +%verify(not md5 size mtime) %{_xorg7fonts}/uni/fonts.dir +%{_xorg7fonts}/uni/newunifont.pcf.gz +%{_xorg7fonts}/uni/unifont.pcf.gz +%dir @ydatadir@ +@ydatadir@/lang_fonts +%doc @docdir@ -- 2.39.2

    i`@(OY;H=8SYKIZg8 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 iuw{wFzw3uSui?yBB+RaAyn+ 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⁡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 <-NL9$8Hw|-P%;x+$yn|T~KtZQv;9&0E|}x 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

    t95&tK5xJ)I_rD6$>e)tFiSzre1$@uXpHBKb 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Ɲnxjs?ypy$G zehO%;gETH=*Qq-3={?#g8-h z4j#rrGMAXgAF?5P@Lf*Y();2AVZr~h*-r-VkvH6-v2dOw=+~1y6vHt+d*9Qu3Y*$8 z#`uZ%zh62jqFy2_l)_G0%-GU7vNzs**m2Ey>>(jd=c-hx&1mkFuNCtwZ`)!vS>fFa zjiTWd6!ki&dp!5A%9aB++cjmju;TI6zF#t2#yv~VQTvTTQ}<`SmK)SE z%R1}jeG(%`LFQ&Ic4Yt{9JJ(C0L@+!_v?RVPUEr+nuqpM%2k)2UXu=VxV66S2=UlI zDPprIXj>g~OU`VvZg?+xDoP}ZRgpcC7>E_DHL$A4SsP0u&V0o?K=YL9`UNnt2)(3igtu7tc_C&UFLT;;K=fzr3HZhcO=Qd}2c zXOYOx)IjB&lW>{&_Je@AmQwe&J1qzD=dsMG3*I!Wvm<1A=4iPMJ8 zw_c?@$N!#;&MPNe2JFZruZ}DoaP#Cew_|?y>|4(}$*@hu&0Gd*g-R?v+qUFAi1bs-NB-mZYWrG5_~_KEGiY4c zb^AbjL_f=0WWYl3x1;dR*OPzroj9%QeuM ztz5RqGrTjO=84j79TUX2(2%Ya3u|H`pWW$Il)SfcsZn0QSR1;Y(Gxa=;(C{uEcsgv z&U(7R*ZGUU;0A*iK?GgJi}*s(m&H^ZB8e31v7>Z&-50tXReIX`z9S{HmcQ1ew-Q&d zr5V(=&jWc_8F~Q$d?Vt7v%B|5iAWiatTfR*l`|qvmm8-c*KPaSt$$0VyF9iHpI>m1 zyS3qPJWp~|ED}-HW^aR6`j4aevd&gQ{X&(T1L8*S4HbV!Fr)2ucZJ!-^8s5T9cZWykBw=uPSnR*%P!M;LY6p63Q??-x5F&qPXK?yc80 zIw;p?OAK@a6h)MDK#o2}qFDo(GOLgC_Nf~-wtB}Gr+FNdY`wN!Uo^$5EJ|!s-w7|S z2l9)cYWbWXIqpwccp&C~1H;}bpbY)>-EBv%VPitGVQ@FnLP4F;xDus_1iVDyL8%-Q z2!DdZs^c89-9$jY88?Y9r;un1MhfEe8meE@i$34Vf(4tw;t^z+RVt=Gt0AaC@*~{t z3Hhq2uE4*YuI@iTgC*vs^-5S{~1Xntz&rx|EwuvG0&X{pMP0p zW~wcI>n!yL48EmF>A_<{xKp3?mNM5CngjX5#4~Tw`G%P75GGJ<=&XOx>1N@yW=J{8 z?a{WgY_O#=0tA1JTd8K$(&B>d@ZrR&^oENh%gC$dLgwP2lns3My8IQXf&9t)TYqUu zWb;wtG4?+5=mBjs-mrW+heN1f__Xmc;Hjx*JL^x3c6f-UpKhaA7imbPbp-uFFki81 zfcur{&^>%vy}$)Td&SMUb1d{u6oqsums&;pd*?u6 zs>OJ`LBYzW$wflJvh@pUv?q|a+X*4^qrzvo*qANBV&i|Rv9nFFm$p;F;K!{SlQzgN38{J+1>9S#`8PkR)uOv5SmW?)v&uCgNC3*?2Q((ORevmuw@ik9>%cs;VTKVxntcfc9$qIQj(%)#HNhr z9?Pk`Ytm!|ypkL;!dc@xUQf>qfXMDLpolX?%BwiSB71J{vNSLX=q;Imo^35Oy5#gx z0z*Ik;|=-~){T9!_!KqL{=^bw6=|lt5;8E0R~h}SNm1K{3g)g4vvxM;YmcQ4*JG8A zsed<&KZTloauE}+_dlT2G1K>sZG88nY^)qeSA9A;mYwi*f@%74FiW=KHVrcS{6v}g zU1dP`xsNiEl+4EacJ%p}M-4tVIzaEIUrze`iCphy83Rf$4;l@geIH+6ZzXq@RyfY9 zGPrlU1=;0Ypjc)$`JtIOU7t2cQYT}#2XKO6Tg?d5hg-Zc;%Qof=nc077BpfYDUM>=IP>s_40j!;6X&kjzM zY@fUNO)0BJ`H#R~r4^!4PCJl`RS8LBqx`25ncMSpFRxPOZ6 z7lR#e{EnHW8i(zdpV^c4z+2H<$KSpFs>B3Xcdj~F>cSeQ$1)0lgLM$Sx+Q70Hi3=5 zEQE1IoL>bQ+eU}{a=`zyvTy2xzeW{cTlZ#TeKW+f(c$`wg1tdZETABtFTp*^09@k- zw;1eWd0Ej=$g2D8{{-m&yNIm*F|8D4SjD0G7n=G+wB3UvXXAfs@nP_W>G)<9j+GYD z?+Wu`duuX{YdlB&q!4u*7lw->(m-4osMt5RxY6~%Zl@0CzuF?-<+gvaVl=E>(Yvk4gfC~@&&j!dX=IQq zK?V7VY|QY&Bv#!&TWENm?WUfNZ`I@PgH7#==8p;gYUyvQ0fTtmtxR@T7=?HOjg_f zRa!WoCPDXa5ObK`^$oMz^7_WE*Dpn#e%xSHYywFdi~r0uerOZ9l}R3YdhIi&#pCaq z_UVye5YD;utV*3yG0bD!71KPo6xy8z@kvzb_r{$%?5MTl%N$Nz)KLF2GBcm!<^_gU z%&hfpp?W>{d(SlPC4-=N^+R;k)eEl0HM<5WvwXW<(pd)XL@?WDAES6;CCu(;dq%ZJ z)-9wb*x2cK`akiw7*F|J{{a`_iED$+?B9t98z;!7I!R^eVSeLJNQ;{e;B6>MrRRk= zZ*kofBJ5Cf!NdQr<`^S5ZubR(!JV>IFYr6pvZs0Z!@SpG{RLMtTr$0HSbzk7@CzRr z&%j0WX@?=QBgE+{;5HbDi@9Q`sn{ZZ$r*?vJGiT%22`%#nRH~r=UbUpq!-B0&VmPy zT*wscyYFBF4Xk{H?|IXP@}EcrvcS&!f@M-yrUXh`w<5&If63Ia+_0JzeJ_|7ra0O| z?Z`OM?Fii`%5=%Rck7rI9tPy-(~@kEwhND{rjrJI534jy(5Cd{hI=P_^WUdO4uQ|) z@oZla0^iSVz7fM6w}La7Hamt|?4c*??MU*edXRyks^g3|AMt6xw=IVZ8gCv3@Z%l{r#>H~0KxaoOy$hlAdy%7?+EFr|5k9QR3);ueasOhv6>by!*13MVfpW{=RMhx(In zvA3b3t-8GGU-9o6PL108aRaByHt0l-awnSh+$M(EH^g-=qh`yt#yvZVUm2!SPHOmh zPUh7rqqWC*hP{>fsl1t8u2c6;kZCNT;TB=9)}9QW&M;h|C@l26vPT32jGEeWsq#+E z*z4LxT`9@PZtoSgc;Wq%k*i?T+@MK*u@v9^BU^LN4R+_`MqFdDfQwRi;iTI$*daK+ zz@LF*(K|Ry&Z9W{ry2WvEc`y}#sb#!7Cr^2V7@MHkt21s;4_V}-v#GCtS;Y)H@kh& zJF}FS5Uv|8cY1^{LPn!$o>n#1{%IS?pE-Z!X+q{g;KRX&bs(0DuC+}MT-|4zBoA?_ zEiqZSbvQ}RPJ)e!RICX#4x(I`e@LyeU6cGfJP_5ygL21mX1-V%83M>b?44m$fAAp; zl4-4TihBd}ml>2PM`+R7^V^A)xOeOdK4l5mD2knU9d zt1T9aU%5fCTWB+fi@BKp*b%$-Yu4poH%kgqn04mCNrbmu`QN4wJHF-oepbkCG@wKn zYE$3T&MPcqi#=!zv-*Pf)aNM1%%)zR4MQD#AwjsAM4I&eLzph3= z*>+y_LijC82A4R`Nn5K8#3{_};;GP?XD;fAt2_Bdawj3C_^uY8Asuh#7dy zhVj$dhR%kffZu52=4AI{^nJGdya+Ypctq~t$9KARsCV{^-|+F8_a=>^#VNr130!Dq zGz)qnT!RsT~fSqx%mVGHX5E}ieH@+Y*v{g`W{KW_u9qG2V0_=&XaXV5fX z+|j=Mzt66^sW&RapIR%Vjbat2rQPgahOkd0dSgYy>i~cO^EkEuWD>sl;k8<(IrH?d zOuesEWspB*N`s0vhc2JIBrmhGEiuPOH2@d&ZF44!^tng-{qpz8Yo?Uu1ip>yHKBP= z{<7+79{)_)U~27nlm#O`^lR&M%F48ICh~65BC19@*OXz-m)F4RqZwwb|703nEbyIQ@oAn=|Z_D!=dJ(O@Y@nZ%z9Sq;ru zyX;&I_N35nsFY-z&0&l(2oRLgn<2JpY^2~S7n(Dh#B9Y?Pc(=Ly02hRjL47$?z zIAwIZioGjjnwRDtum+JA23*IH)Rd_QScS{FI(a=&LX(GkEjqZK8aCYkDUIzx3ch7mG_V$ zojPIeLT2xUC(oJ&EBj(5!hLvyLav$fm|t}NpZl=-H_r-L$lNJ~vsetGH?jN{MkEE_ z`gqP&a6M#9@e4#UJzMgOY<=hse76zkenjdMvJAJBET^3am-I#AHV?W*RlXg52(P$E zVDPyXWo}Bwf zfx#K3UM9b4URvuYbD5nV9;~>VixbF_6bP{rjC;cSwzWKs z!|K${%jzj?KV$Rg_ehQFbWv5)ia+#4g}&33R}5WknnjkI ze4Dq@C4NB(@t}Y9q@%sH9hw^Qlrr;|dFb9ck|`-cwiKEX6+V$c0!lC4J-Xm4r{U_r zrz_mBBHrjRWwS*>&keZ#ew_AP=Bg}czo|Cj3}}bo=l^EG5~F_r#*(jL(_~f}RDR@` z=I#^L62SVr1q~ckJeBWdeFEx||9K18gE-G8zP?Ur!;8jH(QUM1bowQwKY#0>L?=LX9qt-&W zuvZLpdT))t94vhx5Qd?bOthAJyCQ~IJFr5blu4H%ldKDr_nUW57S7rx4ydO8Mfx$ZnF}4z1OA|Or)mcu{aIh9LoCIx0A#$nVvN! z{T7xw!JV`rdjG&l#RNO$*e?uqzq_zSVV@J@?Psxdq}$J$mIpO%3eSh1x5(+sDp}j` z8~z%`DBV1jkAQ~Ma-prAn@m#tlq-VgDzcbj>z{6?yck#;OJ`KFZ?6O3>}|>)WO}y> z@_Er_PuR^T&>~?@V&;lRR+C?__$O0Pjfq4{f&;7}`33djY*MXzH;iNF!#BR1jklq0 zv;H^MCq-^<&wi@=37fbg^KQAayg9(8v=#+R6ArvVE=uD5(=_m})1n&{c z_#5604GJv1t!UF2Ko$~rDD0#bL-Q(yCz#Ga{;yOkDUs(Z_ zyf#j4_F+xCEqoyZA)d1(AAm;|htY9A%Q<9x_v93%oNa_AMrF_%0ZJ-Pwgdh2Sl&^e zOTm69KMzFUAU%P_N?Um!<}@=i83_H!zlQ`{S1(RD3+)Z^mDcr1W?Gb6HYWG!_iRa^ z4u}ofuc8Enb4&gI^@1bX<^@!(!2WAY`@qabLS?yV@-?}DhiA4U`f2OI0)lGdT_=?? zy~=v%Bl)UoE(V|`(sgdHAtZUUEjOP=^=`Zz1oI$($Ce1a2leLww-y?-%_@9ol4mt! zxlx8=eWo`#g`Ar#?SQsdl6JLhN)?Xpl1~gj*@~^hD4jl^C9NOw#pM&jGzj2BD7*M_ za5`BKV$YyOMb4K&A4L^&F!MAV_aru^Dz~5g z@*};Gc?yCk8~=x7zP_>l3a#J!L`4%}Z)83H)`rqNmau{BM8@Ak3UKt)e4q5D3QjD0 z?y%3`iNP$Wt-=G5Yh(RhOh4&1d3CDgL*cy}KXg&WtBEkkBSk{{bN;jHwe`xU*D4ic zsxbY?*VN;maJT&>F%U;Zy=>A8Gp3L6&qmgbkmaZLMWez!$sw8ZnZ@RWot%80+HOs& z7uH8g+fm1EH@>c{e@M$`_{k&k9T!zBJY&u{8D{M1=lvPtl|*TlwFO(oq*{@~-)G+5 ziK|N?$fjmCs{Co7zgyi>vVP)5LNCP!-;-%X26=avEk^v(W0fAi&U;W?qh9=MG#?&P z-N-!<3n(I7KG?s%S3y5+tLuKBb-P&-vstcF8>RHC=ar;DHy@yzDm3&;JVG^~nTP4F zFZMRiHTVCa4+Bkp0l#O;YMZ2gAwXq4X9UViGj}nQ6v07U|GZt)-vVkCBileFs1*n( z81&}=f!qj;CvS*JDIcc1-d?M_!wtz@jq4rQ>PK2B&Z{|@ZH@b;5t` zuQZ7WQpNq9y6i(7f9J5oJXgjssnPt#hL#%<^m)92*nc9&ARgGn?$&y?5Zu{dW-%LJ zb={3x+Yk)D3J^E2ddMp#IKO|7rCzXmin8E1n_=X;GDZo=$$*YshU9xAD1O{-aaIKPl{>#Fov%z)Dyc! zJ>H2@D4>WJ7fjFIaQny6rD+NqC67vkK3#GXG32b7eP;PWV^zV?($(tTDD}PP`ti~m zm9V*lNV|_ZaD29}@R0-l_(x6h{!Pn+dFfX*(%AJ&?USFY{W`ZH9t-wejJX{cge5vy z-oZx^9~*EV2T8c8il5N4sOdJE5lUZn-;w$m`{Xq4f5{R<&V2)p^RO*emt56C|2uYE zIc_v;2VM3*Svsg9-=#+0!#M7ohAJ?keWOx<|Bky$XhD?qILuNn89Jg67GgLN7l#n5*~FcVN1L%twa7Q5$P0Us#J;(*bxWLwLi>v`v+6yNBhjhZ^m1B?xNxw)=ejkXZ=m zKzqA-B*qJTPxl(en}WHekaQEdMiUe92vVov>$37)ch!`&QAKjnUo+w}-e=3!AujdB7BHDFh7K5F?Ym+Z2LHMZ6@EC!2f69DCvnJkqf6Cmm zB)~GE*$}+-+~2RnWR+mr$g2=S=?%Lw&||(6P~tUb0Nh~r0_jIWwOkf_^@BX?cf+qM z`}3e5;@%Iwy@o)}e9UaGS9d;7rX+j*2bTax9r^x)ep>^5kJa9f6YB3=W4VOty(%)YFE{sej=z?fM$h~Ju&_u?yBimM zvLiHkNjgR`pxk<^F=EM*ck<2=Q(OFEA38(es`g8{_iPYVPb0IT*MBp=25*D2x{i(a zqyLb-E7r-`*7v6#l$_&=yb-Do-M*(M`QPe{jJ@?Ktv(i1Jba|K{i1@cH(LJW^5I1B zdC%ZmRp(OKd2Y!=h0jIm3;7|GtmOMg*_E2BlJ_S%!`zMdG@kp;ssQd^?Z2?HJaswj zzgO*3M+9F^sECEZp~FNxGe&eEnC|FX&QtNAp!kx_gn;|;Bu<2wT?+mc^!&b*VoRqFPvkE*;XzTC9SYYc34etK977R!NLv`Uj3 zcRLvS#l%4mr%e3wt*@f>yNj>!t%QD-1gm(!lX$$}v0sp#nj@N)PE~FOSDjc?OsO&- zty7V5O*XD$^UN=UOOiZm?cm1$mCd9vY+HO+-TPZ?aP?o!!G56bm4J^m|1e#Uk&5cJ zZc}kPeOhewA2QybV+m)RpuWLUCs2FynWv04+ug}-~b4_K=ZRQ#L z+Lm1b*XR4qC^yS>*T-ud-3#MEvXbsrf^I^N^m(ao($>ss1 zNP|tvLgk28Hhqq`|2Oy7o5~){d~{Fyg3=MFcj$S0F#p5H$q(QEkz|Q{@X+TnarDI-X|*`cN9upymm}}Ka!Cxa zcm;U_bbRy+Xb{8xi4@fOoZ0-1vbAUB4tlHZLW+4UuWNb8`TJjDJqlZ=RrS*jN2b8Z zRyF8tow1X_gVxbGh!o^#$+c~ZeugAt=eK^c373xu@{473b^ybV~^ zq7YS3u3uk+Mt_I3%QA@z5NZ!=@Q?lR?(p|2=8^^=on%bWDLDiGam#golprw=F0ujG z*HfP#^t-7g3){I3nhl|)Siux_MLkV&o|lHDqX#A8BgF*U9Q#sAPKVcg+Pfg*Ax}C z_8GJIb&IzW)v(bvaSA7z$WS!PHBeY@r+51fG%(LFN~7=KgJYOZ0SXnXh1vRyV$_*A zgWa*f_CDPYGUdgxk19HSK0dx;F0E=~d1^rI^j=i@yF*N#Z`TX8+J*=^dERL?J^jJE zAH%tGfmDrpE3KlxS-XATf?taA*I@n9ixvPyU59pWDp*fEwQc&hzaZdq+@JenRT`nI ze6!G}7NO5XnK0`)9(^{1zcZ~~i;Btg5N>_}ejHMbA%6U#YOot4tH4+6qGURFRS?UN z0ggbI{fE6TI)S!(JRd3nOAp#Y{R8xi_d@AfO??^!y1IMA1;yYVt<$dWQ=7I6{ojtx zvww_@H_uwqlye0G;hd*SGS`Z4pPgwK>@WNP&olmDoHJ21*=}9u{DfQmZ85pnj>vRP zPPSp$qj=?*&C4Yx`Aa{88^H|iww!P5O?;bUo_l6YEh#)6Wu4M)Wx}d(T-vh_kz-Ox zxBLJ$VaMEAh^nwmB7rT=v}XXH2u_101uy7$T6HoHRrr5Qj6I zKtzT8$f%J3fp8;+x*u%-MKAmZ0UCvx|4P437236RQI&$0OBUnmXr|J+1tmN(#+(1d z-KMj!|3Sr`y`iD%Bd@GWpfs{mp;9@Eu~71>{N+#OhWBgx4Mr65>*{VjKTq+g z)2vhVXfIDdrXhN5UQ4$rxr=2(2kR;gZLb!BWHN8LxvJehD6%a_gLiXF5)<(+nmUvj z+kO9}X$(ZCoM)hTuCEr9q;sb<*MXKP4UmbggB#1^M^YsPZSi%1p5HisdbIwiv$&ha z4(O1l{We^E)JSlP`@A0B!Tlwx{aH#AQF4~#4_%5mf%m-T`S1l7M-wV1?v*DY#xszN zT;tGI3+E0aBXg!^EjzxYxAHRQ+L92I1GAZH%vSAFOnTCUZlYIj_fh&^77#KULI%I# z9P3JSQubBSMc!3b-yydL>w#QWlp_zcwTl1`NUfYlSGpB;hYc+Xt+#^TMs7`-m((6i zyOa}}YR9v3iybecJfL~JyhK?0=PO3-+{vS2UGljGLjLm`hVvXmU%y#UphM1_{V&ul zvapJUtomkx$7BYXZdi31|IzX?Tlfby`!o@6j#y%tSh6ZX1a;otwhH$IGIj6emafjcTo!D%~n+~^m-G&xM9n9RT2CVAAe>LW`&sx-o^_GcfINcjndzo zd6P?NKCSUv^~yf`>yM|SA_t$!I0b9D3$+69y}jMt7m1h(20^Wp{eH0ypmM2vQQR3K zo>Wq-ZE5ok8x*X>5A0khUHncOR@EBpJCL{Cv3;hj>gnPeVmp)Z8o(83C>Hj363pav zOjMa~h}AvIW9nP*-qTvFks1<>{x%q4v)2iPxXa4J10)p=~aiw^myF zW;_zYtddz%T`Pjd2nhrwKpN#o0m&|S$TeKQ1Tp>(pXi7$o9plJcULw)Nv-oQ=Mk_G zYsggWOKcvUy1TI=fgUG)sx9OFD3R7U<=u9tL2f(7`F~o}cPJ z8^+dMZP?!l9$%5?sdq|UpY29KQr}pq;pW#5Y%@5sSzgIFaYt>eqaR59+@NS$cUtC@ zD%Cd6rCoqqJ#Ynl=!^FjgeAD0<%xf9K9o*`72m4R(Q7^qD>>#9Or8%?Lc#j+Te|Y~ zHkZg*l#Eoix?DsLH8v?y0}oH@bSGfURzh7V!~=M4lyQ@;^@K>nz} zJmZN_vs}ZHy%;QU!TjYzaz-ajW-A)l4qa))t2(t)_10qfBR@&9o6bKv5@OFk%gY2O z#dE>$S;Qq8J!)SVGMdb8ITAnpsH_C|z?yf#x5sUAR+`ieVPO$`tU~5n^CL&H)Vm&1~gT z7<2+(s*sY|@~`55Vff`3{00#}ntKIg3T#clX|=g6&dh|8yx?v5P1+|MA1Yy1a~Q05 zdH-}V@V9RT+FZ#PR#R_};s+;mZ!kwoZ;ofpHY-&Ry47*$T(MGcI@|-}5nPdi>*ALxqvdsnROaYCX39 zmi*D{!AlErA%Qy@F(n1=ZZAI#%$T2~quJ*@;*SS(Jem!C`+I2_ZQI8$Ax4!LYtg?! zusZWD(V#QOo$$^u4hIJV@ui~!TZV{}x*Sj}PKn{5YFSpuE@^V)be!p)Hn$4J&pB}j zY{3h-g+&X!xgk+IZHq|vvL@0!BOphiL;RWMR8(xaAqo^ zlvZB=ZI0})6jq!A)`pIZ6tsBA@E5@)8%$jGEf|HLPv&6swUu8!k%TQ}sJMh6oW(#jJ9AAtb-+e_D5i?h$slrzi~ff(Wq zXs*DUNHkBpi`a$Wx1hh6c6|tVyX)-Ny*GfVw9aZaIM0S4jyBt*A1<@;7;NsW_)~S? z)0qh5o>Ia^lU51f_=XSNqeeGfv(FYeyI!ka!pfnsG)4<9WkLThk<(t|*5!c$JxilG z+Hn>RqtT4ZW+G3Zp%DQWdkw1u`d`+SS0Sxa61;b;*bXuK&AS&9<1J#k`DZ4c9E_Fo zt!#RQ+2|LV**Uvjz^@#0>KY7FxV?09Yh!?(O=s<= zq(pFC#OOx+9lniSATC?_YP=LRJ0t2;)ROE`guCI~{+4i^R1gcqrOT|KiNW4w+Ygh` zKUmFqB&TkW1>{C*uih=iyuzCQc`u&TbWj1#PKkL9dlykR=c|MFWW?9inH^-Nhq z8pughn^ZM2`GY7UU`(6mh_2!__O!tNAoMp;n*m^bIclk4%Xa03`Imc8_gtHthDdr2;>Cg&_N@=D#TwUaLH`Ck9?^;8`Ojt8 z@V)Aj$y@d>D^xy!L6Ni1;gvPd?XJ3&$HES->3f*N)SI3>qOK(xAdLUS0uIY0uI6cj zb7v;Kz}@|90WQw0_}N&Qs476MzXw;Z3_>!SxMX=n!Pw}v+vVIc zkv~N167}(5@CyGDR(dTbb$fViZwX9jby&H!4!7^sXia5t!K=B*^h8?N;76V z4zrkxWFOs61Ot4KJ5L0vbW3zs1LEr%l;P4Hb?=sPK`36I?Zpl--1*gI;$2lo5ewv# zQE0Tr50N z;gY*v%wew4sNS0@;tqLY@py;uov`?ghJyYZmlha<+&`aa)Y`NV<&9kyzVBSSKhB%m z!EUoEt8#V$M^aIm7bLDUed`I{H~Rt67M*heaq-u7d0QA81KX!2&*sm1 zEfEY^jSm7VjK36K17cO#WA6|3R7ocFtg9?8aSqtnJXpi==yELq_yts6(M63B3={CR)XFW5VzYt__J4l#M#wJ;5;z1*cElkEZk6_ui@$G`i_Wkrk zsJzW+Ru*A~RNus)ffDZ{2m|YxT1TBa4QzZHaJHQP6a5-L$qsQMNa3js$MCn96_vlY zxbpdUZm-GQ)25y9XkL`LvwDgC{+s8d>@iTa+JE`o2tf}wi_a_*EI&+@H8Rf;_ zJCXEG$HyZS!o>p6LDA^88$nVCv!l9lTi#lZmXonz=jwffb}AkYQQ;w2t4KeusjGMb zmYXA#U_5hPmL39c zzvJF#Ju{TaE@N}N-LTEYkg+ge9t+1v8oQKbdAOP_w^B7qh`hDsV--3lZ{GO!v1`x% z?{~$4Ye%C@(tCKNqS*ClPsf8FtCA4(qT71+b+`FC!EMS2ZL}N{PR)YAh@Pci?n&M(%`B5juuJ{zQi3Ln1~>*^t#Jg4L&njCU* z*S|;oQF3)c7unm&KXyh^aBy+tw5v?Lm*M`^BS)OTl~P*gtWABmf}Sig7t~iNZoW(a2{pbDrXB4t(9H!p4UZ1^*^HTzgFLN3_5r- zU{wMC7GOY;6=;Y&iX^GGQAyovVC~#^;ro2VW|n>?UK}M*Ve2=falq3&r#u(0hV5ull(;J|)c=Hc-r_d9j@zrD(6L-P^RJ zp~920K>CiNH9tS;?lE59x8K(=RJ2B_eTgt!t6SswtT-LEG7+{_BLST&*blzYet4Qn z3-d%14y#Bi~$mJD9Rp|rL+T_y4HiH-Lm z;!jA<0nE++J5)13ba&srfKq{Z5ATJF_r}U}KjC!?)^gh+jV}Z>Fw>J3uEpt(Q*#;q zV;Rv>IZn94W()~ve{G3&a0Uy4xA82G8uh#Q$a#b`a&;x;>hJSF z@_BRtVo33IcE;vPzt~prTzmxeb<4^u5&YL(zg}*J`LTt3YFVM88V@TFof95aL)_{X zBl@(>q#|D&LDzW_pIGvCrf*BQjefxrxX-;+J-LCD}i9{I;Vz@7Mx zHbe~NUr$T@d*0DUi0)R*GwoBdtwI_?YPTp><>pbcitaI_-s3k4qf+;L`^T=z?Ts@= zSF1Hu`F&~C;%r}yk4Fa4fr>3 z^sNu$`N1SpKJTcqyutSAn(Z5^tV0l zGODN57v|BwOC_Fke_Ct7Ipby>d-B8)v-UXS4tjBZK z@B78tiPZVoYonn-#t8J+ZqltE0FQn?Tz9du)(Vxi7}xXnr%504nc630wwI@7TE4pT z`dk|$!*g|A`>XAV#=L<#29aU zKY`!rz8AX4J$U}thTG%a`Z?CG==#wqryY)toO{5SB2A6G88(Y0#$zO}Zk z?_k`dHm|ULPJZ>A=C}v1V?BdsZWa5-I~R(6dzgCU6tVqZfPJ*AbvRu$IU18BzF>&> z2L9L|mbgIbpEI!^I`GV6ZV>eEXCdI0;6 z$mg4rQp2zg@xIp-LfIdZ)W8_!{774~ac>(nIU z7+N*F&!mZGsg%0$CT3N0X4w}j0Vcf`I^5NH;&QTm&DE|K(Ox1k)x&MAa(lm=IFUkM zr{g%})Dq>iRaOp<#|dk$*85IP{u6tv(Jl^Hg ztj8ag{4h(e-E~;2^*@MuYw;{~4U(_iUn@9&cUW}XsolBH*=_4YXx#fO+IDd7Zon*@ zUkO+okr=SNeK0IfgD#!9P~vsS+akcv<58)_y#9K~Q_l?F*O#i_gguDJ(8vOqA`0VUL(c?~xmmVF~zR{+3 zE!*GJ?%#5a4ZQ&S^%=a^QoP@J(7T`hYi|6(arL1Ot;(GzgU?v&R;NHwhcIM0d5~E9qzX+SR`=(1=!#3 z85`I~b*$tdFW>8|D|Hhuw>}D= zJ*GBzYkOtv)bTv^NEn~M8d&EsK=4MXv6OC>T!yA%g=33!bNBE1BDC{TRmb+T6Oi<$%Jj{JnJ>Nf+_I zwfOwjN#gV6eq|AycHa zc^Bmb@^9K%Kd|^g+-DvtV=KWQ2DW1#-U&Lhba;IQYrm$hYvM5gk5@>o1-H&Zu%3t) z_U#aZN~bwyH2<34>j~zX7x{TJ+4`uT`gng4=^y)iyCeC<4?#?(U@fPB&p!#dykKeW zb$`^@!`Il~AR#^`PyJ3~K#yJm9gQuJJgS`iUoAdZv;R4-fOX*iADn}+R_cRs{P3sX zcdug~r*i2u>#&>JY|S5EFF0R487t3Q89$OIzBCvc%Duc^WutYh$6Vrn&Ujqo_w0C@!*Ej^B^D zKM|>Ycox>`8SvxQCdgH1$oMqI7V0}^=dV$~dmYglh<_a~?|Mw_6()W-Uwm{(Vi`<- z^@P-@{c}cagzJD0e|C7n9m)LpklC8`%W{u<0=43Mypz;Zb;eLYpR{$Z4}EF4jl$;h z*!-)JYUgq+UOHUf&+@U`AV+>ifPY8SW?{Y?6&v-5K+Pe>bq%#>F3Q&t)-&BfANg>;cJ%Ht8~mwkI=WPhoph3o_Ti@4yNsXe6i z`-1W0Bgw0l7juuS1FtG;6Z>aAJ$}&UFjP8m4_XT{Y;#!Meh{F6bqR@wOt;C%{PiaK z6X)R^YZJLneSg6k!OSV`&K;9OvQNsDhc;Y|wb_ULcvl`j3cm-sb~^U%qo5Bpw70XL zp^eYP`>h17UGg-h%9oB{3WSq+#F@Z;ltE$w2vW$t9jLCCdS z6MR1V2KlYo+G~C~=<@@w5BK3`@JzixvZnxFVU8TmAHe6I`xtwrmCxMTsh=dT-o5^~ z#vlAY$#=mzeIdzdGj?9=ssCLmzK>lYi8tjM76$5^Wg_B7THh==JJ->E-zVDk$iN{k=r_oq%Ob-r$)dce73MC&;4p8 zhj4bCA8Q`bp4_Kv?7KI8xDG|TZ9hI=1b$rx`d{{G$X%~t9f|~(t_+LKEyQ@xJbq02 zmG7W0eyr4UCEjdM8+fmiSL)(>EAH2bdkxVCKst>*-XD`ZUh=C<%&+IPQS*6&^=JCD zPSrNN=Vpx^3ad{hH3fVWaPbtW;hmGaQYO#(1fF>ryt=gZH9x0Z(WS9pUFCv{8PNIELdp3F>WE#XVqbqEDdX%?nOAGSF}W0& z@44*1J3A^hKhc@jCX(%p=2V z3tRu(m6+Ji7v|5+2nYG?D$z%GvL5Obsi8EAv?`-D@o1x>j(jTCvs`SP!T#?%@%hK>+ltL!)=&Gww#LZLhs(L`CEGvVlx_O^!x5+YYQtr)BbAv1axbk z*zPK|Cu(ha+Ro=-TotHYN}OQLueItMxn29q(68SB`Dr3^M=&Oq=8xn3v&QTma$*oD z|B{zl{|=z5PbB?jQRs-WSi^alYqWemCaq3D3Lc_1v7%H4&Lt z_Tyb#DtocR8EN;}6&Y?@CLMSH_t}HVu7TcAf%*LKB=V1yopNFj7#H&)Z~zMKpMU9j zXRgGv;I|H4;(61c>^9yBKL2fe=S|N$+o@kpI@s-rUQHQ_ygtJ^d4O997eXfiRB^mD zkb@HN@tWSiz`++n;Bt+v|JGU9kKnDZ zzcV}rnRv-q2Qn2WAoU=WP=_bDii-5{ZiQ);DOliZ)x5M=ZHRP6C18I z!6W+lNV%o-zjAL6;{WS#{w#S;rQ|9ORBFBRxWq%d@0m=Bos{usvoSU#r4HIA-NTH# zp-xmVDNv`gP;7$x;}YLfS0wh$I{F&4HglcEX+{HfI{TgAb-xK*=i<*Ety@DLX!?+x zg6BQx_Y7ps0M?B-gzrs^N-e(}x?d|faJ_RyhhtyTNf>K1Pshql1=onYW@PE8=4xsW z-CFie{*%^WXx91*+7ppH>iY8_OTC^ywwtkm%zs~r=Q#s%QE6K0GuNiY&vqWhW%#|@ zUmv+fqCIB*oVEWM{kmJu^U<@}?1#dd2p3_#Zxmk(eRGsqS-Wg4zI%IA>wE=d@@x%= zwD^&|W{K5UTP^3U)ta9YkQsM}q_*0L3elI2V*Czm?-la-QI!WyW{WbpZW!m$|8}wH zA15%TmSIgm%eu}9=pJ$3e{W+YjNe#s!sG#BeZ%FsII^x0L(p!{b6b-z7%xfLza=qzzf8gByENWrt@aT%I-yh7DRWxDW*rjx$AxB`MX%NY zxs4-x+F;H@V}Ot8;W|G3|4qMzWZ zX|5Sg%R15`Cs(UY?iAJ(VjeX=XTK1PQzLSGUnX~+vv~qIUk6?Ef1d95pGbMRwX;l* zjhf*$Z^{m=%geas3vl0O)OJli$+}qd#nLDH)N@)_`{F><43F zx8gZF)vocoO7UH}aQ#-D5q=gyBS|JxiM z)?#edJWbPwiJ#5P)i+EYZHxS--NV#-k52SIv-{qiA551we+}O20?%8bBmLP+ZWjMh zON-BwDesgV4A40|%Yjc}?I9B`gv_)BYq${iKC4w~hY=?jle4AXq37Bw@2*O*>kO%F zkMb$wyC13)zICVClw7$0kKp|(qcT)dazZ%Lrv4D?J>xl^#kddSPC(zv-1p^k^PQH1 z7F=-!c-2M1*C|_2zxq(?eA{~8#{)T+tXUbu@t~lD7ps&pnCs@oR~^?_Qj^~}A=ghv z8(2%9+ISiShBCwBJ7`lV<29wyABDXYSkvGG+;1@yfMesO52yRAk9m?C!I;43w9eCi zREiAt&mr-ZT}Iwp>*EsTgoBm2x~P#gM+p#@8?|Q1%s@VOJ!2UuKTi|87w3=i>@K|H zvs?@8@xDvN#$RB4Q2f3uFt+qmFIBGMP$i{#1%^zCga6WimUj!FFP z@A3cZF*k2woJ-mg$d{R;dRYp1|K4KICGgIpz}1VHA6g^zX^1O9UfW}3fVA`kr)`Tg z^>EU+0kOu)(XV>mKfDNeZ%crt%+{O$;9zE%;NAU@BfqG9iLYyv`sy>L$Oj0MPxWFi>kk&TH}k8YWr!%985Z0a>-`T&d=i*tGh9hJ6a!idwcGfy|zf^$M(;0 zN89%!pO4(FS3&uUx;|@EOiPGvPZ=sPS)R9Hve4j<(z)x(K4L!x-Td>#lDquJOFXX# zyy7s%-bRUUGULS~+k7Z9tZf#aV{|f4a{S5XpA5tU&&Rv2D-<91293vI9N<^L6Yn1* z`HW>)>+d-F7-g0J8YQtdhr=@3IFEcXyeqqqF4@>L8<*DpnC2f*kIRTJ@coR)u|0(! zFZ(b)@EF#=8nVxc6QZ+IM)>FdhJEpD!2eYtwee|3qt3{l7~K0;j1`|6>-XAP%Iw(mt~8dJZzC zj4^1MgFqWE?flq zgLt!=>jc`q8hiC$s-*5P<8)XLhVnoTJ;Lw(34DJp_R`-2R~vz|t?a?sCbmb89X9UO ziK9KCw(NH?7vriVkANf3d)p4a|aO`izx{<>1hl}Z+gJ&ARnH{*Pd z#!`@1ZB~8Fo!>OynY~HzQlH0qJgPlu&&R&*m?*riDj{(WIdQw%t7Ny1Jm1W{iaGAa z{(cF+wIB4jrF?iEnT_wT&qbRf>n{GS)IX1vkL;H|R3ZHk-%y({*OvdEF<$a7M~XjZ z{z@>W)asv&jPrO-;yi+WSNbaH?@#C$amJ>0@h|tS%H>P!n?YXIS1vliE`8?*D#aGC zi@92$h5MrUb$eImjHsMOUTpij*xoM3^TcVHIxllIk3((MVU7E(#dH5c&wDiFR=dYXD<~V zOgjGaO7We(JX!OL>jL;+DL$pkFt^X+-Y-{5KSbggeW)t|e^y;3r=EOVV(K5)*z}B! z#J_)uNWA}gYnyWLfH|svW=<+|R3R(wAWt6U=k?jx>b^)W{&h!uTWtRjz6brGzfZ=f z9oOUkKgTmbznOAl?)4{8o1q81bgIyp{eR8v<6`6;9cO^fto#~qNptp0-<7ENVa~)j!P@R!9T0n? zvP$Cj7{i>@k^a7iTE%~Qr`i@HkSij`1HP^jk(aoxyH#Ic%nkKUupjT)GO3l=IM(r} zXxv;v^;Pys*j6ciXDd5Ve!jFW5HFkOI@TJzb%g8k@w+o`l74+ACe5WqtX+=%cM9h4 z2zXfS!Q6Qo`V8>$u*4Ie4*lYTHmL_W^sn06nR$S?>E)N>eeu6*ul1k%KH%1xQmMzm z=U%LR94SXpo_Z9Ytqchi1bj1;kupQlr;jz5TXEdgBQg5SJ8SBaUaNn^7-Bu<<+=O9 z*s*aufM>gkxwzoX>hlIr2QST;j%pHL7O}c}E^W=?X*N1#QF21~^_Kn=kdsd2^(C>+?K%2m+f#;=c zMf(-|=+Pg@Ra+Plj)N!QjzLq^cv@hJR8CR|L?JBI*!o>n{r?1zGMZSJW zo$&YIL6@KFdH?wZKZiNnNBPwJy)Uf|`flLp_gY1^d*OWWj41*p!G?fV)emg$hw^NqGx);0-Y4L+J6`B;n(W&ME@*oUcv#zv_x&en9z zv8AWAZd6j>W<1ZGw4*fp^v}}usKx@tw9om3dZB0R56kn{($b@tHm=86w{W(^3t2n} z%6jxQ(|&!l)CcwyC;y_H=<4V0+*^Me^^--s5BsOFZ+X4+>2~QSV|or_U0*8^S&8)f%kK;bKphCX912 zHrg7dn)@)vvA^0rV%GLbzi3mFjFhWv47HoTo!uJ|-5bqPQ;MHw_e68<-r)VZwNLiX zmiWMUx{S&q!5((O`!VnQCGyKf5;Ms7fjaD|moCG-W`HJPT(A=R=;8nm#I=z~rS$iA6ISB;3xf%UrP&6Peev_067 zwR%73lDMs&fITW`i{kG#b!fjqjDuaizGM6M<#Pppg zGk+JKzooGp_v_xdQ~M6Mwgg)RR+K+vmKhOl*RW6}T;)|2oLoCipZyd|S(mC#Y!yKpdG9prG40hD)*ej9G)HZ% z0^>7hMuy*aJ7`#!?boHTq)eGRsyWQ>REnMXlib(zIV+G_B8!%Rjm*jG2L(RxBUCTa7yP2+;G<_(-H(BOu5bj~1O z90r`X1Mj`v^9r9D{?2z)t-E=I7c^?h`;qJz_#(=EBI`* z?emhB(Zo>UJ$vz<$5LXeGV|0dxX0cXHaD?Q?Yf`ndgvvG3q;;zeX)eb036SJvg;3P zuRD&XYaMR(y*ugko~(OV`{nh5K5d7t@Y8*um*2;}JzM(Wjx^u20dS7zX?!X36WFu) zBRgkF=bkCC?=X+8SD%@*)`I0NAE?dI*4O6!ZYtCIB#te_jvuHE@#=`=LedA#x)%}Z z`rzwp0kI!>-s&HMzyAy5hDR|s_u?ME6MSyRjoQI~p6!wPS?+yZyn30q5ti{-p{y@; zy|dT@p+?@bPHWpU_K0!!sS@c8-ikTAsz~OCwMr;Y?*zhKuJT)CjnX;Y3)kY>r=7h} zqw$Kv66dKF4{%9z&?`n zy|D&Eoyc4Cfo=pWfLw9TLb0pUcl+=fiSMY#movACAGZffoaaL?xefmx3p(Ec-qwNt-}rU0ORUk1Lk4j{C7D2DeiqY=6Peeyk7_2^Hq%ZP`(3U8UkLg zy%{6+{#wWjLr2BGZfm8!3f#R1cw767)N+2HOLB43_|3)Ox0ixHUkKgsvtI*0!0{!x zcRR**{QpY!F6+qc6@S953FPE9P^L*~ZL?%lbLT@oYz#^LqW(}WaPDII|07t3yI6C# zOKX;?E;iQzd(M7=T(`zK@>xo2Vn$R?pdGtWSP{)VmnYQffowS9-%^s`i%+J_6J5AITp zzm10c{3bh3tdYKvITho@9%u69Y@Jig#aztATrASu7M-Uy@inoQY0ey_G)F*vC37vL z<=ocOYt;E>ZAuC)5$&00;vFFi&iy>#vjE6i&)OW(xssd8xou=V0rukjr!hC({+dRd z`5-XY#jTS|XjEW6!hAqs#mLv&-#F>@5xrjP8__P<6aap9YDi)vNdKSL9CuH38~QG3 zCt^;NsjJf9)K}5}HGtl2zeeg$u+|+(Yj&OV9<-}tTN+?o3;l%bA->a-K6k(1J=G6n zd)@C$O56+WrKGJ*QK2d9uT5Jx=lU_+^9O)XTAta|0}Bh-xVlutukY0o@$;5a8snXg z`Z#RrVrX4O)8oBdYPzu3dvk;MTKWGqfJ?)YXXR;(lCceGJqv43UJqQqUHcMIK6L9P z*nDbUWS^O}|DVvg?$_SP-)xW?HYPW)L3`OTe}Q#GFOc6d&(C?&9)I2S5*KP9qBNjL z)}xWJQ8@n}QNPB0L~G$kwC~)mAh2I=z3A3&K;E5+SC{)Myvmm&w}4J;O8Bq^ z3)mYI|1#r(I+>%~BEd~r{MNl>^E}PIEb#H6jWiFCnj_bRo%(@{``V=T(@ng;C->^r zIuIRrz9e(*QmP-nC;12Lmodr0WY7D<`|?>>p;}=O@Sx`1xp+;Sa_5Ni%O34Dc0UzK z9Z}X@i4^+RxphehgQGEymK?{OTEC9h^^_04pWV0g``G>b+ql1fOSBJiM0-XNm@7x$ z+pfO{l#4!37*rjD|9|Wv?4t{TZ)+SrG)L*H1?My75oFgSEkzk^Ph-kYTQJv)0b`*% zkHr}0+;>XMO0}NTU&G+QEbgn0Jt-`(BPnZ>gf1Tbl*syw<*3HkjPnQa`JRKK4^if% zO)3s}Wt7CD5f1PepOu$M|Hs*YiL5_dD$lZ4_a$QrH$^1}Ws{!U{W<`7U<+iojaTEk zlpo7tdQW)6>%O?L?v#m}ZO?3#-?`-{DeU0;Vs9j4(l3O-TFlkZiJI@mJKnAD=*$sw zhQ~Jea3JmfkM9_-lG@g%cY+PZMr+0`6VPPG{0BpryBFsOk3WwxbG_cUG2}y zeYTkE=?NUrIvvcNX8pss)+QkX2rrfXU}4HeIG;qw`1>um&zSGY+|~!{g&vyT2K47g zCC{>{%BN><(r(D!&VWYD)l9&&D$(y#)j|wSeE&?T>B7CidZ@JPzFDYyNbMKT70Ulv z8)LHeKFIR@h}3i#Cf6{Qu}NrFqm^lt(T1IMOr9<8x&wIghdq+}lWfp6IbCXw6Poe8 z2l4!SYK51WesP-jo34|X@40HXj41HE)4<6T6FhIgXWAQ{v96>;mL{!?`E-JM9%Ym@ zpf$f3BXrx^F`47A&l5jkK3sO?T+X|Z7w3oyHB462zT1t}a!#7vqqH}i%%#15aBzaa z{qNFV_J*H0feMK)qp|J-k*7hx9emY<#V6w%FsB?W-o{ce7O_t9$ zC|-r71_ggVdp&S@X}#=uR|lx~a%n+OKgiCPl_Bw)&1F76Har>huc<KL1_3&-~riwyM`?sG>}YJ=ImLmMOY3o(H~z`C(23jlu5Dm99y zuW@Jb^pe^>(TJW_b?B`z+rH zOHCS=&kf^`dVU}Kqq4?7;0}#fGV@a?^}-s{nyU~Jyyt$mGA{f3G7 zF0|XxPcq3uMn--XR;d1ap;OHu`Vam^ltWiPVC{hJTg4B&3-sa5GbF#g8L+NN?Ejr#S0HJY^rTQ)De?;{THYA*FMD4g}>9i!(WLg`GD~>Q8h2 zC}+(r5dLm?J^8xLscuwQ!+6k)=m#UxcRPQ;jU?z&_}7vTJiyuoc|mZXd&SKd6_S2s7^m zzI@4?uP>`iL%q`GC}m~!dPhzlNyeEg5C?>D9-iySIn&iQqp`u{lcqLok<<`f42Wyb zFT=yb+7sRLYsk~~w*|WGCOrQpoNrPYdrLxkGxur@uTI8R&2jh_`IG9JbIVod1@B3N z=S0RyUm&A5&cpgb2AqEs`pOpFi_ZLJ^`WrnLq;Fa^N8w19~66yBmtA4qf7!1 z+(BMAQ{`bc6)BZZHRry0po^4~qkannW*r92aRl9bvqAP3>-lkS(HB3tLF_A(BP=vF zX-q{^E>N~1&)Erh4Df>{i3cYw%hJw}+$8%}t-j1z#$z0VEjp& zoNwt?K1V2*-pBV8iw)V**NCoXj?JP#Z5B|tBjd%7l%6Phi7Tr%JM&}Z#vtv@(tMp) zV^=K_x=UGYlY_a!*guH8oyE_I`t;41JT=$cU0Jazvo@{9IpSW zFN=~s8#_Ri55^AQ%BxjE15?pl9+k=D@+UJ#o^SWb%cJtpe=|=~qG9BDA|6tohHR0( z#`B&%S9*~dS%f{_!7C%{0ngytf53eqSFVA)G#_%w?Ipfl!^XZ_+s7+O;a%pPTLr3{ z#P;#xQePHm1wJ3xjqh#;>`?d@>`}~X>%D*MC)OO{m9n{K(*6s?L)X^e!J8bQYV7~ds*|4l1fiiOr4#fPuVsYNm6YE1WwH}Hj zUV(8O&sLqBk6U~rZ*7hVUo`h3&7%zm`}jV_@)d}lUZV0%RQqRTk}|FWy{=U$0LQ+4J0EN`q<|3g@Gi6-D}(`d01kl$u)1f{->z}Sba&OQs*mndInowG~u{Hs)6 zO8UOInV@x(=SmKIO5;YT6SYE*?5L9bl*Kq+yx50Mz=g~u1=M~GG%zZ%R4STBZm&|A zf_wvO`{vS<+emB-nW4iC5;wQ0L3JC?--lLDiE9sQD|fZF$aQ0Z_hX|XQU>pQI2b#|*Q3q!f>^AN#EBkx-%jT-`S{Wje=>yc5y*k9|dY9iC@p zRM$rRxWoKcg;H0HvR)SN0Pl{H@c`iGIDQB)P$u;pZrA;7_e-zVZP-ySexx0Gyc>(w zyAQAe*Vahy>_NyI4}J-2yhq~}6%O3u`;ityu3wD3eqfFN`!4+(Q9g2P3C31y<=&XQ z=dk^mmfqy~WDT=F(~ew5yZ=)0bC_OtHm(3nX6~19{H(}z)HBHs8V>^?udji;KL2*9 zo6_s}xiZvkP5?Ig@GfNiEf{<611_%vt^k(&((``vS*-7J@!uWL+BQq-BzK2AoBgPs zj*l$!kPjRtJuUI=5Q|U4{V;c106SP~3DAMx{5?y{7D_)HL)Nffhbu%6*v++R1mH#A zjfifx1+W9~a(TP zJFHW^DJ=Q)M}edByj=R6a^=P<0TajJ&ae81cx>e#+J%{}m6hL80X|PV0qvLX15fS{ ze{Is*3e-+OdqLJ#aJA;_;&(d1z!tX(PzLH`j@oaW5b&w zJ}Jh%P~WHhd>wr{aq;&se#6$3we}?9S0mQ2Tk*-reMRE$r2Qah6QVuI*cqyv*q3VG zzL52cl{qr6BeO2Gv0then7aM=tuI%}KIw~&Y)dzECnEAirch*xSL(!nPuym%>O*DH z^ZEh6JrU6{cPWZJVTk&}(_gbaYndNBCnG1~jy^QgR zGKpV~maE+$=zUUA6 zaL~wJ+S@RW>&Hga*H1si8u=b^d+#k$t08+`Sma*HHisQK{uOMP#R{GHp`VYHIDrSi zJ8lF&tzVcM`^5QA+PIH0^$lYUcC+`=UZ3Z_oX(YTP0v%{V>h5BE%lRHFjrTnPwvYx z^0@Z>-l_TN)_1fkp+1f>sb^tm1)hC!MCvUXU;lKC_qTB?c)v-|6L)+O&%RgQ#o8T> zum3Eul~06j&~uGEyVbY0B>fmBGv{&9>FvCj_zK>)I3NQ$@?VqYYqsMDW@@Z7WeuYn zvj%y)56lmGb3S*9_;HOtcbxBsPHL|M z`uZm@9sXt^XU_a^c!b?dX{-Cmm(bXb;KWQV|s|^1jug_>c zg8HxG>W|6tkT1x-ZB=;rE3$XlQ}{B*t1cHhOk8GdVmHT7DMn{JQdIXclg|a4yQ@8}UEC*okNbi&mU77euBirWW*sviK>c3vr`jGg%%f&3NvrD1u021WP2bGb zSb+myQ#(mm_I*5H>$LhsH0;ZbIWkSX@OZn%v@6-Qe~fjd!jk)LVlpgl)JrYtAa0oJ zF>mY65xZAb?zBFmDz&$iX$*(8n`k|>k#y`{t*y>AqMpFsTZC6iWX&!FJa6-dux}=g zm%b84|6{ER?5i#1A}bpG561@pKgahT0uDdw>VFYGzO!`zzYll?`pe=09}eKW75Ypo zbo36wzj@w%-21YqA4`8S+WH**d7yDS$BR$X(7JMG-SW`#11b}CbV^Ow5*ssI?8}RL zl?HRqXJwgs--q@9#yix1#`V~%cJD2~_f4GBZn@6(6B%|L>cgv){#UIK*l$}kTCwwC$2H1}Jl>d~)! zLwQ_*Jn!B-&r8}%d}>e|-JNQ8*rs+mjFo!d6d?tJ0R{87Ds`80l19v{{{8S5@ z^7Z!ut?w7GtI)r}KB#=2ot2KS%=#GEYk_k)NA%F_NdH7eXhR2hWCzx2$(Mj@p42fh z^j?4GfYwknvZ0<|2z;M6N^%jqMoG;W`i{d^zAKY89E&*}J4NYY(vAMpSD1@YwJb9JijUdl7VTGH7&9nR$#zH4>|6Q!n;<&~L;N{On*JyFYU_e^DhmqNO8o=ROAC8+<*4w5mk&|3>5+YQtc@i?MT#Rr@~e zf1`C@sy&f5?y=R%16Tuv^GIKi_DWzpY<`GOlcxAI;16nJu`$5|XJg&RN#4HEkzUV@^ULBZ<9_j5E7c!3s5KDTlgf>g z>GAyf0G8#3wFkCmYinqIPg~=&5wcNN7vB39eoROh`o)3IVV*F)^0{0;9O)+iKX3s6 zG;ImsvI`|{#B*dhi%Z5IX8p5@x4qhXXiHjboYua_oaj!qdoQk#JO~TT;DRfU766oVYdCaW248KK8F8&N&8%xyolyN;aj^~XssRw+qzMthMoHw%{nr^83S;I*JFy}$?KctNJ1RDMp?(t}a)a<)PV{EL?JNuqx`kpO9AKuhDb7gVg=gl}g)|O|k9_?(c zCoqTjyp#U+j{uu6znes7pdPUo$E|=4g(a_e-fyZ@X9&rCX@A`r)i`YR1z5iT_tCnT z#%bZ*zl8nL0=iLOmm3RBd6D|4(MdHYi83?ukFvQki=>v%Z$892uk&eaFKAHbwRr9Z zv89fsKc`gYKhD^xr+puB9p-2Z=dSq54f#s?DamItc`vk+lFr~c!)q~zKgRv>3)0*M9d5TUG`>ph z&!q7fL!hyH>czidd*gH*!u<-QE-d3+I`A78fe&5t$2_riTBC)uEUo&g)h$Q|d&;EF z;wu<$1RmbX-r>N#XECqWMg6#J#@B2KiC^O<5%HyvmhX*7O)ndpeHEUsWR5TI<@hMA zpVAXKvRCEGYCQA+2=O4`!9C)G@>Cw*Tc2NMwDA;fKA4S(3TwQyv7NK_R;yfdcY`n6 z7&*ZHMk<#MRcno7$|s~l#x_iu6Z*}hWzy%k7XQ14a+~sr!&=X#Q)z(Fjet9glOhAQ zo-g$}5IC`TqPieK|0q1wj(=ny}4LzOTUjo*sJ?-1TizBKhRY{&oe5~@O zl-gFSod3r~wl;ZlHHwdoY8Q@39UPO>k=C(U?ql`?*7PyJmjErzQVY)DMV|oIGMne; ziSHme$MGR0G*$%o@nFW6S%$Rd+9SZb`)Z|z5I^tx7@4I-``4rSY>#+q;MEOqq5fShjS*sQGM<;HCqnfWZi7e2qu zbJ>BxiN=P|r2MN%d6@QRHL_xpqgSh6 z-^#7DCsA&tY`gev)y?qPVlafxUd1o#pNFhA#>ROS$Uf)Z@6*0jv{NzW@~<@~d2hS# z%X003*4{#S$k>L?mUzS@j-y`(-quTx>!Bf_DC@VdcLCn*M}QyV{G6F5k8QWQk?}<> z6y9a+bVm2B^7ZTibG)}f@+;Vbk1~6fPIYSE zU9AUU;_sVe{jxb0NsWDuOT8}RAGGpwtJtqj#QlESuX(Z52W>O)aITNo#%9qieh|9C>;hA!+*^g?yK1EmMWoPw_Mjce z^=qXWBeXk@A5!D>1~gue`N|JoEwNrl|g*MRSxJ`pnTjFI<9 zPL6@{59Svb{cE)3U*(N!bn{KLz7^^Dv3XKA_haoIA+4WRrLsVk$^vQ8KjWI)$C!g^ z;LR5N#)28XJY}wl`*tNmv(rxgcU1hYv{i4s(WhPevNOLg&BX|64(0|3AQQ!Si2`TmQ*3khLaVBQo$Ly!a&W z;@zLd|FuTM0CbaTtn(mo3v<^~BDy(q)|e+_YL#N|PM;us2res<`bu3%vHN%7JvOTE z*!cahM*Bv|US2!J@veR1Gw9jl^9HVMchHX$ z5s*&QamZ<(w%Hhq6lh2QWk8z0EA;$U$epdTL`SA=@|6!A z`QZ|YA0dA~cB%LimjG@AAF6Nld6CV<;AngFu|BEoFSk~CR90^&6FIH-R`DUk7pko! zk59_#DGO{&33(XyS$w19Tr(f^-HhfbfVZVPL{?_+2HFjlZ1=q1yvJrmcxKvl#$#mv zL)y_vm*xZCAalL}{k6H`}e-vXoBn+ z6U*i0?uQ=TE3J5k36n{sL)!XIOe3z1%3W^pYQ9KO6>5U7$2x?PLc& zRG-*7tj}MCkH%vfL!&WECeH)oL~Fwv!PaYYMQwbDwN(#`dky=3W8j?6q<3jc z1Rwr+q4a-XuL0USUytXJJ)AfK6GKudeKpzd%8eo5dQmT7|HKzoLpH1 zaqaIbCFfu_=;oU`pDT5ZmxXfeOO#8yBM!~;bT5$BEm8aG5`Qlkzk~XpX;Wl9Cd#Gc zCnkQSKzNt&O~o}Afi|PKHJvvxFnU{~RLk0czq zU|O!8%6ySlwLx<|UV$FBxKey$7vg{O0FSa4I_t$MPl(ReS_7cTLw}UMCA3@gvxfqB zcmMS`e`aL=0Oze2a~)nJHEBrW^2KNjC~YL|+_O~t>bk(WrgEwT_9=ooNFG{od9%@?JGGyIpF$SbF{kwYl$ha!^>Wp!&182ju0~ z_xkY{MvttLxPSg87r2}4d? z2Kx=Iq3#Vx)#R=(dHS0n$G*mVSnY|k(}~p~kEe~H7c{Q*%i?by+oJImsvj&5OKg;> z=bjXKmNr@HRjl*1_q&3x)TuV9e#JHV+6<{nwHNc&f$?RGOSXC5WruM6rT#pzRs(4o z{nf8vy~dV{PxY0Qd~Rhj;>c!;T|%FdLja_qd- zYP%0>Y&GQ9AK-UdfIIceME0QXdCU7UvM2K8p!MJUo}5?L`#n?mOy7M&dWRUk*6HZ* z4T>iXxpEF;)b|2j#_`Kn%K4sK#7@_p5noW+_VsG<#{^`FC8W)Sa0 zJ@&yM@Nh*y9%K)2%7Q74#iVV`_Oz=7?*3K#N=HVxF6;BtK68vSGIfJ0wQi8wn^%kz ze)T0h-~y+Qx6MU}VV){x$~&Iy{pMb{@#wOD0#{?Q( zxmEbjlKIeC7mE$Y#(0{XuLb!2*Mdx~ftI%V;6y~vdG zqp&aQFdwxuKlNHqkG{(!;HFmT`%ZemzO5@pSPzp&ev8Fj+qR)@}%HXHovw+YdD1b{%;n4+&*kHf^SQUojube zK49t#?D5q@dN57;e0`rZ6~{9$CeFlnr$`Ld;m>H#8XYqj&&Bwzj+@$bj}%D^O1wz= zQPP*)s+%6FK3iqyYx?fd!mjm?we zX!05~myUKO!>=^{$L4wQxi+SA<$3qIP5RuMM!3%1-@!e8CjAs6JST1XQSBvXbCgUh zY<;eeXe9h)@AhM$H~+<0({l0ayp7-fDL(r{^~m}>*KqmY0XNQ-W5z~NcllaK;%5jRls;5=I@Lt5nXNRD(U&~KO3ah!3q5C={Wv~_XB=6fH$33mVck`)!bE%d&`AZ z^1iP$>4@(f06p1@{r9Nm(Q-?eW2Wh`-a3y%(>9{COpK;Ro#F4Y+`Ed$I7_`!eFs9-0n3snI&{ ztdVjZfO2r3+JZ`D4GV4Kh=}j!b?BVs;B+UoR?2IXN?8wYdt71)*jxNU&5LhPFm?DfpX9Cg@Exo}VS%gVfU=Us&Hf{^GD+0U?e7i-=seQu21(|=&Uo>l50H~_iUJ>faAk+#McsD>c_#Db<(~s z+wmMHiUhyj4f}PSj_JsCGVA*n+*56~AC_u=FZ{^qc!AZ*%NNbf1%AF(-}e~sW1Hd! zWl#J2e^b0ZrhYCyi>d!mEI!`r|0cG^zg3D3)uy=4xjY^4r;Fv7aM(Qt&FICwZmN_0 z#QRdOATBXyNOTOUoI8Aq;50sUCb$a ze-k%~YEGz02{vf4f-qfQzNJ z^|4ODuZHVooetNDZFR2azwh5lWiK7m_oW?bujT|-Yfi@#S~K^57fM|JL-?J?*L?($w+gMVp6bZqYZF@;*^5Wo8(&Zpz^im2SrvKdc%aYXfeDgZ3e zo8o+D7&!gCQW`f-{V|G& zM6_p5wjNHU?@O`ozBDX79B7Ljqwl;5=M^>jz8c3yhPs>e!66q#08>GmPQ^1%Df9a( zu>K6`75&=m^HmU*p0(sZTQtXlH27Y?cd+Q|buSruobv6gZjIq2YY>&nImOX(E7+4aB>23lSk^UL?+3q`#Bhkj3dT69GA*~TX zJYb&Tf)<&3<{7fi&)|NZ>vfs7q>8TB} zP4zv}qkl~cJ#u^FSP0UFpsqq%!Fp`pEeOo3)>EUr%UE*uXM9BKzEh@qh_W@l_am)s z)CYOGZ!6$Wkh5%^yrk4^Wz0Z5;1OI`GeJI^3fPSEGxR(M&X@fba`FWuYDc;kI5WCR z@;UP1uc<#&EHX)4-gMv3R#PQ)2rpAUQ@cv(SS|KRq2#zm?R#UtzLl1qdsCd6fdu+H+g1tPWuIx| zvr~RRUe0S7cg8xi>@%8~hW7=1oIY08`unpbPO)Bf%3j6c?F!p){_l}oz7bqkv%l4@ zPda95|LeSso1i#Y>CC6*v1|Aid=JwQ1h{IN+spK^_By9F-fhCWsGDcwQJnQ(p*&=N<;eWR^v{|hdug}!ub<9Z zBkWr>8TUOG_r-qt(PGwu?gk$ zzU0i|LFPR<^R!lJN{{yU;r{7^e%T8-=3c;e*b`dMO>QJ}rD}3zQG-_)rW$^}0U%>>=jt;#toKOOH>pHjwusm&*FM?@qr_ z8~b1si+r^|A~lzmtK7y+W0_r#>`6F+B+B4glbZ{qv8GFDvqI`2mvIV)>a3ZJvJB~8sbPvVLh<79co3bkMH zy2W~&?L{5eTzk#UWUf|J^&rZJuihX!&&z5*H1S$a{q`&k)%@kQpbS@%dq2y^Tpb{; zb(0t$^(q$NJK%)_-MM_pfa;?Av`=qRl=~w!i|_cc}ya4*2}TxL>a{3;J1>$APxR@5Y*c7xaDrx-Xy?@G9W5 z_ewpn!}mz-;9kJqBg*R{e!m{Gw@G_T9opN3=Lej@+8tk3-RW8Xo$dX}!{W*_4L)J4 zD^OY6;or8Vl+h7MuX`kKVk_X0K|DLgKEOi{V6WlXe+1~;Cf_rVary}tiOrvUBcnB5 z(|SG+|2wZ(V$qp9@;uhKP>m@=`W?nO&I8OSmDtCN%5!DU@8;7fg74|>n-Y!7Dae%p zdMjivB%L}nwCT+Ud`<0pZVz|b_=tb80+G3*+6V48xc35wKN!1;+LQR49sGCX!5kp#pgljDrE=$Ec&>-={XgRP0)IXz>oSMQ zofFPiKkijlDR$bJ+G<1Pxw<-?S3&oNj zIuFl(P4witvbAZE95^-gD#F0JMl4fw;G%b58tOYez`&G4!H067LLa;PTjF#WOZ)! zZPGTIN~&yACVFoN&gW~d0bA3GuziKZ#v7H}vFG$?eToI_BlJ~~QLc=(qb}cftIRiTM2xLkFb&_E;(6BtuEgAK~`d$q24 zo6bGwkNFAX*w?}43^=yhmXyTPv}yb_b9DFJB6iJZ@Sb1L+SFG$^{X4&b9Kr}>zly) zT#onuyQ?Keu2t(~ntOc;_g<>>1>f6)@zQ#qM!b#d&rOLvR>4$d0gVeD0GRqy|PMq;KKaK61-@ryMh zZvGp)7{V5{^A zq;GC3=5)Hob5Qm%wtKwrKkOD8t+DeL_IVIQ)#aaz zzh>_j5*q>O$5kPDwm($*_U!@XuP#sQb^2_QcN#p!Z{LCam^ush`jqq;vph1ZCu?6C z>(}5rtq1(AMB)m~_evy2&g#-`E>uM20pi;8mgmGZ7Lm1-OGGxXz8+8OPwmtCJQrz> z(fS6-jqN=rmu9+sgN#neoPI!!@)Bb&qCJm$LH9r(_Vzx!>x$!k9~nL~>vFqx>EC07 zI_v$Mxl~#!dN0=G9JP-zhPDSvQsy%JCdR`U?`@QFrqv<8ULoZTuE+A}f(M5+&dAUn z#hr6J;mJSMJ~rGd52@{kw5LVw%?GtsSX-q$_p3M`9TIxlYwbh{#}20N*5K%^ykCc| z$K`6%cGu0=2_nAEVQ75DwA7IJIr^Z(;=lV5bp5^{yp$`W(H2x!DKv8spM@Y}hoIjN zJ}Wx%o;>)My*@1aZnNf1F&2NVJxNK)!6Z^w8Z_Wl2*yn(TyOk~jQpBA~p>aV;v`w1S@+?I`c{R5i+OS)lb zRmRbI!^#UG@9i5e{4j}UdhrI)9jGhcA9ZYBt_`eO><(e;r>T;^{=o68nn97W*-aQnjdMw>JU#RB_@#aS*IggK68uYQ_X9a+6>`qB&UZwnRVqNssruQdI?tc_^qxd zb*0U~#UG^wC;7cBe%>VS+1Dt#1a%K%Usc;P>%#7W4l>^6!9;zq=a%o&jzAss1E(&> zRy@bXPSM%ErTQvkKUdEd`QsSsTqZ zN%rEnbsgY2z>U%)F998<88mp?7o@gIg7p`%9uuEDIWCzPjhNVcC?8S|HFlh^zedJK zqy4D+N^@;xtd-b}wQmRRE^3zA>Fp7Tcfb0Y+;{@UdBpJEH_Y^7b6eHU(5Ue`9hjdA zeD`akg|D@qA~kHc7f3#0mgiOoK5&2TWZo|H?1w<3ep(`Z_UQYdJ>?i##_C%c^NHEch-aUUb*()w*B6?l=^5!E zYJA8UjWL3J{t#%yW{f{-mvhFuw`Ih?%{fYtcQ?yEuf+I<)()JH<4G9j@w{30O0&jW zY7Q&$hWdZ%R;jhM0Q;k@N_<tWzWQton8t+kVLxB0z2j+TWxVo#i%3rP zyqjgDOw$US-Mhy3nY5}5$ag3GC+(lF^53yMGI=(hVvNRKK=(Wj8F$`7$>ll^a>946 zz%#58*|+x!@dqEi1i$gTu*;`M;+%Pbn8tzhl3uRjYh^2x+2;;eZVMNWaR;p5lWi_+W4cztwjg)?lB? zVwNsCK5r8%r@9SeYw9qb;r3fkYtObPh4-v379HVNn6H~+q66L!9QYgHKXCjU#uk1D z<5QrIGorfxVnUB;kKYPBedIm$Ct_}=;`cW{tG;&HB(GOLNUhYZ&-#Wch0l>*(mxf# z|Mo)$YzgJpXYF-QXif`9+lT!`iC-D{iVE&gaw?Ov|!Ymf96 z=YAp`*`nk2%RTS=fS+A1|NA}p7WVf*hrj;}y{Pc(Q1CgZ%XDbZsLQpFR5&2N8Qom{ z?`f6!-f(maEARCd`g)4F4tpZZTJNB{amZvx_6ROMf4Uo)3 zWX$J#TVqF(A_Li2Rq7thjrs4G>sIXZ*|=BlRIyj^<~lK`7O|u z|GY(fe7{fo^{p6lLOUY)>GJ;zdioRK&)uL?{{!oZ=WGC+_h--h7to}eK8thUM#FXT zxq%0SfA*@6?11LJ^Pa_3dQVU8nYEL(2~V_kUfR0SptUQNS_n^0hFH}NsIhs?Q8T0{77ZqzI3iGQ-HNz%lJj?<7xHc=hzO~dirG1Q(1G! z%9>Wr^Y?4;;^mMf!_ST5byL?FZQCjz1TKQ#KaLU9Id&=kS{wBYNPSD1^_qxz0(+@Ty zJutW8vqvCT+~;0DTd$w3esBC-eP(YcKg6d}>#nDJ1!SecuE=Z2>-Q0$l^N;W$DXxF7$!Oyl?> zzE3%8L;HfrGi_gR_z!TRtyz88&3?~N>(jOVVArq9|3B0!_M0EI>i1Q@i)c=mt>0pD z8&8v-?QaxFe~Y&Zr2fOP%HcYuwKIp6U(m+9g0}n7VoSR>kAAwnB6q*D&cr^gJ3}AK ze^*;6?Fnv=Ao^gqhYh_9iS3T^7xz1L6xLliuT1*DncP4u@&IUDc{EV>g}H8D1MUKk zpZ}WF6nGWmXSELBUR&GoQ=$(aKBztM+9m&kx+wGWUj>aB-6pj#h=)eMyIDv2g>F&X zW?XDw>?_<>A@Oj=4o}%YYZ-A)*k5qF+N$kZX8rU@(ZTQ2wKIH{{z}?EUJ)6l?_3-& z7aNb|S7GhNOb+=gHJc zk4r2XYoW2P_v{jZhEpVeE$=>$X`L9%LFXok=cAosJ?S6#`MvnxzhWF%jq}s-UC_wh z{}1CN4Bg-G44-8^dG?dQxK~H!pqsp#Mv>8b)yK|waqf*jV*FW|%+poilZVd`IsfpN zF%K8{KF#g;e;RB0MuqGF?umJrlb@DK&1_>!)_uu1XWIOD?-hRs`gE?u`5GM+-~S`V zznd#IKI6Z@x(v+IdTVZ74o~ciGcnH(fqoqZUpWu+{x2^}?S=+?z8!PB{6BFFn%4mN zq-CtoSL*C39RFpO>@m{#x3%98`6PKA`9avV*%xYzKt@K&YcFCA?gQU{3wlp0_|s4S z5$lWjS-${t{Y$@ZEop}7ORaS>IUe{cbWG?3zr{EY<6exHV?zIx^%!>G_gG)ejvEB0 zGU_9=vT>}`hod@%BDrAXanA=6ml6?JS1wSjw)mk+|C+6V9CIGqdd|H68pbFVNbGQ3 zB)1-nt#d=;1an($T$W)dB~o7;DuclT`+N3%_#STFO2qN^*%)uiuJor=gO{f-*P2-! zQl~cIjMa-o4`7b)H8bTm>^qr!C+%PP=Mv$m&j7wjT{k2$@J+SDuc=l)%>z!Kj6tOn zw9_`0=f2a?QooM(wz$-|8DbrrLXjB~;B)_8qdITMx4&>CFV6t48^9Z8KPA)0x<>7o zgzot`XYG&q!n1?-9EeLT!3VT93G+x<^C|ReC~D zXBui0f6rRZm#4?<-K#bIO};Udj%)F-PtzU+x-?WIHj@^7=lwAwzcXXSXsa)Y`+m_! z%Ki8K@W3a3SITHL^eb!bIeRZHZ;?I(=i+!V#{UF-r(62O7XvN?ExR6q%FNgE`<3_U zIcfW=Wm1E%HRQ{U)tIZ@m0~+Hc^Ei;I8g8V%p$34S3g$bEv~4^^^bLhbA4qCG5#9k z-5L+QFeZ7GHMJt!j1&WLvbi<=2Jqf>c>fUK5RPYIECZ~=@$WER37FL_b;iETetnpm zXYUmqfb|R-y8w{Oe*}1#$E^xDegosf`2376soOHOQS`g-{|j*98L6#gWt#K^U&f&U zZ*H~RlX?niNCGtd$yHKIWzHM{dmQ}C_A(_b!nHTtAU4`)m*hreF7%HHLtWx<=JBIA z-T}T`#QrZk!Ly;rta(Q2Sx|Q&kj~m;er|Fl04H$#E!^{))v9x0o=&_jx*cg#UjPSo z>Hhly@SwCvdv7wXsYYb^xuD@qD%Uedmo$A&v-qkg=g)1HIjUA#JLg8wW_*^^|EFSzPtAi93nY#ABT&DybU7qxo$O%>u`MZR_XEn0bm`z^8t|M+kp46ukOUY zI`Q+|`#uo3-=Lm1YYr;y%lC1Q)c851{LY;b|2K#~-?sgBisagLxTc%)p?1z`z{T+w z2wsvOJdUvd=Uv^(BU%Kmj}L%x z#xPm$q(x@EUgfWcibb#Bv8nYnN^17l{dOFDeL8TmlKR=L67yhc8RNJL&-Z@-i*J?D zoZl)vto{$63h!Elcm4G*M8;w60qb?_)*8xl$BK*<+~d3__jhGn=8^P$4xqV9?mx42 z__OpkiVV}g0;9%Iq${PaFLOw~Rw*N60~0zng%Oa@0la> zkeQn@hGVfnjP=iPK}(Iu;m0*zzHbDetUt zjpL>6x_z9`mIB88;@y`5YE%Y{*j$fl@ilW~%x5O%{|4u|TH`I(0$=6;>Q@Pm9@3tF z8^b4mAHG9M-=T)}c)G=Ayie`X?8V4<;sr`K=fxx*`MPo9gERT(8c)!+MtF|x3(7c? zi3Hjy(z|nlv{JYqA$`4rH0~g;Kwp zieOK-#7IV)1Ueje98h(J^b|jWIgI1_5U%(1dftBl>xd=%>oaGF&AO3xYaKH++MAqm z39fI$_21I#qut_nHtPKw_1Z>#hNzyK zd0{V)YLOk*;`(j4{;8!BBi*X+&wF<@1+KH_HS+A-cTrrQStvb6*r)zTx5_(b$Th2* zB-i9V_>XSlR|SwkHydUjG^GnXx&!jTOIYg`oL{YZ8C?SL|wqiWjm}P#AUB)?ZJa&raB8NohN&&Cy8KA0xQ>>F7S^=rcsXDMfrkMGi&<=r9agEgdeZ!Mgq zalX`V@76gowU@P?pTUJm0_k({e7MORJk!-({yt;B_J(t%2f0}f-Ctd0vbPB4xLs<> zwP26Grg=WJX|cxFo!YZ-m-dX_rFB^8FQXhozL$Oy~##; zPx@gPS5{@?Ky4rTQ>5<{d%m#uOLwc(mnNK5EdAGKFPB<%FJ&ZVjrEdueG%84D{-Su z*ayw0;ToK8!{>+gO0S!+OS*w@;`v=bBNc z#12i{`E1O6zxF)Z?eqv5boz=9X^*6)u=Ct@zX7M~+f;__*1bj@;v(QNWZ$)2YLf#z z*(FJ7%v)hx$_L;9p>veZ+y}by|AEIG)*eO^{E=~E#dzMrnNlBYcD2O2MlC*LoSPQA zA@ksPOr3EK?J*dyj)?z-`-yRNT~(4xK%MnY(CPC%i81cRy%tv~K8Iyo1bqH=z4$BG z8n$54z0sGIDt`%QW<|9t65(lWupVN}+>-I%)xKw_ z%8v&zeO8&vdZyG7Kd@5kiSzg?2GzWUc&^X4|NnX4k8s}~;J!Z-J<|)+^$LzbJ3jSo z6PK>NPwVoGF$Hs6D4#d$|I<2B?_?ui_Eclx+-8Rc+hgN7&V_ryQR+ ze2l1#^7t8AXPN#BO3*a;Z zdcKL{J8=9hj2i&=;~0Wg;wb>+umpJK;0g4i0JY3+Bxe_wZ;01x_*7-O1ta3+lRqpY&Dw*R$faYi}4WK>Q)0*)dhqS&s*PuV7 z^F>`WD$mUv4G;5>u9cDJJ#z$CsqeE#hoRkA|3taS-3fd)2%gpxxNoY|pRXmDn>|?L z{pG@I39L!Fs63Y@QTC;Mk9jy8&HpNdZxHH6X`BLd{QiH(@2%2WNip#!@%k*S<@fbE z*2kUDF2MY(@2v^UQ`|YP^yh1{>VAt9Ut)@HhR2jEUOBvuFbH|P2eMTU=*r+)td07- zOb$$~?l)U|cZ$$4#zOaiukYdih%;Xi9#aS1E>FdD*LE=PQzh}0G>ka7+tR{# zfR~o5{masbu*f!~2fGKPhvsG-&GEe$j{ixUZ&b}Ed^%U($`@E4AZt{6}7PmpK zc88Rf;rZ&dhNRguIDRRj*Wi1HbRP5W5seSYCufB0+$hh_()^0tHSAZg*W}2IoEz}- z!5%GMcQ^ibw~Xc(pC$0W1mwO1>DDT-e;hki^5%{K*OxT=`BJt&V{o)}eM}87Tf4E; zp_yr)7Lb-LvH)3R31pF%zLAG-A0I9g8O2R$f5L(0bgpceiRYf%y|e9ia3#=AWq8|7qWd?89eJZrbc2-EndC^`Pg!(7=+^3Lp?yQ2(mn3V zuB2y^a6U;!!v2iICqAXmd=>!wbpIYdF3k2f^8!78Y+dHCWAi5dY`}WK5fAAE19+h~8yn8Jmqqyg0zhr#=&)&$!CrAJ6 z#e#eLRSqL$6+Ah~K3h$I{TW>Kv@uY4Zk7rZ-vHf_Y4oDK@vsJ&8w~ zDVI<_0e#qf4(J#5*CODM!5FsY@+|0d$x^s!c_e)fFwlccagNZNt zjJq9upvTf_m4maivsU#3s~b4FL21c#QoIONWF5yw!1xVJ$~m^-1D0Aq-Il1jp*hj2c-`X|Lo}M?xt>(r43bz zvkOF~;yIrwW_c-i(q{0aMJZo?A`T>7*;wfdb=)Nm{?@6V%(bIX=BUS9?=SS}<-t5U zd#p}$mi<~&Dy??CB^nD&oTUE2TE;(C$gWF))LG&Dr9;kjm5z=F99)F&%}~A6+)tmw z=+MgBxgQQX^qsb^VRot!bThM8MxdFCBKd6@LxJn_UZ?**sCE0;IFE8MpPM?T;S`JTn(hE!}*@qu(q=@vHh^_C+Fw|96y3N+dyAMNPHG&0#2>fHKv~r>zlqt)|Nf% z%^J}cOB`l$=JPoI9NrUnm6$I4nSL}g*Q15r$1T0keZ9F*_|cLgsg-Q#q9adc?UI$E zi%=IebgD#hO@h4D*jF;j8@qkE&d6G`onx!Nb*nt8@{UV$wkT~hHdV*AU#Ilfl>=;? zJn0Q-$gv`gH;zh-1tHk8#nk(;ab8Kylh-^Oe#SjmSbuUId9&tDC+h_lj9j4mzfN^* zuHRlbg%0j@Q%_}tS0yxzFC6U#sqt#sp+?ng!0?ZyN_35JbW&D2%j?WT2 ziv4fEpYeO2Rh?1mHFm0Rg|QDk`0RzS_;Vfx+#i;H=lt$U*Ef?;`b52Kj?5MJ_GZ;J z_GpeIW#AZSR{z!V-0XQkxsb6pkKs4(3QG;(BL#jhZ$c0+x@$y+6GWlJErHW?rYY4-#8GO;@b?c1)OZcmBtXB$#^*u5qzkAx*2nn?l429byNYt1^^ z@b)+RP4zZs{AV?EqC$CHnaBYdYg@5)Ny_a-GGB`z2mkm}Sd;OhCsVGdi22v?cOJ%P zTgyc5-&!HKyQ^Ay+t!Vjew=UXo@N~{{`P!l+=}ZS9wWJ@WhxKx(dyJk!1!b%M>=wy zsc#=wURo;p`=V%oPR9duIyAEWZq}ekeX@?sy5I3ru-@__Yv&s+K4PxH9*yhqv{qn` z`X++M{jEN1Uhe2laS_v)Kef43@Q3ea?yEe7J;$x?)T~NQ+Vb~i$F>$YP9%KbIoICQ zyQlsEy1X?mbJwFb5I&2wZE{{I+ihMWK0*51ZLg4?W^s`kT9%gi-hwaPJp%yTxEpKV zc{+Ih1pygY_rVg?Yl&;dk5;JmUiInCs2whIXJz}iT))+|6T8>Ng#PW(I&S9Nb8LUC z{rC+$kFKTl7sdVw|9eOL!}NWmwV!aa(_7d~uiBoQZxj2L@hjgZ_OYITyife=wm4;N znZ%=z0Btxeo{wk5b&G#N*<_K*B}P}XK0n+yeVh6Q3e@ihn%E5RK5~43INt`{{?LHR zy2?xTXbgp?I$+PI@!3k9udviQbp8F-U$9we`R;9MGf-QSvE5{pe*!iG`k(N9Bb&88 z=3$i)iTIfUiK$Ei*A8ANx{i?-OC@(Aj_>?BCHs?pT#l^OV9yVp=6}8!$46Bcrd~Y5 zsn>cy?M7RargtuubH@KvIdMO6jq@`+jJ7fG@-+2;SvbdW&$Gf`n!SMCJ{_<%IQUCD z4r4HvD8HvpYe(y=vVIOzL+31s*WJT7qfd)mvPI=8=G|9Wm@75^7Ou(dNo_~Q>mRz< z^FHYGj|ujews&*BbYvV{qP8a^O96g7O8si(nrDw^I?&+vmFm&D?W7}&GyXN^qADT~ z*U|N*T0hS-Q2WoE{iF^-lobBsZAWn#)|tQl(LpbVY&Kh<9x$19a2sr0o+ z5~A!q?!7H5B4n>3S;^k6t0ZJ4dtJ%i+1n+1UVC$8U0m07UGBZ^b?^Q92hLBQ$2p&K z-mlm5`4#H&$?kA|;HmY!z9*-$0e=r{bNPJCm!Pth!i9kv)m4U-LVQ``6p$lAXAjs| zb7R+bb{283gS)k{wr0e;zCV11s)gY9u7FCcliEcizP*{%i5&f2eZLxaxHPATDpPhX zH90n&EQGE&n>?UvX6sjRUs3P?gec6GD!UFex?w84_ZLt1!%~V;kw^~hOT?`B6wZL^ z7g&%G{&Jbc4H3O%H`Kiy07<0m?llCJ&onH|zT@$+Z}R|wc?0NX>&n~j!1YqFXqj~B z=d{981itp^M0zRgki(^b!IK9k_sgNJPH)e9E;;KmL?DDax!T6r`jXwQ*+BFc=TVKT>9zcTFxwTqvTtB2yszh=ycR-^l+V7VytP~gB#(=-|#2I{hn>`uf zpk+NGewg4xTxEnmg6$q*quRQA+#kke*m1F3SilOBin>gUSwPmQJ{7OC$M*j2r*<`2 z#982T!!O@Ln zk|H*aWsNflkz>etzS`XSWH0~N88N_H(cIVGa;0S+n$+X9S`onM=fYzj*S+5mSG9bS zz?EL~+HpIEGs=ZH5_G_1U6czDxcy-_cgf=YUY6p1GQuG=(X)n(hD}yh-#!D$4t(N?4;Yc0*q_$=j!@5S|EcCbY6NaCI^F zr&a|010&E7F{Giz0!%gsZ95NQ|9Lrkf4+c5lzV?&>Re2#$ca3;#ZF(nuz2%2c)=&( zOZx}d5PJ68yMR&^PikBrcxjS4m9MU|Et}I3;JbpG_qV-B2A&pGYxK{|I&Qoh`g+ry zw;V9E6Cf23vSAS)1#GJmpQBO??8OoFfT_`>{u#Gi+yLdz*VCpE56$7G7x92mfqOKR z?`FY5sRP`1|H2us%e?H498v z6-SBLCc_Scd2IFMKVLTtZ2Fg1N~ue;mf2H_%SRLP(K*&7d>HhRaUR_G`(v=|0qSCd zu4$W2(A^C`L$s((P{)~0;Q9Cxri<)aFi5b+U&h-(>^qSfpmf&%)-wv&Gf7r4ih2~T zIR5^kd*p&AkW`(%Hq}f1H;9Ls z^P=b{5t?DO)#-Z?TsMdsbL!lX50>vSkFBmnQ=5z4c>hqF$I0Bk<3;;9`*Ya=ovVe_ zGgsZ$BDugVdCTZBC`{btbmHjG`>mOtBX?~&q-yw2^M{&zAn`8j5aUOl>(n_gcwy~@ zekJHr?fTafg%(Wu7X7Tlzd?#;FzetMFggkUKvq@av3#STa$LS!#P#58v5lQifFWUy zoHp2-k8+f}V2iebK@J`QuRew_BSUtvd0 zGC$%foP@nS-h0FU>GeM}7pkLUkiq)4ZJxItF2L>es)LU%{_Wpd&8L}DoTHc}Qhn0_}wNt%Itwayv zkK@Judcns}kgGQz>D5TL)F(FOCD#u|_;*Ma)YXhd-7dRj_Ry%Tn$aUlE>G<3)zcQz z?t<6i_)z5jquF@5pb9gOcPT^2@+w7L;#7=%$Bi_P_fL;v1dFuLjFXoZD;?d|cpc6L zBR!$pjf<-3rs0cS0=A65DpK0-`xf!Q1h&Gy_I%|Es*ANUfk|#@Pu4T>Baj32tDU^e z9vq`eKuD$OER^axt6uBzrf%uIu0Chc5$;ZMGj4D=sj3NC;o2m;IR!EKP`E;ITqdNm zQ+a0Oc4nLEQ&ju&~{N=g2GNp_T^Sizk1+#`@_FbJwPR@5;@O*Irg$hDgP> z%1Cd=it?4VCrkawwn?gA{Eh2@mtB_)xe_FGvp54ioO}j*q_=IE+OL~g|5Sb*_zP$8 z;q949=No`=(B?C1`o$3A**o+}ZL8MChs

    1lr(bk|{k2bN*^rsm2zhKNW*qYU5F4Wm` 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