summaryrefslogtreecommitdiffstats
path: root/kviewshell/pageSize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kviewshell/pageSize.cpp')
-rw-r--r--kviewshell/pageSize.cpp343
1 files changed, 343 insertions, 0 deletions
diff --git a/kviewshell/pageSize.cpp b/kviewshell/pageSize.cpp
new file mode 100644
index 00000000..f52f01a4
--- /dev/null
+++ b/kviewshell/pageSize.cpp
@@ -0,0 +1,343 @@
+// pageSize.cpp
+//
+// Part of KVIEWSHELL - A framework for multipage text/gfx viewers
+//
+// (C) 2002-2003 Stefan Kebekus
+// Distributed under the GPL
+
+// Add header files alphabetically
+
+#include <config.h>
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <math.h>
+#include <qstringlist.h>
+
+#include "pageSize.h"
+#include "units.h"
+
+struct pageSizeItem
+{
+ const char *name;
+ float width; // in mm
+ float height; // in mm
+ const char *preferredUnit;
+};
+
+#define defaultMetricPaperSize 4 // Default paper size is "DIN A4"
+#define defaultImperialPaperSize 8 // Default paper size is "US Letter"
+
+static pageSizeItem staticList[] = { {"DIN A0", 841.0, 1189.0, "mm"},
+ {"DIN A1", 594.0, 841.0, "mm"},
+ {"DIN A2", 420.0, 594.0, "mm"},
+ {"DIN A3", 297.0, 420.0, "mm"},
+ {"DIN A4", 210.0, 297.0, "mm"},
+ {"DIN A5", 148.5, 210.0, "mm"},
+ {"DIN B4", 250.0, 353.0, "mm"},
+ {"DIN B5", 176.0, 250.0, "mm"},
+ {"US Letter", 215.9, 279.4, "in"},
+ {"US Legal", 215.9, 355.6, "in"},
+ {0, 0.0, 0.0, 0} // marks the end of the list.
+};
+
+
+pageSize::pageSize()
+{
+ currentSize = defaultPageSize();
+ pageWidth.setLength_in_mm(staticList[currentSize].width);
+ pageHeight.setLength_in_mm(staticList[currentSize].height);
+}
+
+
+pageSize::pageSize(const SimplePageSize& s)
+{
+ pageWidth = s.width();
+ pageHeight = s.height();
+
+ rectifySizes();
+ reconstructCurrentSize();
+}
+
+
+bool pageSize::setPageSize(const QString& name)
+{
+ // See if we can recognize the string
+ QString currentName;
+ for(int i=0; staticList[i].name != 0; i++) {
+ currentName = staticList[i].name;
+ if (currentName == name) {
+ currentSize = i;
+ // Set page width/height accordingly
+ pageWidth.setLength_in_mm(staticList[currentSize].width);
+ pageHeight.setLength_in_mm(staticList[currentSize].height);
+ emit(sizeChanged(*this));
+ return true;
+ }
+ }
+
+ // Check if the string contains 'x'. If yes, we assume it is of type
+ // "<number>x<number>". If yes, the first number is interpreted as
+ // the width in mm, the second as the height in mm
+ if (name.find('x') >= 0) {
+ bool wok, hok;
+ float pageWidth_tmp = name.section('x',0,0).toFloat(&wok);
+ float pageHeight_tmp = name.section('x',1,1).toFloat(&hok);
+ if (wok && hok) {
+ pageWidth.setLength_in_mm(pageWidth_tmp);
+ pageHeight.setLength_in_mm(pageHeight_tmp);
+
+ rectifySizes();
+ reconstructCurrentSize();
+ emit(sizeChanged(*this));
+ return true;
+ }
+ }
+
+ // Check if the string contains ','. If yes, we assume it is of type
+ // "<number><unit>,<number><uni>". The first number is supposed to
+ // be the width, the second the height.
+ if (name.find(',') >= 0) {
+ bool wok, hok;
+ float pageWidth_tmp = distance::convertToMM(name.section(',',0,0), &wok);
+ float pageHeight_tmp = distance::convertToMM(name.section(',',1,1), &hok);
+ if (wok && hok) {
+ pageWidth.setLength_in_mm(pageWidth_tmp);
+ pageHeight.setLength_in_mm(pageHeight_tmp);
+
+ rectifySizes();
+ reconstructCurrentSize();
+ emit(sizeChanged(*this));
+ return true;
+ }
+ }
+
+ // Last resource. Set the default, in case the string is
+ // unintelligible to us.
+ currentSize = defaultPageSize();
+ pageWidth.setLength_in_mm(staticList[currentSize].width);
+ pageHeight.setLength_in_mm(staticList[currentSize].height);
+ kdError(1223) << "pageSize::setPageSize: could not parse '" << name << "'. Using " << staticList[currentSize].name << " as a default." << endl;
+ emit(sizeChanged(*this));
+ return false;
+}
+
+
+void pageSize::setPageSize(double width, double height)
+{
+ SimplePageSize oldPage = *this;
+
+ pageWidth.setLength_in_mm(width);
+ pageHeight.setLength_in_mm(height);
+
+ rectifySizes();
+ reconstructCurrentSize();
+ if ( !isNearlyEqual(oldPage))
+ emit(sizeChanged(*this));
+}
+
+
+void pageSize::setPageSize(const QString& width, const QString& _widthUnits, const QString& height, const QString& _heightUnits)
+{
+ SimplePageSize oldPage = *this;
+
+ double w = width.toFloat();
+ double h = height.toFloat();
+
+ QString widthUnits = _widthUnits;
+ if ((widthUnits != "cm") && (widthUnits != "mm") && (widthUnits != "in")) {
+ kdError(1223) << "Unrecognized page width unit '" << widthUnits << "'. Assuming mm" << endl;
+ widthUnits = "mm";
+ }
+ pageWidth.setLength_in_mm(w);
+ if (widthUnits == "cm")
+ pageWidth.setLength_in_cm(w);
+ if (widthUnits == "in")
+ pageWidth.setLength_in_inch(w);
+
+ QString heightUnits = _heightUnits;
+ if ((heightUnits != "cm") && (heightUnits != "mm") && (heightUnits != "in")) {
+ kdError(1223) << "Unrecognized page height unit '" << widthUnits << "'. Assuming mm" << endl;
+ heightUnits = "mm";
+ }
+ pageHeight.setLength_in_mm(h);
+ if (heightUnits == "cm")
+ pageHeight.setLength_in_cm(h);
+ if (heightUnits == "in")
+ pageHeight.setLength_in_inch(h);
+
+ rectifySizes();
+ reconstructCurrentSize();
+ if ( !isNearlyEqual(oldPage))
+ emit(sizeChanged(*this));
+}
+
+
+pageSize &pageSize::operator= (const pageSize &src)
+{
+ SimplePageSize oldPage = *this;
+
+ currentSize = src.currentSize;
+ pageWidth = src.pageWidth;
+ pageHeight = src.pageHeight;
+
+ if ( !isNearlyEqual(oldPage))
+ emit(sizeChanged(*this));
+ return *this;
+}
+
+
+void pageSize::rectifySizes()
+{
+ // Now do some sanity checks to make sure that values are not
+ // outrageous. We allow values between 5cm and 50cm.
+ if (pageWidth.getLength_in_mm() < 50)
+ pageWidth.setLength_in_mm(50.0);
+ if (pageWidth.getLength_in_mm() > 1200)
+ pageWidth.setLength_in_mm(1200);
+ if (pageHeight.getLength_in_mm() < 50)
+ pageHeight.setLength_in_mm(50);
+ if (pageHeight.getLength_in_mm() > 1200)
+ pageHeight.setLength_in_mm(1200);
+ return;
+}
+
+
+QString pageSize::preferredUnit() const
+{
+ if (currentSize >= 0)
+ return staticList[currentSize].preferredUnit;
+
+ // User-defined size. Give a preferred unit depening on the locale.
+ if (KGlobal::locale()-> measureSystem() == KLocale::Metric)
+ return "mm";
+ else
+ return "in";
+}
+
+
+QString pageSize::widthString(const QString& unit) const
+{
+ QString answer = "--";
+
+ if (unit == "cm")
+ answer.setNum(pageWidth.getLength_in_cm());
+ if (unit == "mm")
+ answer.setNum(pageWidth.getLength_in_mm());
+ if (unit == "in")
+ answer.setNum(pageWidth.getLength_in_inch());
+
+ return answer;
+}
+
+
+QString pageSize::heightString(const QString& unit) const
+{
+ QString answer = "--";
+
+ if (unit == "cm")
+ answer.setNum(pageHeight.getLength_in_cm());
+ if (unit == "mm")
+ answer.setNum(pageHeight.getLength_in_mm());
+ if (unit == "in")
+ answer.setNum(pageHeight.getLength_in_inch());
+
+ return answer;
+}
+
+
+QStringList pageSize::pageSizeNames()
+{
+ QStringList names;
+
+ for(int i=0; staticList[i].name != 0; i++)
+ names << staticList[i].name;
+
+ return names;
+}
+
+
+QString pageSize::formatName() const
+{
+ if (currentSize >= 0)
+ return staticList[currentSize].name;
+ else
+ return QString::null;
+}
+
+
+int pageSize::getOrientation() const
+{
+ if (currentSize == -1) {
+ kdError(1223) << "pageSize::getOrientation: getOrientation called for page format that does not have a name." << endl;
+ return 0;
+ }
+
+ if (pageWidth.getLength_in_mm() == staticList[currentSize].width)
+ return 0;
+ else
+ return 1;
+}
+
+
+void pageSize::setOrientation(int orient)
+{
+ if (currentSize == -1) {
+ kdError(1223) << "pageSize::setOrientation: setOrientation called for page format that does not have a name." << endl;
+ return;
+ }
+
+ if (orient == 1) {
+ pageWidth.setLength_in_mm(staticList[currentSize].height);
+ pageHeight.setLength_in_mm(staticList[currentSize].width);
+ } else {
+ pageWidth.setLength_in_mm(staticList[currentSize].width);
+ pageHeight.setLength_in_mm(staticList[currentSize].height);
+ }
+ emit(sizeChanged(*this));
+}
+
+
+QString pageSize::serialize() const
+{
+ if ((currentSize >= 0) && (fabs(staticList[currentSize].height-pageHeight.getLength_in_mm()) <= 0.5))
+ return staticList[currentSize].name;
+ else
+ return QString("%1x%2").arg(pageWidth.getLength_in_mm()).arg(pageHeight.getLength_in_mm());
+}
+
+
+void pageSize::reconstructCurrentSize()
+{
+ for(int i=0; staticList[i].name != 0; i++) {
+ if ((fabs(staticList[i].width - pageWidth.getLength_in_mm()) <= 2) && (fabs(staticList[i].height - pageHeight.getLength_in_mm()) <= 2)) {
+ currentSize = i;
+ pageWidth.setLength_in_mm(staticList[currentSize].width);
+ pageHeight.setLength_in_mm(staticList[currentSize].height);
+ return;
+ }
+ if ((fabs(staticList[i].height - pageWidth.getLength_in_mm()) <= 2) && (fabs(staticList[i].width - pageHeight.getLength_in_mm()) <= 2)) {
+ currentSize = i;
+ pageWidth.setLength_in_mm(staticList[currentSize].height);
+ pageHeight.setLength_in_mm(staticList[currentSize].width);
+ return;
+ }
+ }
+ currentSize = -1;
+ return;
+}
+
+int pageSize::defaultPageSize()
+{
+ // FIXME: static_cast<QPrinter::PageSize>(KGlobal::locale()->pageSize())
+ // is the proper solution here. Then you can determine the values
+ // without using your hardcoded table too!
+ if (KGlobal::locale()-> measureSystem() == KLocale::Metric)
+ return defaultMetricPaperSize;
+ else
+ return defaultImperialPaperSize;
+}
+
+#include "pageSize.moc"
+