From e6821a219b148da3bef09b9f08fa82f1d7c2dfa4 Mon Sep 17 00:00:00 2001 From: Jeremy Bowman Date: Sun, 20 Dec 2009 21:31:21 -0500 Subject: [PATCH] Added support for running on Mac OS X with Qt 3 --- CHANGES | 7 + INSTALL | 45 +- README.txt | 7 +- calculator.cpp | 4 +- datewidget.cpp | 5 + desktop/QtaDatePicker.cpp | 9 + desktop/qpeapplication.cpp | 32 +- desktop/qpeapplication.h | 5 +- filtereditor.cpp | 2 +- mac/Info.plist | 45 + mac/PkgInfo | 1 + mac/PortaBase.icns | Bin 0 -> 51101 bytes mac/PortaBaseFile.icns | Bin 0 -> 41716 bytes mac/build_bundle.sh | 59 + mac/eventhandlers.h | 77 ++ mac/icons/back.png | Bin 0 -> 795 bytes mac/icons/calculator.png | Bin 0 -> 589 bytes mac/icons/close.png | Bin 0 -> 510 bytes mac/icons/copy.png | Bin 0 -> 3781 bytes mac/icons/edit.png | Bin 0 -> 1627 bytes mac/icons/fileopen.png | Bin 0 -> 2232 bytes mac/icons/find.png | Bin 0 -> 1983 bytes mac/icons/forward.png | Bin 0 -> 673 bytes mac/icons/new.png | Bin 0 -> 1177 bytes mac/icons/portabase.png | Bin 0 -> 19374 bytes mac/icons/portabase/calculator.png | Bin 0 -> 589 bytes mac/icons/portabase/calendar.xpm | 26 + mac/icons/portabase/checked.png | Bin 0 -> 186 bytes mac/icons/portabase/down.png | Bin 0 -> 671 bytes mac/icons/portabase/image.png | Bin 0 -> 460 bytes mac/icons/portabase/note.png | Bin 0 -> 268 bytes mac/icons/portabase/save.png | Bin 0 -> 1348 bytes mac/icons/portabase/unchecked.png | Bin 0 -> 149 bytes mac/icons/portabase/up.png | Bin 0 -> 841 bytes mac/icons/quit_icon.png | Bin 0 -> 250 bytes mac/icons/trash.png | Bin 0 -> 1368 bytes mac/icons/txt.png | Bin 0 -> 625 bytes main.cpp | 10 + menuactions.cpp | 56 +- numberwidget.cpp | 5 + portabase.cpp | 25 +- portabase.pro | 6 + portabase_de.ts | 1920 ++++++++++++++++++++++++++++ preferences.cpp | 8 + rowviewer.cpp | 17 + rowviewer.h | 6 + sorteditor.cpp | 2 +- vieweditor.cpp | 2 +- 48 files changed, 2337 insertions(+), 44 deletions(-) create mode 100755 mac/Info.plist create mode 100755 mac/PkgInfo create mode 100755 mac/PortaBase.icns create mode 100755 mac/PortaBaseFile.icns create mode 100755 mac/build_bundle.sh create mode 100755 mac/eventhandlers.h create mode 100755 mac/icons/back.png create mode 100755 mac/icons/calculator.png create mode 100755 mac/icons/close.png create mode 100755 mac/icons/copy.png create mode 100755 mac/icons/edit.png create mode 100755 mac/icons/fileopen.png create mode 100755 mac/icons/find.png create mode 100755 mac/icons/forward.png create mode 100755 mac/icons/new.png create mode 100755 mac/icons/portabase.png create mode 100755 mac/icons/portabase/calculator.png create mode 100755 mac/icons/portabase/calendar.xpm create mode 100755 mac/icons/portabase/checked.png create mode 100755 mac/icons/portabase/down.png create mode 100755 mac/icons/portabase/image.png create mode 100755 mac/icons/portabase/note.png create mode 100755 mac/icons/portabase/save.png create mode 100755 mac/icons/portabase/unchecked.png create mode 100755 mac/icons/portabase/up.png create mode 100755 mac/icons/quit_icon.png create mode 100755 mac/icons/trash.png create mode 100755 mac/icons/txt.png create mode 100644 portabase_de.ts diff --git a/CHANGES b/CHANGES index 9ed2f07..0e77c05 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +2004-05-06 JMB Mac OS X support + + Lots of little code tweaks to make PortaBase work properly and look + reasonably native on Mac OS X. Also added the files needed to generate + an application bundle. This is the code that was submitted to + Trolltech's Qt/Mac application developer contest. + 2004-03-29 #################### PortaBase 1.9 #################### 2004-03-29 JMB Translation updates, minor row viewer fix, etc. diff --git a/INSTALL b/INSTALL index 8043fa2..cfaf2fe 100644 --- a/INSTALL +++ b/INSTALL @@ -26,6 +26,15 @@ will need the following: - A recent version of Qt 3 (including qmake and development headers) - Other packages as needed to satisfy the above requirements or create packages for your OS/distribution + +Mac OS X Development Environment +-------------------------------- +To compile PortaBase for use as a Mac OS X desktop application, you will +need the following: +- Mac OS X Jaguar (10.2) or higher +- The Apple developer tools (which are on one of the CDs that come with + Panther, and are available from http://developer.apple.com) +- A recent version of Qt 3 Metakit Compilation ------------------- @@ -33,7 +42,10 @@ To compile PortaBase, Metakit must be compiled first. PortaBase uses a version of 2.4.9.3 patched to allow case-sensitive searches, locale-sensitive sorting, and unicode filename support where available. Therefore, the patch file metakit-2.4.9.3.patch must be applied to the Metakit 2.4.9.3 source tree -before building. +before building. When building for Mac OS X, however, a more recent version +from CVS is necessary in order to avoid a build problem present in the older +code; for the Qt/Mac developer contest, an already-patched Metakit source +code tarball (metakit.tar.gz) has been included for convenience. To build Metakit for the desktop test environment, run dev-x86-qpe.sh and then follow the Metakit installation instructions (in the Metakit README file). @@ -56,7 +68,8 @@ placed in (probably not /usr/local this time). Then copy libmk4.a to To compile Metakit for Windows, follow the instructions in Metakit's README file; be sure to build the static library version (mklib). To compile -Metakit for use in Linux desktop PortaBase, just follow the README directions. +Metakit for use in Linux or Mac OS X desktop PortaBase, just follow the +README directions (the "UNIX" instructions in both cases). BeeCrypt compilation -------------------- @@ -73,10 +86,11 @@ libjpeg compilation ------------------- For desktop Linux, this is probably already on your system; just make sure to install the appropriate dev package if it hasn't already been installed (for -Debian this is libjpeg62-dev). For Windows, get version 6b from +Debian this is libjpeg62-dev). For Windows and Mac OS X, get version 6b from http://www.ijg.org and follow the build instructions from the install.doc file -that comes with the source code. For the Zaurus version, it's easiest to just -use the Debian arm package for libjpeg62-dev; after downloading the .deb file, +that comes with the source code (at least on Mac OS X, remember to run "make +install-lib" at the end). For the Zaurus version, it's easiest to just use +the Debian arm package for libjpeg62-dev; after downloading the .deb file, you can extract the necessary files by running: ar x libjpeg62-dev_6b-9_arm.deb @@ -172,6 +186,26 @@ files into the correct locations: ...and so on. (The portabase.qm files are created by running lrelease on portabase.pro.) +Mac OS X compilation +-------------------- +- Install Qt version 3.2 or newer and configure it, as per the directions + in its INSTALL file. Newer versions are better, as this port is + relatively new and many bugs have been fixed recently. +- Make sure the BeeCrypt and libjpeg static libraries (.a) are in + /usr/local/lib, and that the other library files (.dylib, .la, etc.) + aren't. Run ranlib on both of these files, e.g. + "sudo ranlib /usr/local/lib/libjpeg.a". The Metakit shared library + file (libmk4.dylib) should be here also. +- Make sure that "desktop" is among the CONFIG parameters in portabase.pro + (and that "qtopia", "sharp", and "test" aren't). +- Run qmake on portabase.pro +- Run make +- Enter the "mac" subdirectory and run "./build_bundle.sh". This will + create the PortaBase application bundle in that directory (copying and + appropriately linking the PortaBase executable and the Metakit shared + library file in the process). You can now run it and move it wherever + you'd like. + Package Building ---------------- To create ".ipk" files for installation on the Zaurus, create the following @@ -185,6 +219,7 @@ directory hierarchy as root in a directory of your choice: /portabase/opt/QtPalmtop/help/ja/html/portabase.html /portabase/opt/QtPalmtop/help/zh_TW/html/portabase.html /portabase/opt/QtPalmtop/i18n/cs/portabase.qm +/portabase/opt/QtPalmtop/i18n/de/portabase.qm /portabase/opt/QtPalmtop/i18n/fr/portabase.qm /portabase/opt/QtPalmtop/i18n/ja/portabase.qm /portabase/opt/QtPalmtop/i18n/zh_TW/portabase.qm diff --git a/README.txt b/README.txt index d8bca61..82c22a4 100644 --- a/README.txt +++ b/README.txt @@ -3,7 +3,7 @@ PortaBase 1.9 (March 2004) PortaBase (portable database) is a personal database application originally written for the Linux-based models of Sharp Zaurus PDA (and should work on any other Linux PDA using the Qtopia environment.) It can now also be -run as a Linux or Windows desktop application. +run as a Linux, Mac OS X, or Windows desktop application. The main features PortaBase currently has are: - One data table per file @@ -54,6 +54,11 @@ Windows Installation and Upgrades Run the downloaded executable; it will launch the installation program, just follow the directions. +Mac OS X Installation +--------------------- +Extract the application bundle from the downloaded archive and put it where +you want it. + Technical Info and Acknowledgements ----------------------------------- PortaBase is written in C++, using the Qt and Qtopia libraries for GUI widgets, diff --git a/calculator.cpp b/calculator.cpp index f15ae52..7254df4 100644 --- a/calculator.cpp +++ b/calculator.cpp @@ -71,12 +71,14 @@ Calculator::Calculator(QWidget* parent, const char *name) buttons[PLUSMINUS] = new QPushButton("+-", this); buttons[PERCENT] = new QPushButton("%", this); - int buttonWidth = 30; int i; +#if !defined(Q_OS_MACX) + int buttonWidth = 30; for (i = 0; i < MAX_BUTTONS; i++) { buttons[i]->setMinimumWidth(buttonWidth); buttons[i]->setMaximumWidth(buttonWidth); } +#endif grid->addWidget(buttons[7], 1, 0); grid->addWidget(buttons[8], 1, 1); diff --git a/datewidget.cpp b/datewidget.cpp index 3d0d05c..36b689e 100644 --- a/datewidget.cpp +++ b/datewidget.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "database.h" #include "datewidget.h" @@ -50,7 +51,11 @@ DateWidget::DateWidget(QWidget *parent, const char *name, WFlags f) months.append(tr("Nov")); months.append(tr("Dec")); dateObj = QDate::currentDate(); +#if defined(Q_OS_MACX) + QToolButton *button = new QToolButton(this); +#else QPushButton *button = new QPushButton(this); +#endif button->setPixmap(Resource::loadPixmap("portabase/calendar")); connect(button, SIGNAL(clicked()), this, SLOT(launchSelector())); display = new QLabel(toString(dateObj), this); diff --git a/desktop/QtaDatePicker.cpp b/desktop/QtaDatePicker.cpp index dddb210..76b2e09 100644 --- a/desktop/QtaDatePicker.cpp +++ b/desktop/QtaDatePicker.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include // // Globals @@ -48,9 +49,13 @@ QDatePicker::QDatePicker(QDate *inDate, QWidget *parent) vbox->addWidget(hbox); // Create the 'prev' month button +#if defined(Q_OS_MACX) + QToolButton *prevMonthButton = new QToolButton(Qt::LeftArrow, hbox); +#else QPushButton *prevMonthButton = new QPushButton(hbox); QPixmap prevPixmap = Resource::loadPixmap("portabase/QtaDatePickerPrev"); prevMonthButton->setPixmap(prevPixmap); +#endif connect(prevMonthButton, SIGNAL(clicked()), this, SLOT(datePickerPrevMonth())); @@ -74,9 +79,13 @@ QDatePicker::QDatePicker(QDate *inDate, QWidget *parent) this, SLOT(datePickerMonthChanged(int))); // Create the 'next' month button +#if defined(Q_OS_MACX) + QToolButton *nextMonthButton = new QToolButton(Qt::RightArrow, hbox); +#else QPushButton *nextMonthButton = new QPushButton(hbox); QPixmap nextPixmap = Resource::loadPixmap("portabase/QtaDatePickerNext"); nextMonthButton->setPixmap(nextPixmap); +#endif connect(nextMonthButton, SIGNAL(clicked()), this, SLOT(datePickerNextMonth())); diff --git a/desktop/qpeapplication.cpp b/desktop/qpeapplication.cpp index e2b8be8..f72fb79 100644 --- a/desktop/qpeapplication.cpp +++ b/desktop/qpeapplication.cpp @@ -40,9 +40,13 @@ QString QPEApplication::iconDir() { #if defined(Q_WS_WIN) return qApp->applicationDirPath() + "/icons/"; +#else +#if defined(Q_OS_MACX) + return QPEApplication::resourcePath() + "icons/"; #else return "/usr/share/portabase/icons/"; #endif +#endif } QString QPEApplication::documentDir() @@ -83,16 +87,21 @@ QStringList QPEApplication::languageList() QString QPEApplication::translationFile() { QStringList langs = QPEApplication::languageList(); + QString suffix = "/portabase.qm"; #if defined(Q_WS_WIN) QString path = qApp->applicationDirPath() + "/i18n/"; +#else +#if defined(Q_OS_MACX) + QString path = QPEApplication::resourcePath(); + suffix = ".lproj/portabase.qm"; #else QString path = "/usr/share/portabase/i18n/"; #endif - QString filename = "/portabase.qm"; +#endif int count = langs.count(); for (int i = 0; i < count; i++) { - if (QFile::exists(path + langs[i] + filename)) { - return path + langs[i] + filename; + if (QFile::exists(path + langs[i] + suffix)) { + return path + langs[i] + suffix; } } // No appropriate translation file, just use what's in the code @@ -102,20 +111,26 @@ QString QPEApplication::translationFile() QString QPEApplication::helpDir() { QStringList langs = QPEApplication::languageList(); + QString suffix = "/"; #if defined(Q_WS_WIN) QString path = qApp->applicationDirPath() + "/help/"; +#else +#if defined(Q_OS_MACX) + QString path = QPEApplication::resourcePath(); + suffix = ".lproj/"; #else QString path = "/usr/share/portabase/help/"; +#endif #endif int count = langs.count(); for (int i = 0; i < count; i++) { QDir dir(path + langs[i]); if (dir.exists()) { - return path + langs[i] + "/"; + return path + langs[i] + suffix; } } // Default to English, will usually be present - return path + "en/"; + return path + "en" + suffix; } void QPEApplication::showMainDocumentWidget(QWidget* mw, bool nomaximize) @@ -127,3 +142,10 @@ void QPEApplication::showMainDocumentWidget(QWidget* mw, bool nomaximize) mw->show(); } } + +#if defined(Q_OS_MACX) +QString QPEApplication::resourcePath() +{ + return qApp->applicationDirPath() + "/../Resources/"; +} +#endif diff --git a/desktop/qpeapplication.h b/desktop/qpeapplication.h index ccd71e2..d46dcbb 100644 --- a/desktop/qpeapplication.h +++ b/desktop/qpeapplication.h @@ -1,7 +1,7 @@ /* * qpeapplication.h * - * (c) 2003 by Jeremy Bowman + * (c) 2003-2004 by Jeremy Bowman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,6 +31,9 @@ class QPEApplication : public QApplication private: static QStringList languageList(); +#if defined(Q_OS_MACX) + static QString resourcePath(); +#endif }; #endif diff --git a/filtereditor.cpp b/filtereditor.cpp index d846958..3b037ef 100644 --- a/filtereditor.cpp +++ b/filtereditor.cpp @@ -25,7 +25,7 @@ FilterEditor::FilterEditor(QWidget *parent, const char *name) { QHBox *hbox = new QHBox(this); vbox->addWidget(hbox); - new QLabel(tr("Filter Name"), hbox); + new QLabel(tr("Filter Name") + " ", hbox); nameBox = new QLineEdit(hbox); listBox = new QListBox(this); diff --git a/mac/Info.plist b/mac/Info.plist new file mode 100755 index 0000000..caececd --- /dev/null +++ b/mac/Info.plist @@ -0,0 +1,45 @@ + + + + + CFAppleHelpAnchor + portabase + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + pob + + CFBundleTypeIconFile + PortaBaseFile + CFBundleTypeName + PortaBase File + CFBundleTypeRole + Editor + + + CFBundleExecutable + PortaBase + CFBundleGetInfoString + 1.9, (c) Jeremy Bowman, 2002-2004 + CFBundleIconFile + PortaBase + CFBundleIdentifier + net.sourceforge.portabase + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.9 + CFBundleSignature + PBas + CFBundleVersion + 1.9 + LSMinimumSystemVersion + 10.2.0 + + diff --git a/mac/PkgInfo b/mac/PkgInfo new file mode 100755 index 0000000..7b9ef41 --- /dev/null +++ b/mac/PkgInfo @@ -0,0 +1 @@ +APPLPBas diff --git a/mac/PortaBase.icns b/mac/PortaBase.icns new file mode 100755 index 0000000000000000000000000000000000000000..9e60f8a45e0927d82c986bf316773adf36b9fd06 GIT binary patch literal 51101 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

=|}i`fHwTfIOq(*)$pv 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 C`Si2^ literal 0 HcmV?d00001 diff --git a/mac/build_bundle.sh b/mac/build_bundle.sh new file mode 100755 index 0000000..b558c96 --- /dev/null +++ b/mac/build_bundle.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# +# Build the application bundle for Mac OS X, after the executable has been +# compiled. + +# Basic directory structure +mkdir PortaBase.app +mkdir PortaBase.app/Contents +mkdir PortaBase.app/Contents/MacOS +mkdir PortaBase.app/Contents/Frameworks +mkdir PortaBase.app/Contents/Resources + +# Metadata files +cp Info.plist PortaBase.app/Contents/ +cp PkgInfo PortaBase.app/Contents/ + +# Metakit shared library +cp /usr/local/lib/libmk4.dylib PortaBase.app/Contents/Frameworks/ +install_name_tool -id @executable_path/../Frameworks/libmk4.dylib \ + PortaBase.app/Contents/Frameworks/libmk4.dylib + +# Executable +cp ../portabase.app/Contents/MacOS/portabase PortaBase.app/Contents/MacOS/ +install_name_tool -change libmk4.dylib \ + @executable_path/../Frameworks/libmk4.dylib \ + PortaBase.app/Contents/MacOS/PortaBase + +# Icons +cp PortaBase.icns PortaBase.app/Contents/Resources/ +cp PortaBaseFile.icns PortaBase.app/Contents/Resources/ +mkdir PortaBase.app/Contents/Resources/icons +cp icons/*.png PortaBase.app/Contents/Resources/icons/ +mkdir PortaBase.app/Contents/Resources/icons/portabase +cp icons/portabase/*.png PortaBase.app/Contents/Resources/icons/portabase/ +cp icons/portabase/*.xpm PortaBase.app/Contents/Resources/icons/portabase/ + +# Help file (and translations thereof...use English when not translated) +mkdir PortaBase.app/Contents/Resources/cs.lproj +cp ../help/html/portabase.html PortaBase.app/Contents/Resources/cs.lproj/ +mkdir PortaBase.app/Contents/Resources/de.lproj +cp ../help/html/portabase.html PortaBase.app/Contents/Resources/de.lproj/ +mkdir PortaBase.app/Contents/Resources/en.lproj +cp ../help/html/portabase.html PortaBase.app/Contents/Resources/en.lproj/ +mkdir PortaBase.app/Contents/Resources/fr.lproj +cp ../help/html/portabase.html PortaBase.app/Contents/Resources/fr.lproj/ +mkdir PortaBase.app/Contents/Resources/ja.lproj +cp ../help/ja/html/portabase.html PortaBase.app/Contents/Resources/ja.lproj/ +mkdir PortaBase.app/Contents/Resources/zh_TW.lproj +cp ../help/tw/html/portabase.html PortaBase.app/Contents/Resources/zh_TW.lproj/ + +# UI translation files +cd .. +lrelease portabase.pro +cd mac +cp ../portabase_cs.qm PortaBase.app/Contents/Resources/cs.lproj/ +cp ../portabase_de.qm PortaBase.app/Contents/Resources/de.lproj/ +cp ../portabase_fr.qm PortaBase.app/Contents/Resources/fr.lproj/ +cp ../portabase_ja.qm PortaBase.app/Contents/Resources/ja.lproj/ +cp ../portabase_zh_TW.qm PortaBase.app/Contents/Resources/zh_TW.lproj/ diff --git a/mac/eventhandlers.h b/mac/eventhandlers.h new file mode 100755 index 0000000..b441838 --- /dev/null +++ b/mac/eventhandlers.h @@ -0,0 +1,77 @@ +/* + * mac/eventhandlers.h + * + * (c) 2004 by Jeremy Bowman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include + +#if defined(Q_OS_MACX) +#include "../portabase.h" +#include +#include + +static PortaBase *pbInstance = 0; + +static OSErr checkAppleEventForMissingParams(const AppleEvent& theAppleEvent) +{ + DescType returnedType; + Size actualSize; + OSErr err; + + switch (err = AEGetAttributePtr(&theAppleEvent, keyMissedKeywordAttr, + typeWildCard, &returnedType, nil, 0, + &actualSize)) { + case errAEDescNotFound: // If we couldn't find the error attribute + return noErr; // everything is ok, return noErr + case noErr: // We found an error attribute, so + return errAEEventNotHandled; // tell the client we ignored the event + default: + return err; // Something else happened, return it + } +} + +static pascal OSErr odocHandler(const AppleEvent* inEvent, AppleEvent*, long) +{ + AEDescList documentList; + OSErr err = AEGetParamDesc(inEvent, keyDirectObject, typeAEList, + &documentList); + if (err == noErr) { + err = checkAppleEventForMissingParams(*inEvent); + if (err == noErr) { + long documentCount; + err = AECountItems(&documentList, &documentCount); + if (err == noErr && documentCount > 0) { + // What kind of document is it? + long documentIndex = 1; + DescType returnedType; + Size actualSize; + err = AESizeOfNthItem(&documentList, documentIndex, + &returnedType, &actualSize); + if (err == noErr) { + // It's just a normal document file + AEKeyword keyword; + FSRef ref; + err = AEGetNthPtr(&documentList, documentIndex, typeFSRef, + &keyword, &returnedType, (Ptr)&ref, + sizeof(FSRef), &actualSize); + if (err == noErr) { + char buf[1024]; + FSRefMakePath(&ref, reinterpret_cast(buf), 1024); + if (pbInstance) { + pbInstance->openFile(QString::fromUtf8(buf)); + } + } + } + } + } + AEDisposeDesc(&documentList); + } + return err; +} +#endif \ No newline at end of file diff --git a/mac/icons/back.png b/mac/icons/back.png new file mode 100755 index 0000000000000000000000000000000000000000..52c9c351addc43a7a2d5253362e3ad4ca214cdda GIT binary patch literal 795 zcmV+$1LXXPP)leK~#90ZIWF`R8bU#zcY@eUM-t)(hQpD=c?sYlo@s_N=nGY zN_*2Fh%iw^tT&CKsE3Nc!Z)o4sfdco2oVykG1IWYGVp4Kq%Zzt zeV##cUw|~{R@y(h&52C`yCad2fu5j)F?5&wS71I&4@L%hNONut`VhCTU_r8>yD)SY ZzX9eJ2&RPMvq%5{002ovPDHLkV1i9lXAJ-V literal 0 HcmV?d00001 diff --git a/mac/icons/calculator.png b/mac/icons/calculator.png new file mode 100755 index 0000000000000000000000000000000000000000..b7077f11c83a4f5bbfeadd70fbe8194dd7e41217 GIT binary patch literal 589 zcmV-T0(f#LJ#&kWq$++d6ih>3}b0IA;q0mK3%SaX)-Fnsv-f#JoI z7Yv6x4>Q=7+cIzob75$D@!rzek}4RVkikN zVQ5&`z|aui01RuOKYf7y{0;RZ3$o`J7ytqYY@=457Q!Y^2Dr^&_7bQofHZ>#&^9xO zjQ{}z3OZqi5MVNT31s~O#SO>_&^Uvc4rBj^s=2^W1Q0+VjeI~X3ra?y6anSq1D`;t b4WEbP-5hy)=E3b#dyEj(g%XO>G)$W+75%(wr{?21OCamog^ zwMj8Raa|y>i5k8RvDRXYp?+4UP%6~^R1o^18c)WGBAgtbP&uj~%aX^ZN4njv3jI*6 z1%!U6ViOYt0Te-&B^6o0_kE-<0l2-pWf|fCo?o8PpPE5`K-7tdO^mna5qJTkw-JlQ zB7@`riA|I|kd$^xS+ITIX7Vv1>PIVQ-nZ3`@@7gJ@ z9#%6y9U{QR`Gu>XP%6~S+$b|PPS1935kfe{X}+TXpw(;vAcQ~&;q;uIE$8I`Q$4LM z2Ul6E*8#)$DX8-^I07*qoM6N<$f}*6& Avj6}9 literal 0 HcmV?d00001 diff --git a/mac/icons/copy.png b/mac/icons/copy.png new file mode 100755 index 0000000000000000000000000000000000000000..cfa9cb4317e27d2ee0f8a5116cfea21e3f151a43 GIT binary patch literal 3781 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 literal 0 HcmV?d00001 diff --git a/mac/icons/edit.png b/mac/icons/edit.png new file mode 100755 index 0000000000000000000000000000000000000000..1d691451514079074d6c1a4b057d8c1406e5621d GIT binary patch literal 1627 zcmW+%dr(tn7XNZ@$OA4UJT&n|l2T1t=n}w+f@>}{izxDtIu&heQXak^5m-S%a+4?z z&GJyodneR!)v>J&)6P__ySX8t7(u9Y#-g?4(x6bbHGm+Hz!0nkxX z=H7N;AtE;=D-D2?D*+%30L(!jjsfs@IRL+_0Z3>9KydWDsyi6~zaKX%leU*U%~@YS zjcHl2*1nI6|CCk^M#f|UfK)M@#1P~fw76&b34})#&<&l_{V+bfd|o@+`2aqMUvUDj z_5wy1^DSX@=Ipo#wGCNt&npEVqPh1I*I~bQvYn={56)?eKcYSFvoQb52|!Gc5?5sv ze>N~c7Y%7ese2s$ac~E%eQtBXq0k>7+`XKJulh#dtD3*imir&BJ`?6>|)VSXZ+D=tF5br%g49AeRWrRP|)2om~lD&Fm;XkjyYCd=J0#) zPxlx1G{4`?RqOMETRSFY+Xk13iIf5$TS|YjlO!eZqK=9jm{j1spi49>41ezKBwy^b ziz8M(6t8;suIojh?1<3FZT97ex_l-3O5@j<@jU)Yk!#?Tp%oxB(N?&>l(mL?qC%^M zaq`%hki)BRQ12uZwLx<8m*6*ADnM<#_UL{QJ1z`ucO{KZ{5Qf zKH5f#sr;L#pwvKEqRmZozl*o@O)qS&KJKd~c!YqaaJig*istoz_vpaaZ^{4Ex?(-_ zR4sM&vjkKc7bh=8#yOcMT%u8a@&^(zuRtOfI>&%9Th=>6Rd5BXCWHRU4;0FD_nPG0;b}z3< z4<}G2e>dBM+^(OqhOqYRUsp8(b?G_GVFiLki=OZ0Pdq?&WEzdVj@1BTi(7S+yHuSoKt8`Rsna1N1iQ||Q#@>PXg%f-tC5yzlZhJa zK8IbRPhr|}xMy~LI??vVq!7}`VecE!rTXgX*6rEKOFL=nyytRz*_r_EMb45W>$D)7&)C>fe=P@unY5OL8C*sB@@Khcwi)4}-#d|!Zx_)9JDPkbImZt$PE&*>h0%pY zjcmP;D!Jm>OY8!@pOaB+>u1fC+={KZUx?-78_ Me@j>1_&}}yALD7)0RR91 literal 0 HcmV?d00001 diff --git a/mac/icons/fileopen.png b/mac/icons/fileopen.png new file mode 100755 index 0000000000000000000000000000000000000000..503a0045911aea0af4dfa1562ca1216941935702 GIT binary patch literal 2232 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 RO|<|3002ovPDHLkV1mTjV!HqU literal 0 HcmV?d00001 diff --git a/mac/icons/forward.png b/mac/icons/forward.png new file mode 100755 index 0000000000000000000000000000000000000000..c55c3b8909e71f73812092bb0f32928a8adf88c5 GIT binary patch literal 673 zcmV;S0$%-zP)=c9=nD8?wXdP_Bp_I&6m+5k-s{g2WCv95kdIgn?AM7~vwB^WW6z+rdqg zOz641JUs9B!}s~Vyi6Ho?4eDLP5_hJi&37$Y zKVzc+xW}AW{C*~s0=8O#x4!WPB$E*Uk%xX-OF9Zh+iMrC16!>CK;YRdx6asbO)roP zhXAD3drE8b#P4Io(T7=<$kqkhnH(>^r@8lOi|q7mTtG4$60MLnz>V{EeDSZm|DA)K zJk%;st$|+U_|j)KeB)f&$x@3)n-ICxa%wM+(`aDetcA;-bC?__L9ZgIT3kc@46kg! zL51RGeR2ZFds4JLpiQ z^bhu9D{VXfmxJO~w5zxckV`lI1Xe2+zaOkt`a)m2iUIxrvR}skmxqnr00000NkvXX Hu0mjf?adw) literal 0 HcmV?d00001 diff --git a/mac/icons/new.png b/mac/icons/new.png new file mode 100755 index 0000000000000000000000000000000000000000..8a303b7db293befc3120b9ebd48be3217fa9077c GIT binary patch literal 1177 zcmW+$e@s(%5dS`2d2MOCw&I{=K#NSrq(Tuka4=h-bRZRLHHHxvXh%!4ABY775!=^- zq+r93$h0m@Pz*umgu&*R(*dEHibX-@4-5_pOeTrL2uOkUy*>Ej?sCcJ?sK_(?yBS& zpD}y_d;kE9v{Z?Li2OC9AcQY0EnOf2DKBw%A^`37SnukWM9wWr$t>D;NK;g-)Tu#Y z?je<$pZ2XXPpwcZbB`Uqt4<(l!qX&)`%9jw+&C_R>4CRg^u7@G*v%s|dPUn08!oQ^ zFEjf&^kPLp7m#9%MP>M4@9U`Tm_O$cS>KuI!@424i{Q4(xHB8{C{V5Xd z%3`h2IhW1HmUw17@pV%+JtE`rn^RACrP6g!RpW#PnN?{Jr4%{fr$PLhLA0+g94;Rl zc$lOcz7bkm^%0Ga+6%#7Y=M}J3N(n$YUOZUJGh*Zr{_3V1&-V^`EhSeoGyY=Kt?Z8 zwUHZ>1N&^0wDgN60o`;{KtFImGnpP6yqU8BKsHJK74oxty*6+d(1Zbc_X;et7&w0$ zFmG974@d8D4K%m3ghv|&FPwEbAPV1dFb8sYJ0x+yig5L~GRH-|&oFR<6HW{kIA=d? zoE_=E+R=Il1*(u(lDIW$dy-bZ(Z0(kI(s+`ZnQ9DN zsCA0w4M?lOHL^nt>R*8zr5y-P8WXWv=lqiGYG{flc6TDE21t@$!MY(6b7%4bdUd^og$I_ehZ=}#^^m$*%5U`CuLv+TL zf?LZ=B0U+9ShNrOuvg@m#d6boxolrJt{aE9k(V3Kai^_46BSg)(u5AJN7vM*C4=;= zg6ps}_7cl$)N7YkHl%#LP4LQf1GQm~0MoO9OnkevEGwddV6 zG0DcF#oNT!DEvzJ1noM-+;`v9-N63pC5~I#RyqI*Hr@C{dLcXzF!0pWnqIl pZScpf->IKw-3CyF6O_UzfI+3{KY=uiLv literal 0 HcmV?d00001 diff --git a/mac/icons/portabase.png b/mac/icons/portabase.png new file mode 100755 index 0000000000000000000000000000000000000000..82710b15140a2a50151229ca1320a5acdaa8e3fb GIT binary patch literal 19374 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 t3=c~%FcV=co literal 0 HcmV?d00001 diff --git a/mac/icons/portabase/calculator.png b/mac/icons/portabase/calculator.png new file mode 100755 index 0000000000000000000000000000000000000000..b7077f11c83a4f5bbfeadd70fbe8194dd7e41217 GIT binary patch literal 589 zcmV-T0(f#LJ#&kWq$++d6ih>3}b0IA;q0mK3%SaX)-Fnsv-f#JoI z7Yv6x4>Q=7+cIzob75$D@!rzek}4RVkikN zVQ5&`z|aui01RuOKYf7y{0;RZ3$o`J7ytqYY@=457Q!Y^2Dr^&_7bQofHZ>#&^9xO zjQ{}z3OZqi5MVNT31s~O#SO>_&^Uvc4rBj^s=2^W1Q0+VjeI~X3ra?y6anSq1D`;t b4|gW!U_%O?XxI14-? ziy0WWg+Q3`(%rg0K*1}{sp2WMvNKUVRQOVZ=k zCbR0rw*CxKdP+JK)lb*TJw7NLo0sdKF;`_l#lntcEO0vt(1K~#90m6A_LlVKcypZEK|ZEns!`-~*g>XJoWR*Eo45|c_0 ziXa2&B0DB+(A`9LsY4_Q5gld}9mF!r5Jq&-G*D3@3B(v;B`RC{Z<}s!mmG~r=I{JI z4-dchC){?0o_H3$ZwxsygbaLTH>3V|IfGnSMNUpY_~))*0O7VPJaE}4srF;HYAla8 zP`cofTMx=I31YuCNQ8r+nZ@65Y-I>hIXp|at1HiHDzB9HIy_uDUdgv;oSyg7JiX<@ zeB^YV06<%6c3=^W>>Ij^uBg^3Gs5o9(~*l!qUCAC)ohf5e5D3K}lV&ck#=2(3+Heguv?kS!6zePBNq!ln zVt7Ufy>AS=VI%7G%BrSj20X2N490n}xQ72z0E( z|4%_qlAQJD7PhUxA{t4_ckF*S!n*JAzhv7Bb|~0!egpG&)oNh~X@vj)002ovPDHLk FV1j}~9LE3v literal 0 HcmV?d00001 diff --git a/mac/icons/portabase/image.png b/mac/icons/portabase/image.png new file mode 100755 index 0000000000000000000000000000000000000000..bc56a1c5749c12549465cf13869c4d0645f5dc21 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)07?Fw^Pk3ZTdzPZ!6K zid(&t4^BL+z~d@EQ)J`a79$_iYh|0vmv?vA72P=e?c?``jR(_=uJs&CzVLgJ!vWLF zuhhB49hMww6Yx9pm+QyLyv0FJ`&5FwS_C{aFLIQvTFB__pgEc0#4HEx-;2$z+>CSm zS#RHcIyAXI^v#;UJ(0!JzsxcFpi!XRUcIkpg0ZEu%H;iGe3Cz7SWl=v+*f)j%phyA z@XTc^Swe2bZqka{_fCrY%IYII;!GzeG=5OxQFC}Jlarp9CZK$JQ^{eGyNo}6{*~sN zq-As7xXR|(;`Bn_OWapX4!$~~~`?ABMKU(gK7Ec%b z$Eelu&vr7`>vmu`IG4CalmzFem6RtIr7}2ZC~JD=CZ?zQCZ=a5XDgWK8R?lTSX$~E znClxDDkK+W7MD~yXt#geQM0SW-1JwbS=QY>i$2?@$tjyy*V>A$KDn{EPg;Xt zdC#;LTX*~{6s$A-EmfYjd293aB+ZE?Zs}d}Z?%JVF$BpSwc6ZOYOln6=ewz_JL|XN z+WT${2F*bxzCHPWUab3@n6~9miR;_<8)mpZGB|cj=SmI3Lq%@?l1G*LKu0ooy85}S Ib4q9e07CC!?f?J) literal 0 HcmV?d00001 diff --git a/mac/icons/portabase/save.png b/mac/icons/portabase/save.png new file mode 100755 index 0000000000000000000000000000000000000000..dd00abd1663bb5e8be36eb3c3542da8294c5c31d GIT binary patch literal 1348 zcmWlZYfw{17>4&GA&C$;K~VyP5-tK&CI+kn8I_!HiGZUMkSetb0R+cuVx$5JB;gWJ zP=i%Os}gW(nUN`Aal8z}2}DbfGN`DvmKMTQD9SAn0?9c&{Mhf?@5k=E`_8lPdGYQY zj`r^M0076>n5YDzb5<6eO4QS5&zguvIV{{I1fbCnYIk9RnBB6Xld|?mGqbW&A4;Y>msVr;{Om7Wr~}H$zci%aqBv7E~&QFZcoy{W*lH z+LmVLL-l`31#Xx%I!yNltrR9CDpf^A*HlHfuNkdXqAP6KxN)NzRp23EPj2#J;?$S| z%iGfL44~pkAd%VZ_FI?XVl{MWIZB-acoVn## z9iQTYrl5K0i(kwhEq=vU?=d&mS_i7V2{x+Z!3(>=z{T>noeB+metvutkNWfH8Xbvo zGPn%8*u)-d9?;bz*#H5}+QY6%Zs0*wl7_|}SKzkNK2*8Rwg|PDmSO5%(O&AAOc9m4 zH?wR#iu=5E5bso(iUJySuVx%}(gB5;$p>c7K>Gs?4+rI(S*gy)eIz}`&MuyOYAVIA z8D-6F|Lt9*r}~BiAeGsDUwJ;6sVZFX;8j;TmKX^Eib-bwoP=gAiE?;KCg3~gf@~?U%-uGcCOS3j*@aEpQtMvRyPLbZx*edt zcBy2QLoEE!iLkaJihkb_h4QiCPAQeoFKEfZO4p6!yw~7CfP_D^>C%e-EyovWY%B41 z4lRDM(USC~@PH<-?5H<4yuz`gwRH-?q&eO8|3Cz^&Lpj5X>Qb`m2Wocv#&~`osN#w z3)k*w;)hk&J`6fTBdielP+T|Y)a1bTNXFxaAg^}~C3n`y*2l$kVEP$&L>#mtERkj< ztql>VN_xC%$xQ}&>|KVQy%LgR{vNvMhig1?jV&)O#NSk^U zksFwts;aT)hG9dvXt&JJemT$=Q}%%dWh4wKL5D#-=(Fb5wD%F^#fz&97<{}=&+}z& z7Uq+j($wFd(O3BV zxL4J)FYvKkP_AxlOjh1E3Iqz0r}D!+3Y{Y|ae{d|gW!U_%O?XxI14-? ziy0WWg+Q3`(%rg0KtWSa7srr_TgiX^|F>tp*wEQ1a)2q_(8%afAbTOx&NSuOjXV?H qs+@hZaMdhUe~y4GGiBb(oD8p{c;qs#crFJTz~JfX=d#Wzp$P!{O)hBw literal 0 HcmV?d00001 diff --git a/mac/icons/portabase/up.png b/mac/icons/portabase/up.png new file mode 100755 index 0000000000000000000000000000000000000000..dbad6ea857ecabc7dcd083b56aad1e35f4a9cbdc GIT binary patch literal 841 zcmV-P1GfB$P)(*1K~#90Ws+@3Q*ji=e|Njq>TapgOnM;;>1xzeDim3X2o5sS zWzmN;3Zi$B$i7)r6hTE%K|xS{DxxR?C9>6uS}zu{lu1o9i&?OlHMQ%@-1_$+chh>{ zz~OMtd7ktCKLBLZ)dO(1J&2;(iQ{RCjjRONYc`;$b`;gljH}IhuBdhls@q54=4Dj3 zkM*S$`mmzfSrKYwxXH(vpTG3_(2;%ohw=t50Es2LP~ASBrq}?OURoojPM;@I3#)WS zfZ0uNneW*8SAnax8rAJ1`k|HXojcfi{TkMFwW7vZf~9yP;ZC0zuPl3#iO{F_s`FI&zlB+QX0ZJtJvTDVji_}T@4F)(DpReu&aHc9Mu zu4c>H0(QOWqA}Qq*4+ou7=bT+EG|e#v!o&h1^v$(4;jr#hXJ_K-a}Hwevy`2CM2UQ z0Fmt2EG~ciE~Z_4Bo^Fn5!Oo&L}JxJfg}k)kJQ2{3;^L;6F_$2WZfqw*#Hs~TpEWVB`pKd z6PREWfVX`k00jGo=pFo%$4MqEIB@rVTLYf2I@U+H&+h z-3R~5JF#I6zl<^h!AQ3cfSV1sc=6oJ>ElQBK56{@bMCdVY>LdC0+p-;Xc>j%J?DtH zZZP^INJ8?=2_%}|gPf9pL3#8_)qC?g~B6$ TASLfi00000NkvXXu0mjfPx*V> literal 0 HcmV?d00001 diff --git a/mac/icons/quit_icon.png b/mac/icons/quit_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..f83a66db73780114c3346c84bd2ba0b224dfe8e2 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;RN#5=* z4F5rJ!QSPQfg+p*9+AZi4BUJm%;>Q1Ay7F3dx@v7EBi%ePEjij)%WfhK%sI^7srr_ zIcEbLxegd`Ox~w4|MTB>i(LlJyAW;tPbXFRCwBA z{Qv(y11@m%;xpWm1i;N(ckU;L*(>2w1F{<+fEWomz+7L7frWr&AQQg-W?=a7^FPD) zAHNyCeEZ4p>iu_yr;lzwjP$cnz~=yf0AeEK6GkF@`|BSA!{5I^{O>;y|AXK^zZhJc ztmPN2JNOKrUVs2%VxR(G2Aaam48n{ItSrn7EImH1}iHw@g*CMV1xuf08zyOV1t0JU}AtcfCU&0KYslICdNMu??3+nCeB|B zzkYmW(9zMAnYa4jOJscj0YoqtSO9YYGZ78|ra^|^e;62kf^)-Ph6hhyGhDcO52yN! zaBHyL00G28tq=f310y4Z21S9aq%eb|r~t#a@4pycz5C4Y6__>u0WJLX`#;0A>(@Y9 zjDh$pKmbwA0ZdR=Fad*$@h?Q|A23^jEdKlF9|J2ZGsC~X{}~vWP%}0_0Fj;sjxJ#M z-)P9d@a+SpBbZ>>5||DiUt-|uc4Oc?xtxKWorQs&jg^6e9f*N6G5`o57LqNWmk24v zx*Zu9OZPJ{a0#GfN00~q+&#y@*5=Ic@AF3nk;_LI{sTkgvsoC!f9C%TO#e{*3=lv} z{k1l{60SgIWVaNb1g&DrzILE-!>IAm@4=_>w1BwYO$YYl&Aj>}?EdL9n|NMp|Oi(GwhUNf(03zN2)(H%ZN%K*J z{sDvb&%Fx_zZx7Feq7kczyb<(ESCSuoX+sy+?Rm`=m-`TR4V}jh_o~Sas(*;fl&dn z9Ap6)-@U-V+Ug9k5Y6&`*)tdzouV07{{9Eon}7eKIshPmNY92qM}X?zzcUgcmj8xg zES59m&1PV5i~?p+VDjARY`wL}RQM^$-JF z#H$2~;6?inc=aTBsDh$`mmVr8c#u{wkoGL%q193(BE6V`hNiYr*ld#Bx8rH0B^z|$ z!DIN%$IS1|v*;1|Tt=e%;)l;xFI{Y09Uqq;E3c$pDa%UfkpR)@ioRZuRR17)=qSgs zSEyIYEX_}&mE8qWam7ZrkklvxLnA1ipnrITeMipneRYiL*H!L4E{WEf7p1Zl+d(Ro z!qy7JARY^Ei)=Q2MN)|c^jV;ljok+r4>1A8w6LTDK>EObo;;X}pFN+; z$jiI8#Q(i6p<5H`7>x$s1Uv3D{VG_#Vdh=`=mGvhf4+ z_gT9Dt&Wef4SuVEPA2KJT7$PcnE`DHk=~dKrl$g3cL1W_^Vhno+h6zLfMHu+F zTeYr{t$Z#c3-3Nbu*Lev1!iXE0Jw1RBs6^-5VJ@FnzWQhoniicUc$CkpcV z>Fu8D+!IuE3UVoXT8d8Lzlys+MW-M|ry$#3=6VAD^-Xsc#cKZmzeMWqqTt{~00000 LNkvXXu0mjf-fa<^ literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index d06dafb..d7c942b 100644 --- a/main.cpp +++ b/main.cpp @@ -18,6 +18,10 @@ #include "desktop/qpeapplication.h" #endif +#if defined(Q_OS_MACX) +#include "mac/eventhandlers.h" +#endif + int main(int argc, char **argv) { QPEApplication app(argc, argv); if (argc > 1 && argv[1] != QCString("-f") @@ -32,6 +36,12 @@ int main(int argc, char **argv) { if (argc == 3 && argv[1] == QCString("-f")) { pb.openFile(argv[2]); } +#if defined(Q_OS_MACX) + pbInstance = &pb; + // need this in order to open files launched from Finder + AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, + NewAEEventHandlerUPP(odocHandler), 0, false); +#endif return app.exec(); } } diff --git a/menuactions.cpp b/menuactions.cpp index 7c6648e..f958cc3 100644 --- a/menuactions.cpp +++ b/menuactions.cpp @@ -23,25 +23,29 @@ MenuActions::MenuActions(QObject *parent, const char *name) textMap.insert("Sort", tr("Sort")); textMap.insert("Filter", tr("Filter")); textMap.insert("Help", tr("Help")); - textMap.insert("New", tr("New")); - textMap.insert("Open", tr("Open")); + textMap.insert("New", tr("New") + "..."); + textMap.insert("Open", tr("Open") + "..."); textMap.insert("Open Recent", tr("Open Recent")); textMap.insert("Save", tr("Save")); - textMap.insert("Change Password", tr("Change Password")); + textMap.insert("Change Password", tr("Change Password") + "..."); textMap.insert("Import", tr("Import") + "..."); textMap.insert("Export", tr("Export") + "..."); textMap.insert("Slideshow", tr("Slideshow") + "..."); - textMap.insert("Properties", tr("Properties")); - textMap.insert("Preferences", tr("Preferences")); + textMap.insert("Properties", tr("Properties") + "..."); + textMap.insert("Preferences", tr("Preferences") + "..."); textMap.insert("Quit", tr("Quit")); textMap.insert("List", tr("List")); textMap.insert("Icons", tr("Icons")); +#if defined(Q_OS_MACX) + textMap.insert("Help Contents", tr("PortaBase Help")); +#else textMap.insert("Help Contents", tr("Help Contents")); +#endif textMap.insert("About PortaBase", tr("About PortaBase")); textMap.insert("About Qt", tr("About Qt")); - textMap.insert("Quick Filter", tr("Quick Filter")); - textMap.insert("Add", tr("Add")); - textMap.insert("Edit", tr("Edit")); + textMap.insert("Quick Filter", tr("Quick Filter") + "..."); + textMap.insert("Add", tr("Add") + "..."); + textMap.insert("Edit", tr("Edit") + "..."); textMap.insert("Delete", tr("Delete")); textMap.insert("Delete File", tr("Delete") + "..."); textMap.insert("Rename", tr("Rename") + "..."); @@ -49,10 +53,10 @@ MenuActions::MenuActions(QObject *parent, const char *name) textMap.insert("All Columns", tr("All Columns")); textMap.insert("All Rows", tr("All Rows")); textMap.insert("Copy", tr("Copy") + "..."); - textMap.insert("Show", tr("Show")); + textMap.insert("Show", tr("Show") + "..."); textMap.insert("Delete Rows In Filter", tr("Delete Rows In Filter")); - textMap.insert("Edit Columns", tr("Edit Columns")); - textMap.insert("Edit Enums", tr("Edit Enums")); + textMap.insert("Edit Columns", tr("Edit Columns") + "..."); + textMap.insert("Edit Enums", tr("Edit Enums") + "..."); textMap.insert("Close", tr("Close")); #if !defined(Q_WS_QWS) menuTextMap.insert("File", tr("&File")); @@ -61,34 +65,42 @@ MenuActions::MenuActions(QObject *parent, const char *name) menuTextMap.insert("Sort", tr("&Sort")); menuTextMap.insert("Filter", tr("Fi<er")); menuTextMap.insert("Help", tr("&Help")); - menuTextMap.insert("New", tr("&New")); - menuTextMap.insert("Open", tr("&Open")); + menuTextMap.insert("New", tr("&New") + "..."); + menuTextMap.insert("Open", tr("&Open") + "..."); menuTextMap.insert("Open Recent", tr("Open &Recent")); menuTextMap.insert("Save", tr("&Save")); - menuTextMap.insert("Change Password", tr("C&hange Password")); + menuTextMap.insert("Change Password", tr("C&hange Password") + "..."); menuTextMap.insert("Import", tr("&Import") + "..."); menuTextMap.insert("Export", tr("E&xport") + "..."); menuTextMap.insert("Slideshow", tr("S&lideshow") + "..."); - menuTextMap.insert("Properties", tr("Proper&ties")); - menuTextMap.insert("Preferences", tr("&Preferences")); + menuTextMap.insert("Properties", tr("Proper&ties") + "..."); + menuTextMap.insert("Preferences", tr("&Preferences") + "..."); menuTextMap.insert("Quit", tr("&Quit")); +#if defined(Q_OS_MACX) + menuTextMap.insert("Help Contents", tr("PortaBase Help")); +#else menuTextMap.insert("Help Contents", tr("Help &Contents")); +#endif menuTextMap.insert("About PortaBase", tr("&About PortaBase")); menuTextMap.insert("About Qt", tr("About &Qt")); - menuTextMap.insert("Quick Filter", tr("&Quick Filter")); - menuTextMap.insert("Add", tr("&Add")); - menuTextMap.insert("Edit", tr("&Edit")); + menuTextMap.insert("Quick Filter", tr("&Quick Filter") + "..."); + menuTextMap.insert("Add", tr("&Add") + "..."); + menuTextMap.insert("Edit", tr("&Edit") + "..."); menuTextMap.insert("Delete", tr("&Delete")); menuTextMap.insert("All Columns", tr("All &Columns")); menuTextMap.insert("All Rows", tr("All &Rows")); menuTextMap.insert("Copy", tr("&Copy") + "..."); - menuTextMap.insert("Show", tr("&Show")); + menuTextMap.insert("Show", tr("&Show") + "..."); menuTextMap.insert("Delete Rows In Filter", tr("&Delete Rows In Filter")); - menuTextMap.insert("Edit Columns", tr("Edit Col&umns")); - menuTextMap.insert("Edit Enums", tr("Edit &Enums")); + menuTextMap.insert("Edit Columns", tr("Edit Col&umns") + "..."); + menuTextMap.insert("Edit Enums", tr("Edit &Enums") + "..."); menuTextMap.insert("Close", tr("&Close")); +#if defined(Q_OS_MACX) + accelMap.insert("Help Contents", CTRL+Key_Question); +#else accelMap.insert("Help Contents", Key_F1); +#endif accelMap.insert("New", CTRL+Key_N); accelMap.insert("Open", CTRL+Key_O); accelMap.insert("Save", CTRL+Key_S); diff --git a/numberwidget.cpp b/numberwidget.cpp index 16499d8..695f6c0 100644 --- a/numberwidget.cpp +++ b/numberwidget.cpp @@ -11,6 +11,7 @@ #include #include +#include #include "calculator.h" #include "datatypes.h" #include "numberwidget.h" @@ -25,7 +26,11 @@ NumberWidget::NumberWidget(int type, QWidget *parent, const char *name, WFlags f : QHBox(parent, name, f), dataType(type) { entryField = new QLineEdit(this); +#if defined(Q_OS_MACX) + QToolButton *button = new QToolButton(this); +#else QPushButton *button = new QPushButton(this); +#endif button->setPixmap(Resource::loadPixmap("portabase/calculator")); connect(button, SIGNAL(clicked()), this, SLOT(launchCalculator())); int height = button->height(); diff --git a/portabase.cpp b/portabase.cpp index c956b97..7646e20 100644 --- a/portabase.cpp +++ b/portabase.cpp @@ -68,23 +68,25 @@ typedef QInputDialog InputDialog; PortaBase::PortaBase(QWidget *parent, const char *name, WFlags f) : QMainWindow(parent, name, f), db(0), doc(0), isEdited(FALSE), needsRefresh(FALSE) { -#if defined(Q_WS_QWS) +#if defined(Q_WS_QWS) || defined(Q_OS_MACX) setToolBarsMovable(FALSE); #endif - QFont currentFont = qApp->font(); - QString family = currentFont.family().lower(); - int size = currentFont.pointSize(); Config *conf = getPreferences(); conf->setGroup("General"); confirmDeletions = conf->readBoolEntry("ConfirmDeletions", TRUE); booleanToggle = conf->readBoolEntry("BooleanToggle"); bool pagedDisplay = conf->readBoolEntry("PagedDisplay", TRUE); +#if !defined(Q_OS_MACX) + QFont currentFont = qApp->font(); + QString family = currentFont.family().lower(); + int size = currentFont.pointSize(); conf->setGroup("Font"); family = conf->readEntry("Name", family); size = conf->readNumEntry("Size", size); QFont font(family, size); qApp->setFont(font); setFont(font); +#endif conf->setGroup("Colors"); QString color = conf->readEntry("EvenRows", "#FFFFFF"); @@ -104,8 +106,10 @@ PortaBase::PortaBase(QWidget *parent, const char *name, WFlags f) menu = menuBar(); toolbar = new QToolBar(this); addToolBar(toolbar, QMainWindow::Top, TRUE); - statusBar(); setIcon(Resource::loadPixmap("portabase")); +#if !defined(Q_OS_MACX) + statusBar(); +#endif #endif ma = new MenuActions(this); @@ -397,16 +401,18 @@ void PortaBase::editPreferences() Preferences prefs(this); if (prefs.exec()) { QFont font = prefs.applyChanges(); +#if !defined(Q_OS_MACX) setFont(font); viewer->updateButtonSizes(); file->setFont(font); +#endif if (doc) { showDataViewer(); rebuildViewMenu(); rebuildSortMenu(); rebuildFilterMenu(); } -#if !defined(Q_WS_QWS) +#if !defined(Q_WS_QWS) && !defined(Q_OS_MACX) help->setFont(font); fileSelector->setFont(font); #endif @@ -537,6 +543,9 @@ void PortaBase::openFile() void PortaBase::openFile(const QString &f) { + if (doc) { + return; + } DocLnk nf(f); openFile(nf); } @@ -740,7 +749,9 @@ void PortaBase::showFileSelector() #if !defined(Q_WS_QWS) help = new QPopupMenu(this); helpAction->addTo(help); +#if !defined(Q_OS_MACX) help->insertSeparator(); +#endif aboutAction->addTo(help); aboutQtAction->addTo(help); menu->insertItem(ma->menuText("Help"), help); @@ -839,7 +850,9 @@ void PortaBase::showDataViewer() #if !defined(Q_WS_QWS) help = new QPopupMenu(this); helpAction->addTo(help); +#if !defined(Q_OS_MACX) help->insertSeparator(); +#endif aboutAction->addTo(help); aboutQtAction->addTo(help); menu->insertItem(ma->menuText("Help"), help); diff --git a/portabase.pro b/portabase.pro index 83248d2..3b3af02 100644 --- a/portabase.pro +++ b/portabase.pro @@ -2,6 +2,7 @@ TEMPLATE = app CONFIG += qt warn_on release TARGET = portabase TRANSLATIONS = portabase_cs.ts \ + portabase_de.ts \ portabase_fr.ts \ portabase_ja.ts \ portabase_zh_TW.ts @@ -196,3 +197,8 @@ win32:QMAKE_CXXFLAGS_RELEASE += /MD win32:INCLUDEPATH += D:\Devel\metakit-2.4.9.3\include \ D:\Devel\jpeg-6b \ D:\Devel + +# Stuff for Mac OS X +macx:HEADERS += mac/eventhandlers.h +macx:LIBS += -framework ApplicationServices +macx:LIBS += -framework CoreServices diff --git a/portabase_de.ts b/portabase_de.ts new file mode 100644 index 0000000..12a5b88 --- /dev/null +++ b/portabase_de.ts @@ -0,0 +1,1920 @@ + + + CSVErrorDialog + + Problematic row + Problematische Zeile + + + + CalcDateEditor + + Calculation Node Editor + Berechnungsknoten bearbeiten + + + Column + Spalte + + + Constant + Konstante + + + + CalcEditor + + Calculation Editor + Berechnung bearbeiten + + + Column Name + Spaltenname + + + Equation + Gleichung + + + Decimal Places + Nachkommastellen + + + + CalcNode + + Days_Between + Tage_zwischen + + + MAX + MAX + + + MIN + MIN + + + AVERAGE + AVG + + + ABS + ABS + + + SQRT + SQRT + + + LOG + LOG + + + LN + LN + + + Seconds_Between + Sekunden_zwischen + + + Minutes_Between + Minuten_zwischen + + + Hours_Between + Stunden_zwischen + + + + CalcNodeEditor + + Calculation Node Editor + Berechnungsknoten bearbeiten + + + Column + Spalte + + + Constant + Konstante + + + Operation + Operation + + + Constant must be a decimal value + Konstante muss eine ganze Zahl sein + + + + CalcTimeEditor + + Calculation Node Editor + Berechnungsknoten bearbeiten + + + Column + Spalte + + + Constant + Konstante + + + + CalcWidget + + Update + Aktualisieren + + + + ColorDialog + + Hu&e: + Farb&ton : + + + &Sat: + &Sättigung : + + + &Val: + &Helligkeit : + + + &Red: + &Rot : + + + &Green: + &Grün : + + + Bl&ue: + Bla&u : + + + A&lpha channel: + A&lpha : + + + Select color + Farbe auswählen + + + + ColumnEditor + + Name + Name + + + Type + Typ + + + String + String + + + Integer + Integer + + + Decimal + Dezimal + + + Boolean + Boolean + + + Note + Notiz + + + Date + Datum + + + Time + Zeit + + + New Enum + Neue Aufzählung + + + Default + Vorgabe + + + Default Note + Vorgabenotiz + + + Today + Heute + + + None + kein + + + Now + Jetzt + + + Calculation + Berechnung + + + Sequence + Reihenfolge + + + Edit calculation + Berechnung bearbeiten + + + Next value + Nächster wert + + + Image + Bild + + + + Condition + + Any text column + Irgendeine Textspalte + + + %1 is checked + %1 ist gewählt + + + %1 is not checked + %1 ist nicht gewählt + + + %1 contains %2 + %1 enthält %2 + + + %1 starts with %2 + %1 beginnt mit %2 + + + + ConditionEditor + + Condition Editor + Bedingung bearbeiten + + + Any text column + Beliebige Stringspalte + + + contains + enthält + + + starts with + beginnt mit + + + Case sensitive + groß/klein beachten + + + Constant + Konstante + + + + Crypto + + Incorrect password + Ungültiges Kennwort + + + Error in decrypting data + Fehler in entschlüsselten Daten + + + Error in loading data + Fehler beim Laden der Daten + + + Password must be at least 6 characters long + Das Passwort muss mindestens 6 Zeichen lang sein + + + + DBEditor + + Columns Editor + Spalten Editor + + + + DateWidget + + None + kein + + + Mon + Mo + + + Tue + Di + + + Wed + Mi + + + Thu + Do + + + Fri + Fr + + + Sat + Sa + + + Sun + So + + + Jan + Jan + + + Feb + Feb + + + Mar + Mar + + + Apr + Apr + + + May + Mai + + + Jun + Jun + + + Jul + Jul + + + Aug + Aug + + + Sep + Sep + + + Oct + Okt + + + Nov + Nov + + + Dec + Dez + + + %1 %2 %3 %4 + 1=day of week, 2=month name, 3=day of month, 4=year + %1 %2 %3 %4 + +1=Wochentag, 2=Monat, 3=Tag des Monats, 4=Jahr + + + + EnumEditor + + Enum Editor + Aufzählung bearbeiten + + + Enum Name + Name der Aufzählung + + + Sort + Sortieren + + + Import + Import + + + Export + Export + + + Must have at least one option + Mindestens eine Option muss gewählt sein + + + Option text + Optionaler Text + + + Replace where used with: + Ersetzen wo benutzt mit: + + + + EnumManager + + Enum Manager + Aufzählungen bearbeiten + + + The following columns which +use this enum will also be +deleted: + Folgende Spalten, die +diese Aufzählung verwenden +werden gelöscht: + + + Continue? + Fortsetzen? + + + + FilterEditor + + Filter Editor + Filter bearbeiten + + + Filter Name + Name des Filters + + + + HelpBrowser + + Help + Hilfe + + + Back + Zurück + + + Forward + Vorwärts + + + + ImageEditor + + Image Editor + Bild bearbeiten + + + Width + Breite + + + Height + Höhe + + + Rotate + Drehung + + + Refresh + Aktualisieren + + + Image is too large to import + Das Bild ist zu groß für einen Import + + + Unsupported image format + Bildformat wird nicht unterstützt + + + + ImageSelector + + Select an image + Wählen Sie ein Bild + + + View + Ansicht + + + Change + Ändern + + + Delete + Löschen + + + Delete the current image? + Aktuelles Bild löschen? + + + + ImageViewer + + Image Viewer + Bildbetrachter + + + + ImportDialog + + Text encoding + Text-Codierung + + + Import rows from CSV file + Zeilen aus CSV-Datei importieren + + + Import from MobileDB file + Aus MobileDB importieren + + + Import from text file + Aus Text-Datei importieren + + + Import from XML file + Aus XML-Datei importieren + + + Text files with comma separated values + Text-Datei mit durch Komma getrennten Werten (CSV) + + + MobileDB files + MobileDB Dateien + + + XML files + XML Dateien + + + Images + Bilder + + + Choose a file + Wählen Sie eine Datei + + + Import + Importieren + + + Select an image + Wählen Sie ein Bild + + + + MenuActions + + File + Datei + + + View + Ansicht + + + Row + Zeile + + + Sort + Sortieren + + + Filter + Filter + + + Help + Hilfe + + + New + Neu + + + Open + Öffnen + + + Open Recent + Zuletzt geöffnete Dateien + + + Save + Speichern + + + Change Password + Passwort ändern + + + Import + Import + + + Export + Export + + + Slideshow + Diashow + + + Properties + Eigenschaften + + + Preferences + Einstellungen + + + Quit + Beenden + + + List + Liste + + + Icons + Icons + + + Help Contents + Hilfe Inhalt + + + About PortaBase + Über Portabase + + + About Qt + Über Qt + + + Quick Filter + Sofortfilter + + + Add + Hinzufügen + + + Edit + Bearbeiten + + + Delete + Löschen + + + Rename + Umbenennen + + + Refresh + Aktualisieren + + + All Columns + Alle Spalten + + + All Rows + Alle Zeilen + + + Copy + Kopieren + + + Show + Anzeigen + + + Delete Rows In Filter + Gefilterte Zeilen Löschen + + + Edit Columns + Spalten bearbeiten + + + Edit Enums + Aufzählung bearbeiten + + + Close + Schließen + + + &File + &Datei + + + &View + &Ansicht + + + &Row + &Zeile + + + &Sort + &Sortieren + + + Fi&lter + Fi&lter + + + &Help + &Hilfe + + + &New + &Neu + + + &Open + Ö&ffnen + + + Open &Recent + Zuletzt &Geöffnet + + + &Save + &Speichern + + + C&hange Password + &Passwort ändern + + + &Import + &Importieren + + + E&xport + E&xportieren + + + S&lideshow + Di&aporama + + + Proper&ties + E&igenschaften + + + &Preferences + &Einstellungen + + + &Quit + &Beenden + + + Help &Contents + Hilfe &Inhalt + + + &About PortaBase + Ü&ber PortaBase + + + About &Qt + Über &Qt + + + &Quick Filter + Sofort&filter + + + &Add + &Hinzufügen + + + &Edit + &Bearbeiten + + + &Delete + &Löschen + + + All &Columns + Alle &Spalten + + + All &Rows + Alle &Zeilen + + + &Copy + &Kopieren + + + &Show + &Anzeigen + + + &Delete Rows In Filter + &Gefilterte Zeilen Löschen + + + Edit &Enums + Aufzählungen &bearbeiten + + + &Close + &Schließen + + + Edit Col&umns + &Spalten bearbeiten + + + + NewFileDialog + + Export + Export + + + Enter a name for the new file + Geben Sie einen Namen für die neue Datei an + + + File already exists; overwrite it? + Datei existiert bereits, überschreiben? + + + Encrypt the file? + Datei verschlüsseln? + + + PortaBase files + PortaBase Dateien + + + Text files + Text Dateien + + + XML files + XML Dateien + + + Choose a filename to save under + Wählen Sie einen Namen zum speichern unter + + + Text files with comma separated values + Textdatei mit Komma-separierten Werten + + + Encrypted file + Verschlüsselte Datei + + + + PBDialog + + Name must not start with '_' + Der Name darf nicht mit '_' beginnen + + + Duplicate name + Doppelter Name + + + No name entered + Kein Name angegeben + + + OK + OK + + + Cancel + Abbrechen + + + Add + Hinzufügen + + + Edit + Bearbeiten + + + Delete + Löschen + + + Up + Nach oben + + + Down + Nach unten + + + + PBFileSelector + + No file selected + Keine Datei ausgewählt + + + PortaBase files + PortaBase Dateien + + + Choose a file + Wählen Sie eine Datei aus + + + Enter a name for the new file + Geben Sie einen Namen für die neue Datei an + + + Unable to create new file + Die neue Datei kann nicht angelegt werden + + + Enter the new file name + Geben Sie einen Namen für die neue Datei an + + + Unable to rename the file + Die Datei kann nicht umbenannt werden + + + + PasswordDialog + + Old password + Altes Passwort + + + New password + Neues Passswort + + + Password + Passwort + + + Repeat password + Passwort wiederholen + + + Repeat new password + Neues Passwort wiederholen + + + Repeated password doesn't match + Das wiederholte Passwort stimmt nicht überein + + + + PortaBase + + Delete + Löschen + + + XML + XML + + + MobileDB + MobileDB + + + Import from: + Importieren von: + + + Unable to create new file + Die neue Datei kann nicht angelegt werden + + + This file uses a newer version of the +PortaBase format than this version +of PortaBase supports; please +upgrade + Diese Datei nutzt eine neuere Version +des Portabase Formats als diese Version +unterstützt, bitte Version aktualisieren + + + Are you sure? + Sind Sie sicher? + + + Save changes? + Änderungen speichern? + + + Delete this row? + Zeile Löschen? + + + Delete all rows in the +current filter? + Alle Zeilen in diesem +Filter löschen? + + + CSV + CSV + + + rows in current filter + Zeilen in diesem Filter + + + Export to: + Exportieren nach: + + + Delete this view? + Diese Sicht löschen? + + + Delete this sorting? + Diese Sortierung löschen? + + + Delete this filter? + Diesen Filter löschen? + + + Copyright (C) + Copyright (C) + + + Web site at http://portabase.sourceforge.net + Homepage: http://portabase.sourceforge.net + + + Name + Name + + + Size + Größe + + + Rows + Zeilen + + + Columns + Spalten + + + Views + Sichten + + + Sortings + Sortierungen + + + Filters + Filter + + + Enums + Aufzählungen + + + File Properties + Eigenschaften Datei + + + File does not exist + Datei existiert nicht + + + Not a PortaBase file + Das ist keine Portabase-Datei + + + + Preferences + + Preferences + Einstellungen + + + Font + Schriftart + + + Name + Name + + + Size + Größe + + + Sample + Beispiel + + + Sample text + Beispiel Text + + + General + General + + + Confirm deletions + Löschen bestätigen + + + Allow checkbox edit in data viewer + Auswahlfelder in Datenansicht bearbeiten + + + Show seconds for times + Zeiten mit Sekunden anzeigen + + + Wrap Notes + Notizen umbrechen + + + at whitespace + an Leerzeichen + + + anywhere + überall + + + Row Colors + Zeilen einfärben + + + Date and Time + Datum und Zeit + + + Date format + Datumformat + + + Time format + Zeitformat + + + 24 hour + 24 Stunden + + + 12 hour + 12 Stunden + + + Weeks start on + Die Woche beginnt am + + + Sunday + Sonntag + + + Monday + Montag + + + Use pages in data viewer + Datenansicht in Seiten + + + Default rows per page + Vorgabe Zeilen pro Seite + + + Options + Optionen + + + Appearance + Darstellung + + + Top-level + Top level + + + Menu + Menü + + + Menus + Menüs + + + Show + Anzeigen + + + Toolbar Button + Werkzeugleiste + + + Buttons + Schaltflächen + + + + QColorDialog + + Hu&e: + Farb&ton : + + + &Sat: + &Sättigung : + + + &Val: + &Helligkeit : + + + &Red: + &Rot : + + + &Green: + &Grün : + + + Bl&ue: + Bla&u : + + + A&lpha channel: + A&lpha : + + + &Basic colors + &Grundfarben + + + &Custom colors + &Eigene Farben + + + &Define Custom Colors >> + Eigene &Farben einstellen >> + + + OK + OK + + + Cancel + Abbrechen + + + &Add to Custom Colors + &Als Eigene Farben hinzufügen + + + Select color + Farbe auswählen + + + + QDatePicker + + Select a date + Datum auswählen + + + January + Januar + + + February + Februar + + + March + März + + + April + April + + + May + Mai + + + June + Juni + + + July + Juli + + + August + August + + + September + September + + + October + Oktober + + + November + November + + + December + Dezember + + + Su + So + + + M + Mo + + + Tu + Di + + + W + Mi + + + Th + Do + + + F + Fr + + + Sa + Sa + + + Today + Heute + + + + QFileDialog + + All Files (*) + Alle Dateien (*) + + + All Files (*.*) + Alle Dateien (*.*) + + + + QInputDialog + + OK + Ok + + + Cancel + Abbrechen + + + + QLineEdit + + Clear + Löschen + + + Select All + Alles auswählen + + + &Undo + &Rückgängig + + + &Redo + &Wiederholen + + + Cu&t + &Ausschneiden + + + &Copy + &Kopieren + + + &Paste + &Einfügen + + + + QMainWindow + + Line up + Aufstellung + + + Customize... + Einstellungen... + + + + QMessageBox + + OK + OK + + + Cancel + Abbrechen + + + &Yes + &Ja + + + &No + &Nein + + + <h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for multiplatform GUI &amp; application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants.<br>Qt is also available for embedded devices.</p><p>Qt is a Trolltech product. See <tt>http://www.trolltech.com/qt/</tt> for more information.</p> + <h3>Über Qt</h3><p>Dieses Programme benutzt Qt version %1.</p><p>Qt ist ein C++ Toolkit zur Entwicklung von graphischer multiplatform Programme. Qt bietet Portabilität eines Quelltextes für MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux und alle wichtigen komerziellen UNIX-Versionen.<br>Qt ist auch für Embedded Geräte verfügbar.</p><p>Qt ist ein Produkt von Trolltech. Siehe <tt>http://www.trolltech.com/qt/</tt> für weitere Informationen.</p> + + + + QObject + + must be an integer + Muss eine Zahl sein + + + must be a decimal value + muss ein Dezimalwert sein + + + must be 0 or 1 + muss 0 oder 1 sein + + + invalid date + Datum ungültig + + + invalid time + Zein ungültig + + + no such option + Ungültige Option + + + Excess columns + Zu viele Spalten + + + Missing columns + Fehende Spalten + + + Unable to open file + Datei kann nicht geöffnet werden + + + Error in row %1 + Fehler in Zeile %1 + + + Not a valid MobileDB file + Datei ist keine gültige MobileDB + + + D + T + + + M + M + + + Y + J + + + PM + pm + + + AM + am + + + Problematic row + Problematische Zeile + + + Yes + Ja + + + No + Nein + + + Missing file + Datei fehlt + + + + QQDialog + + PortaBase + Portabase + + + + QTextEdit + + Clear + Löschen + + + Select All + Alles auswählen + + + &Undo + &Rückgängig + + + &Redo + &Wiederholen + + + Cu&t + &Ausschneiden + + + &Copy + &Kopieren + + + &Paste + &Einfügen + + + + RowEditor + + Row Editor + Zeilen bearbeiten + + + + RowViewer + + Row Viewer + Zeilen Ansicht + + + + SlideshowDialog + + Slideshow + Diashow + + + Column + Spalte + + + Delay between images + Wechsel nach + + + seconds + Sekunden + + + + SortEditor + + Sorting Editor + Sortierung bearbeiten + + + Sorting Name + Name der Sortierung + + + Sort + Sortieren + + + Column Name + Spaltenname + + + Direction + Richtung + + + Ascending + Aufsteigend + + + Descending + Absteigend + + + + TimeWidget + + AM + am + + + None + keine + + + PM + pm + + + + View + + No data to summarize + Nichts zusammenzufassen + + + Total + Total + + + Average + Duchschnitt + + + Minimum + Minimum + + + Maximum + Maximum + + + Checked + Geprüft + + + Unchecked + Ungeprüft + + + Earliest + Frühester + + + Latest + Letzter + + + Total length + Gesamtlänge + + + characters + Zeichen + + + Average length + Durchschnittliche Länge + + + Minimum length + Mindestlänge + + + Maximum length + Maximale Länge + + + Image available + Bild verfügbar + + + No image + Kein Bild + + + + ViewDisplay + + No results + Kein Ergebnis + + + No image columns in this view + Keine Bildspalten in dieser Ansicht + + + No rows in this filter + Keine Zeilen in diesem Filter + + + + ViewEditor + + View Editor + Ansicht bearbeiten + + + View Name + Name der Ansicht + + + Default Sorting + Standartsortierung + + + Default Filter + Standardfilter + + + Include + Include + + + Column Name + Spaltenname + + + None + kein + + + All Rows + Alle Zeilen + + + + XMLImport + + Error at + Fehler bei + + + Line + Zeile + + + Column + Spalte + + + only allowed as root element + nur zulässig als oberstes Element + + + Unknown element + Unbekanntes Element + + + %1 not allowed as child of %2 + %1 ist nicht zulässig als Teil von %2 + + + Missing element + Fehlendes Element + + + "c" attribute is missing or non-integer + Attribut fehlt oder ist keine Zahl + + + Unsupported + Nicht unterstützt + + + Invalid + Ungültig + + + Duplicate + Duplikat + + + Missing + Fehlt + + + Too many child nodes for node type + Zu viele Elemente für dieses Tag + + + Incorrect _all view column sequence + Incorrect _all view column sequence + + + must be 0 or 1 + muss 0 oder 1 sein + + + must be an integer + muss eine Zahl sein + + + must be a non-negative integer + muss eine positive Zahl sein + + + must be a positive integer + muss eine positive Zahl sein + + + Duplicate element + Doppeltes Element + + + Missing data for column ID %1 + Fehlende Daten für Spalte %1 + + + diff --git a/preferences.cpp b/preferences.cpp index c9cee61..99968c6 100644 --- a/preferences.cpp +++ b/preferences.cpp @@ -159,6 +159,9 @@ void Preferences::addAppearanceTab(QTabWidget *tabs) #else sizeFactor = 1; #endif +#if !defined(Q_OS_MACX) + // on the Mac, the application font seems to revert to system default + // under a variety of conditions; no point in showing this QGroupBox *fontGroup = new QGroupBox(2, Qt::Horizontal, tr("Font"), appearanceTab); layout->addWidget(fontGroup); @@ -193,6 +196,7 @@ void Preferences::addAppearanceTab(QTabWidget *tabs) connect(fontSize, SIGNAL(activated(int)), this, SLOT(updateSample(int))); new QLabel(tr("Sample"), fontGroup); sample = new QLabel(tr("Sample text"), fontGroup); +#endif QGroupBox *colorGroup = new QGroupBox(2, Qt::Horizontal, tr("Row Colors"), appearanceTab); @@ -516,6 +520,7 @@ QFont Preferences::applyChanges() } conf.writeEntry("ToolbarButtons", buttons, ','); +#if !defined(Q_OS_MACX) conf.setGroup("Font"); QString name = fontName->currentText(); int size = sizes[fontSize->currentItem()] / sizeFactor; @@ -524,6 +529,9 @@ QFont Preferences::applyChanges() QFont font(name, size); qApp->setFont(font); return font; +#else + return font(); +#endif } void Preferences::applyDateTimeChanges() diff --git a/rowviewer.cpp b/rowviewer.cpp index 9493196..2ad70dc 100644 --- a/rowviewer.cpp +++ b/rowviewer.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "database.h" #include "datatypes.h" #include "menuactions.h" @@ -38,10 +39,18 @@ RowViewer::RowViewer(Database *dbase, ViewDisplay *parent, const char *name) vbox->addWidget(tv); QHBox *hbox = new QHBox(this); vbox->addWidget(hbox); +#if defined(Q_OS_MACX) + prevButton = new QToolButton(hbox); +#else prevButton = new QPushButton(hbox); +#endif prevButton->setPixmap(Resource::loadPixmap("back")); connect(prevButton, SIGNAL(clicked()), this, SLOT(previousRow())); +#if defined(Q_OS_MACX) + QToolButton *editButton = new QToolButton(hbox); +#else QPushButton *editButton = new QPushButton(hbox); +#endif editButton->setPixmap(Resource::loadPixmap("edit")); connect(editButton, SIGNAL(clicked()), this, SLOT(editRow())); @@ -53,10 +62,18 @@ RowViewer::RowViewer(Database *dbase, ViewDisplay *parent, const char *name) viewBox->insertStringList(viewNames); connect(viewBox, SIGNAL(activated(int)), this, SLOT(viewChanged(int))); +#if defined(Q_OS_MACX) + QToolButton *copyButton = new QToolButton(hbox); +#else QPushButton *copyButton = new QPushButton(hbox); +#endif copyButton->setPixmap(Resource::loadPixmap("copy")); connect(copyButton, SIGNAL(clicked()), this, SLOT(copyText())); +#if defined(Q_OS_MACX) + nextButton = new QToolButton(hbox); +#else nextButton = new QPushButton(hbox); +#endif nextButton->setPixmap(Resource::loadPixmap("forward")); connect(nextButton, SIGNAL(clicked()), this, SLOT(nextRow())); diff --git a/rowviewer.h b/rowviewer.h index c4a4333..7f40766 100644 --- a/rowviewer.h +++ b/rowviewer.h @@ -22,6 +22,7 @@ class QComboBox; class QKeyEvent; class QPushButton; class QTextView; +class QToolButton; class View; class ViewDisplay; @@ -55,8 +56,13 @@ private slots: QComboBox *viewBox; int index; int rowCount; +#if defined(Q_OS_MACX) + QToolButton *nextButton; + QToolButton *prevButton; +#else QPushButton *nextButton; QPushButton *prevButton; +#endif QTextView *tv; View *currentView; QStringList usedImageIds; diff --git a/sorteditor.cpp b/sorteditor.cpp index 60d18a9..84ec437 100644 --- a/sorteditor.cpp +++ b/sorteditor.cpp @@ -25,7 +25,7 @@ SortEditor::SortEditor(QWidget *parent, const char *name) { QHBox *hbox = new QHBox(this); vbox->addWidget(hbox); - new QLabel(tr("Sorting Name"), hbox); + new QLabel(tr("Sorting Name") + " ", hbox); nameBox = new QLineEdit(hbox); table = new QListView(this); diff --git a/vieweditor.cpp b/vieweditor.cpp index 4465c34..c817fd6 100644 --- a/vieweditor.cpp +++ b/vieweditor.cpp @@ -26,7 +26,7 @@ ViewEditor::ViewEditor(QWidget *parent, const char *name) { QHBox *hbox = new QHBox(this); vbox->addWidget(hbox); - new QLabel(tr("View Name"), hbox); + new QLabel(tr("View Name") + " ", hbox); nameBox = new QLineEdit(hbox); hbox = new QHBox(this);