--- /dev/null
+/* FreeNote for Sharp SLA300, B500, C7x0, C860 Linux PDA\r
+ Copyright (C) 2003-2005 Joe Kanemori.<kanemori@ymg.urban.ne.jp>\r
+\r
+ This program is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ This program is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with this program; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+*/\r
+/*\r
+2005/06/04 FreeNote 1.11.12pre\r
+\81E\83O\83\8a\83b\83h\82Ì\98g\90ü\82ð\8eÀ\8dÛ\82Ì\91I\91ð\94Í\88Í\82æ\82è\82à\91å\82«\82\95\\8e¦\82·\82é\82æ\82¤\82É\95Ï\8dX\81B\r
+\81E\94Í\88Í\91I\91ð\81A\83O\83\8a\83b\83h\81A\83K\83C\83h\81A\8cr\90ü\83J\83\89\81[\82Ì\83J\83X\83^\83}\83C\83Y\82ð\89Â\94\\82É\81B\r
+\81E\83J\83\89\81[\83s\83b\83J\81[\83\82\81[\83h\82Ì\92Ç\89Á\r
+\r
+2005/06/02 FreeNote 1.11.11Apre\r
+\81E\83e\83L\83X\83g\88Ú\93®\98g\82Ì\95s\8bï\8d\87\8fC\90³\r
+\81E\8cr\90ü\82ð\83O\83\8a\83b\83h\82Ì\82Q\94{\82Å\95\\8e¦\82·\82é\82æ\82¤\82É\95Ï\8dX\r
+\81E\8fÁ\82µ\83S\83\80\8e\9e\82Ì\94Í\88Í\8ew\92è\8e\9e\82É\81A\83y\83\93\83I\83t\82µ\82Ä\83\8f\83\93\83e\83\93\83|\82¨\82¢\82Ä\82©\82ç\94Í\88Í\8am\92è\82·\82é\82æ\82¤\82É\95Ï\8dX\r
+\r
+2005/03/18 FreeNote 1.11.10Bpre\r
+\81E\95`\89æ\82Ì\8dÅ\93K\89»\r
+\r
+2005/02/27 FreeNote 1.11.10pre\r
+\81EPDF\82Ì\8fo\97Í\8c`\8e®\82ð\88ê\95\94\95Ï\8dX\r
+\81E\83C\83\93\83|\81[\83g\8e\9e\82Ì\83o\83Ofix\r
+\r
+2005/01/04 FreeNote 1.11.6pre\r
+\81E\83J\81[\83u\83\82\81[\83h\82Å\82W\82Ì\8e\9a\82ª\82©\82¯\82é\82æ\82¤\82É\90®\8c`\83G\83\93\83W\83\93\82ð\89ü\91P\r
+\r
+2005/01/04 FreeNote 1.11.5Apre\r
+\81E\83o\83O\83t\83B\83b\83N\83X\r
+\r
+2004/12/25 FreeNote 1.11.5pre\r
+\81E\83\8c\83C\83\84\81[\8b@\94\\92Ç\89Á\r
+\r
+2004/11/24 FreeNote 1.11.0pre\r
+\81E\83e\83L\83X\83g\83y\81[\83X\83g\8b@\94\\r
+\r
+2004/10/17 FreeNote 1.10.0\83\8a\83\8a\81[\83X\r
+2004/08/26 ver 1.9.3pre\r
+\81E\8cr\90ü\8b@\94\\82ð\92Ç\89Á\r
+\r
+2004/05/23 ver 1.9.1Apre\r
+\81E\89¢\95¶\8aÂ\8b«\91Î\89\9e\r
+\r
+2004/02/16 ver 1.7.3pre\r
+\81E\95Ò\8fW\8b@\94\\8b\89»\r
+\r
+2004/02/14 ver 1.7.2pre\r
+\81E\8c\9f\8dõ\8b@\94\\92Ç\89Á\r
+\r
+2004/02/12 ver 1.7.1pre\r
+\81E\83t\83H\83\93\83g\8ed\97l\82Ì\95Ï\8dX\r
+\81E\83e\83L\83X\83g\8f\88\97\9d\82Ì\8d\82\91¬\89»\r
+\81E\83e\83L\83X\83g\83{\83b\83N\83X\82Ì\91½\8b@\94\\89»\r
+\r
+2003/02/10 ver 1.7.0pre\r
+\81E\95¶\8e\9a\93ü\97Í\r
+\r
+2003/12/23 ver 1.6.1\r
+\81E\95Û\91¶\8fî\95ñ\82Ì\83T\83C\83Y\8fk\8f¬\r
+\r
+2003/12/16-19 ver 1.5.5pre\r
+\81E\83y\83\93\83T\83C\83Y\82Ì\92Ç\89Á(1-8)\r
+\81E\83A\83\93\83h\83D\81E\83\8a\83h\83D\82Ì\8eÀ\91\95\r
+\r
+2003/12/14 ver 1.5.4pre\r
+\81E\83y\83\93\83T\83C\83Y\82ð\91I\91ð\89Â\94\\82É\81B\r
+\r
+2003/12/05 ver 1.5.3Apre\r
+\81E\83O\83\8a\83b\83h\82Ì\90F\82ð\8fC\90³\r
+\r
+2003/12/04 ver 1.5.3pre\r
+\81E\83O\83\8a\83b\83h\82Ì\95`\89æ\82ð\88ê\95\94\8fC\90³\r
+\r
+2003/11/10 ver 1.5.1pre\r
+\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á\r
+\r
+2003/11/09 ver 1.5.0pre\r
+\81E\8e©\93®\90®\8c`\83\82\81[\83h\92Ç\89Á\r
+\r
+2003/09/03 ver 1.3.4pre\r
+\81EUse all quadrant OFF\8e\9e\82É\95\\8e¦\88Ê\92u\82ª\83\8a\83Z\83b\83g\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\83o\83O\91Î\89\9e\81B\r
+\r
+2003/09/01-03 ver 1.3.3pre\r
+\81E\83X\83N\83\8d\81[\83\8b\82Ì\89ü\97Ç\r
+\81EUse all quadrant(\91S\8fÛ\8cÀ\82ð\8eg\97p\82·\82é)\83\81\83j\83\85\81[\82ð\92Ç\89Á\r
+\r
+2003/08/31 FreeNote 1.3.2pre\r
+\81E\91S\95û\8cü\83X\83N\83\8d\81[\83\8b\r
+\r
+2003/08/23 FreeNote 1.3.0pre\r
+\81ECR\93®\8dì\82Ì\8fC\90³\r
+\r
+2003/08/15 FreeNote 1.2.1\82ð\8cö\8aJ\r
+\81E\95Û\91¶\8e\9e\82Ì\83o\83O\8fC\90³\r
+\81E\8a®\97¹\83_\83C\83A\83\8d\83O\82Ì\8e©\93®\8fÁ\8b\8e\r
+\81EPNG\83t\83@\83C\83\8b\82Ö\82Ì\8fo\97Í\r
+\r
+2003/08/15 FreeNote 1.2\82ð\8cö\8aJ\r
+\81E\83I\83v\83V\83\87\83\93\92Ç\89Á\r
+\81E\83X\83N\83\8d\81[\83\8b\83K\83C\83h\r
+\81EFree\83t\83@\83C\83\8b\8aÖ\98A\95t\82¯\r
+\81E\83A\83C\83R\83\93\82Ì\95Ï\8dX\r
+\r
+2003/08/05 FreeNote 1.1.1pre\82ð\8cö\8aJ\r
+\81E\8d\82\91¬\8bN\93®\8e\9e\82É\95Â\82¶\82½\8fó\91Ô\82ð\95Û\8e\9d\r
+\81E\95`\89æ\83\82\81[\83h\90Ø\91Ö\82¦\8e\9e\82É\8fÁ\82µ\83S\83\80\95\\8e¦\r
+\81E\95Û\91¶\8e\9e\8aÔ\92Z\8fk\r
+\81EView\83\82\81[\83h\82Ì\8b\93\93®\82ð\95Ï\8dX\r
+\81E\83\81\83j\83\85\81[\82Ì\8c©\82½\96Ú\82ð\95Ï\8dX\r
+*/\r
+#include "fncanvas.h"\r
+#include <qsjiscodec.h> \r
+#include <stdio.h>\r
+#include <qfile.h>\r
+#include <qmessagebox.h>\r
+#include <qtextstream.h>\r
+#include <qpen.h>\r
+#include <qcolor.h>\r
+#include <qpoint.h>\r
+#include <qthread.h>\r
+#include <qimage.h>\r
+#include <math.h>\r
+#include <qtextcodec.h>\r
+#include <qmultilineedit.h>\r
+#include <qbitmap.h>\r
+#include "fnmessagebox.h"\r
+#include "fmtengine.h"\r
+#include "fntextdialog.h"\r
+#include <qfont.h>\r
+#include <qapplication.h>\r
+#include <qclipboard.h>\r
+#include "frmmain.h"\r
+#include "fnlayerdlg.h"\r
+#include <stdlib.h>\r
+\r
+int snap(int v) {\r
+ int tv = abs(v);\r
+ tv = ((int)(tv + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;\r
+ if (0 > v) {\r
+ return -tv;\r
+ } else {\r
+ return tv;\r
+ }\r
+}\r
+\r
+FNCanvas::FNCanvas(FNColorDialog* dlg, QWidget* parent, const char* name, WFlags f)\r
+ :QWidget(parent, name, f),\r
+ _txtTmp(NULL),\r
+ _pen(black, 1, SolidLine, RoundCap, RoundJoin), \r
+ _asMode(AS_NONE),\r
+ _drawMode(MODE_DRAW),\r
+ _prevMode(MODE_DRAW),\r
+ _eraser_l(50),\r
+ _eraser_s(10),\r
+ _h_step(100),\r
+ _v_step(100),\r
+ _margin(5),\r
+ _scrollTiming(800),\r
+ _selIdx(0),\r
+ _viewMode(false),\r
+ _isWaiting(false),\r
+ _isDragging(false),\r
+ _isDrawing(false),\r
+ _isHeadingEnables(false),\r
+ _isShowGuide(false),\r
+ _isUseAllQuadrant(false),\r
+ _showRuler(false),\r
+ _isTinyPaging(false),\r
+ _scale_x(1.0),\r
+ _scale_y(1.0),\r
+ _tboxRect(0, 50, 220, 240),\r
+ _isEraseWaiting(false),\r
+ _colorSelector(dlg),\r
+ _isColorRevision(true)\r
+{\r
+ _tracks.setAutoDelete(true);\r
+ _clipboard.setAutoDelete(true);\r
+ _current = new FNLayer();\r
+ _layers.append(_current);\r
+ _layers.setAutoDelete(true);\r
+ _undobuf.setAutoDelete(true);\r
+ _current->Name = "Layer0";\r
+ this->setBackgroundMode(NoBackground);\r
+ _timer = new QTimer(this);\r
+ connect(_timer, SIGNAL(timeout()), this, SLOT(autoScroll()));\r
+ _dlgFind = new FNFindDialog(this, "Find");\r
+ connect(_dlgFind, SIGNAL(originChanged(int, int)), this, SLOT(setOrigin(int, int)));\r
+ connect(_dlgFind, SIGNAL(resetOrigin()), this, SLOT(resetOrigin()));\r
+ \r
+}\r
+\r
+FNCanvas::~FNCanvas()\r
+{\r
+ _timer->stop();\r
+ delete _timer;\r
+\r
+ _tracks.clear();\r
+ _layers.clear();\r
+ //clearList(_draws);\r
+ \r
+ delete _dlgFind;\r
+}\r
+\r
+\r
+void FNCanvas::addLayer()\r
+{\r
+ FNLayer* layer = new FNLayer();\r
+ _current=layer;\r
+ uint cnt = _layers.count();\r
+ while (1) {\r
+ QString name = "Layer";\r
+ name += QString::number(cnt);\r
+\r
+ bool nameExists = false;\r
+ for (uint i = 0; i < _layers.count(); ++i) {\r
+ if (_layers.at(i)->Name == name) {\r
+ nameExists = true;\r
+ break;\r
+ }\r
+ }\r
+ if (false == nameExists) {\r
+ layer->Name = name;\r
+ break;\r
+ }\r
+ ++cnt;\r
+ }\r
+ _layers.append(layer);\r
+ _selIdx = _layers.count() - 1;\r
+ redraw();\r
+ \r
+}\r
+\r
+//\95\\8e¦\83\8c\83C\83\84\81[\82ð\89º\82É\88Ú\93®\82·\82é\r
+void FNCanvas::moveAboveLayer()\r
+{\r
+ --_selIdx;\r
+ if (0 > _selIdx) {\r
+ _selIdx = 0;\r
+ }\r
+ _current = _layers.at(_selIdx);\r
+ redraw();\r
+}\r
+\r
+//\95\\8e¦\83\8c\83C\83\84\81[\82ð\8fã\82É\88Ú\93®\82·\82é\r
+void FNCanvas::moveBelowLayer()\r
+{\r
+ ++_selIdx;\r
+ if (_layers.count() - 1 <= (uint)_selIdx) {\r
+ _selIdx = _layers.count() - 1;\r
+ }\r
+ _current = _layers.at(_selIdx);\r
+ redraw();\r
+}\r
+\r
+\r
+void FNCanvas::setScrollTiming(int v)\r
+{\r
+ _scrollTiming = v;\r
+}\r
+\r
+\r
+void FNCanvas::setVStep(int v)\r
+{\r
+ _v_step = v;\r
+}\r
+\r
+void FNCanvas::setHStep(int v)\r
+{\r
+ _h_step = v;\r
+}\r
+\r
+void FNCanvas::setSEraser(int v)\r
+{\r
+ _eraser_s = v;\r
+}\r
+\r
+void FNCanvas::setLEraser(int v)\r
+{\r
+ _eraser_l = v;\r
+}\r
+\r
+\r
+void FNCanvas::setMargin(int v)\r
+{\r
+ if (v < 3) {\r
+ v = 3;\r
+ }\r
+ _margin = v;\r
+}\r
+void FNCanvas::find()\r
+{\r
+ if (_viewMode) {\r
+ return;\r
+ }\r
+ _dlgFind->setElements(_layers);\r
+ _dlgFind->show();\r
+ _dlgFind->exec();\r
+}\r
+\r
+void FNCanvas::setScrollMode(int as)\r
+{\r
+ _asMode = as;\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::autoScroll()\r
+{\r
+ if (MODE_ERASE == _drawMode) {\r
+ if (0 < _selection.width()) {\r
+ int hsn = SNAP_SIZE / 2;\r
+ int qsn = hsn / 2;\r
+ int x = ((_selection.x() - qsn) / hsn) * hsn;\r
+ int y = ((_selection.y() - qsn) / hsn) * hsn;\r
+ int dx = _selection.x() - x;\r
+ int dy = _selection.y() - y;\r
+ int w = ((_selection.width() + dx + hsn) / hsn) * hsn;\r
+ int h = ((_selection.height() + dy + hsn) / hsn) * hsn;\r
+ _selection.setRect(x, y, w, h);\r
+ _isSelected = true;\r
+ }\r
+ _last = QPoint(-1, -1);\r
+ _tracks.clear();\r
+ _isHeadingEnables = false;\r
+ _isEraseWaiting = false;\r
+ redraw();\r
+ } else {\r
+ if (AS_NONE == _asMode) {\r
+ setOrigin(_origin.x(), _origin.y(), false);\r
+ redraw();\r
+ return;\r
+ }\r
+ bool tmp = _isHeadingEnables;\r
+ int dx = 0;\r
+ int dy = 0;\r
+ if (AS_BOTH == _asMode || AS_HORIZONTAL == _asMode) {\r
+ if (_last.x() > width() * (_margin - 1) / _margin) {\r
+ dx = _h_step;\r
+ } else if (_last.x() < width() / _margin) {\r
+ dx = -_h_step;\r
+ }\r
+ }\r
+ if (AS_BOTH == _asMode || AS_VERTICAL == _asMode) {\r
+ if (_last.y() > height() * (_margin - 1) / _margin) {\r
+ dy = _v_step;\r
+ } else if (_last.y() < height() / _margin) {\r
+ dy = -_v_step;\r
+ }\r
+ }\r
+ setOrigin(_origin.x() + dx, _origin.y() + dy, false);\r
+ _isHeadingEnables = tmp;\r
+ redraw();\r
+ }\r
+}\r
+\r
+void FNCanvas::drawRect(QPainter& pa, const QRect& r)\r
+{\r
+ int w = width();\r
+ int h = height();\r
+ int sx = r.left();\r
+ int sy = r.top();\r
+ int ex = r.right();\r
+ int ey = r.bottom();\r
+ if (0 > sx) {\r
+ sx = 0;\r
+ }\r
+ if (0 > sy) {\r
+ sy = 0;\r
+ }\r
+ if (h < ey) {\r
+ ey = h;\r
+ }\r
+ if (w < ex) {\r
+ ex = w;\r
+ }\r
+ if (0 <= r.left()) {\r
+ pa.drawLine(sx, sy, sx, ey);\r
+ }\r
+ if (0 <= r.top()) {\r
+ pa.drawLine(sx, sy, ex, sy);\r
+ }\r
+ if (w >= r.right()) {\r
+ pa.drawLine(ex, sy, ex, ey);\r
+ }\r
+ if (h >= r.bottom()) {\r
+ pa.drawLine(sx, ey, ex, ey);\r
+ }\r
+}\r
+\r
+void FNCanvas::mousePressEvent(QMouseEvent* evt)\r
+{\r
+ if (!_current->IsShow) {\r
+ return;\r
+ }\r
+ setFocus();\r
+ _timer->stop();\r
+ _tracks.clear();\r
+ _txtwait = 10;\r
+ if (_viewMode) {\r
+ _isWaiting = true;\r
+ _viewMode = false;\r
+ setOrigin((int)((evt->x()) / _scale_x) - width() / 2, (int)((evt->y()) / _scale_y) - height() / 2, false);\r
+ //redraw();\r
+ emit resetViewMode();\r
+ } else if (MODE_CPICK == _drawMode) {\r
+ QRgb c = _buffer.convertToImage().pixel(evt->pos().x(), evt->pos().y());\r
+ emit pickColor(c);\r
+ return;\r
+ } else if (MODE_TEXT == _drawMode) {\r
+ _txtTmp = NULL;\r
+// _last = evt->pos();\r
+ _last = SnapPoint(evt->pos(), SNAP_SIZE / 4);\r
+ int x = _last.x();\r
+ int y = _last.y();\r
+ for (int i = _current->draws.count() - _current->disp_offset() - 1; i >= 0; --i) {\r
+ FNPolygon* p = _current->draws.at((uint)i);\r
+ if (FN_TEXT == p->type()) {\r
+ QRect r = p->boundingRect();\r
+ if (r.contains(x, y)) {\r
+ _txtTmp = (FNText*)p;\r
+ _selection.setRect(0, 0, -1, -1);\r
+ _tdx = _last.x() - r.x();\r
+ _tdy = _last.y() - r.y();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ } else if (MODE_ERASE == _drawMode) {\r
+ if (_isEraseWaiting) {\r
+ return;\r
+ }\r
+ _last = evt->pos();\r
+ \r
+ if (0 >= _selection.width() || !_selection.contains(_last)) {\r
+ _isSelected = false;\r
+ }\r
+ if (!_isSelected) {\r
+ _selection = QRect(0, 0, -1, -1);\r
+ _selected.clear();\r
+ redraw();\r
+\r
+ int w = _eraser_s;\r
+ if (PENWIDTH_MAX / 2 < _pen.width()) {\r
+ w = _eraser_l;\r
+ }\r
+ // \91å\83o\83O\91Î\8dô\81F\r
+ // 0 > x\82Ì\8dÀ\95W\82É\81A\8fc150\88Ê\82Ì\8el\8ap\8c`\82ð\8f\91\82\82Æ\81AC\8cn\83U\83E\82Ì\83p\83t\83H\81[\83}\83\93\83X\82ª\8c\83\97\8e\82¿\82µ\82Ü\82·\81B\r
+ // \88È\8d~\93¯\97l\82Ì\83\8d\83W\83b\83N\82Í\82±\82Ì\91Î\8dô\82Ì\82½\82ß\82Å\82·\81B\r
+ QPainter pwin;\r
+ pwin.begin(this);\r
+ pwin.setRasterOp(XorROP);\r
+ pwin.setPen(QPen(white, 1));\r
+ _preRect.setRect(_last.x() - w / 2, _last.y() - w / 2, w, w);\r
+ drawRect(pwin, _preRect);\r
+ pwin.flush();\r
+ pwin.end();\r
+ _selection = QRect(0, 0, -1, -1);\r
+ _selected.clear();\r
+ } else {\r
+ QPainter pwin;\r
+ pwin.begin(this);\r
+\r
+ pwin.setRasterOp(XorROP);\r
+ pwin.setPen(QPen(white, 1));\r
+ _preRect.setRect(_selection.x(), _selection.y(), _selection.width(), _selection.height());\r
+ drawRect(pwin, _preRect);\r
+\r
+ pwin.flush();\r
+ pwin.end();\r
+ QPoint t = SnapPoint(QPoint(_selection.x(), _selection.y()));\r
+ _last = SnapPoint(_last);\r
+\r
+ _tdx = _last.x() - t.x();\r
+ _tdy = _last.y() - t.y();\r
+ }\r
+ } else {\r
+ _last = evt->pos();\r
+ _tracks.append(new QPoint(_last));\r
+ }\r
+ _isDragging = true;\r
+}\r
+\r
+void FNCanvas::mouseMoveEvent(QMouseEvent* evt)\r
+{\r
+ if (!_current->IsShow) {\r
+ return;\r
+ }\r
+ if (_isWaiting) {\r
+ return;\r
+ }\r
+ if (MODE_TEXT == _drawMode) {\r
+ if (NULL == _txtTmp) {\r
+ return;\r
+ }\r
+ if (0 < _txtwait) {\r
+ --_txtwait;\r
+ return;\r
+ }\r
+ QPainter pwin;\r
+ pwin.begin(this);\r
+ if (-1 != _selection.width()) {\r
+ pwin.setRasterOp(XorROP);\r
+ pwin.setPen(QPen(white, 1));\r
+ drawRect(pwin, _selection);\r
+ } else {\r
+ _selection = _txtTmp->boundingRect();\r
+ }\r
+ QPoint tmp = SnapPoint(evt->pos(), SNAP_SIZE / 4);\r
+ tmp.setX(tmp.x() - _tdx);\r
+ tmp.setY(tmp.y() - _tdy);\r
+ if (tmp != _last) {\r
+ _selection.moveTopLeft(tmp);\r
+ _last = tmp;\r
+ }\r
+ drawRect(pwin, _selection);\r
+ pwin.flush();\r
+ pwin.end();\r
+ } else if (MODE_CPICK == _drawMode) {\r
+ QRgb c = _buffer.convertToImage().pixel(evt->pos().x(), evt->pos().y());\r
+ emit pickColor(c);\r
+ return;\r
+ } else if (MODE_ERASE == _drawMode) {\r
+ //redraw();\r
+ if (_last.x() == -1) {\r
+ return;\r
+ }\r
+ if (!_isSelected) {\r
+ int w = _eraser_s;\r
+ if (PENWIDTH_MAX / 2 < _pen.width()) {\r
+ w = _eraser_l;\r
+ }\r
+ QPainter pwin;\r
+ pwin.begin(this);\r
+\r
+ pwin.setRasterOp(XorROP);\r
+ pwin.setPen(QPen(white, 1));\r
+ drawRect(pwin, _preRect);\r
+\r
+ _last = evt->pos();\r
+\r
+ _preRect.setRect(_last.x() - w / 2, _last.y() - w / 2, w, w);\r
+ pwin.setRasterOp(CopyROP);\r
+ QRect r = QRect(0, 0, width(), height());\r
+ for (uint i = 0; i < _current->draws.count() - _current->disp_offset(); ++i) {\r
+ FNPolygon* p = _current->draws.at(i);\r
+ QRect bounds = p->boundingRect();\r
+ if (r.intersects(bounds)) {\r
+ bool f = false;\r
+ QRect& selected = _preRect;\r
+ for (uint j = 0; j < p->points().count(); ++j) {\r
+ QPoint& pts = p->points().at(j);\r
+ if (selected.contains(pts)) {\r
+ f = true;\r
+ if (-1 == _selection.width()) {\r
+ _selection = bounds;\r
+ } else {\r
+ if (bounds.x() < _selection.x()) {\r
+ _selection.setX(bounds.x());\r
+ }\r
+ if (bounds.y() < _selection.y()) {\r
+ _selection.setY(bounds.y());\r
+ }\r
+ if (bounds.right() > _selection.right()) {\r
+ _selection.setRight(bounds.right());\r
+ }\r
+ if (bounds.bottom() > _selection.bottom()) {\r
+ _selection.setBottom(bounds.bottom());\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if (f) {\r
+ if (0 == _selected.contains(p)) {\r
+ _selected.append(p);\r
+ }\r
+ p->drawShape(pwin, f);\r
+ }\r
+ }\r
+ }\r
+ pwin.setRasterOp(XorROP);\r
+ pwin.setPen(QPen(white, 1));\r
+ drawRect(pwin, _preRect);\r
+ pwin.flush();\r
+ pwin.end();\r
+ } else {\r
+ if (0 >= _selection.width()) {\r
+ return;\r
+ }\r
+ //\91I\91ð\92\86(\88Ú\93®\8f\88\97\9d)\r
+ QPainter pwin;\r
+ pwin.begin(this);\r
+ pwin.setRasterOp(XorROP);\r
+ pwin.setPen(QPen(white, 1));\r
+ drawRect(pwin, _preRect);\r
+ _last = SnapPoint(evt->pos(), SNAP_SIZE / 4);\r
+ _preRect.setRect(_last.x() - _tdx, _last.y() - _tdy, _selection.width(), _selection.height());\r
+ drawRect(pwin, _preRect);\r
+ pwin.flush();\r
+ pwin.end();\r
+ }\r
+ } else {\r
+ QPainter pwin;\r
+ pwin.begin(this);\r
+ pwin.setPen(_pen);\r
+\r
+ pwin.drawLine(_last, evt->pos());\r
+ pwin.flush();\r
+\r
+ pwin.end();\r
+ _last = evt->pos();\r
+ _tracks.append(new QPoint(_last));\r
+ }\r
+}\r
+\r
+void FNCanvas::mouseReleaseEvent(QMouseEvent* evt)\r
+{\r
+ if (!_current->IsShow) {\r
+ return;\r
+ }\r
+ _isDragging = false;\r
+ if (_isWaiting) {\r
+ _isWaiting = false;\r
+ return;\r
+ }\r
+ if (MODE_ERASE == _drawMode) {\r
+ if (_isSelected) {\r
+ //_last\82Ö\88Ú\93®\r
+ _last = SnapPoint(evt->pos(), SNAP_SIZE / 4);\r
+ int dx = _last.x() - _tdx - _selection.x();\r
+ int dy = _last.y() - _tdy - _selection.y();\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ FNPolygon* p = _selected.at(i);\r
+ p->translate(dx, dy);\r
+ }\r
+ _selection.moveBy(dx, dy);\r
+ redraw();\r
+ } else {\r
+ if (false == _isEraseWaiting) {\r
+ _isEraseWaiting = true;\r
+ }\r
+ redraw();\r
+ _timer->start(_scrollTiming, true);\r
+ }\r
+ } else if (MODE_CPICK == _drawMode) {\r
+ QRgb c = _buffer.convertToImage().pixel(evt->pos().x(), evt->pos().y());\r
+ emit pickColor(c);\r
+ emit changeMode(_prevMode);\r
+ return;\r
+ } else {\r
+ if (1 < _tracks.count()) {\r
+ _last = evt->pos();\r
+ FNPolygon* p = NULL;\r
+ if (MODE_FORMAT == _drawMode) {\r
+ p = new FNPolygon(_pen);\r
+ _tracks = AutoFormat(_tracks);\r
+ } else if (MODE_CURVE == _drawMode) {\r
+ QPoint sp = SnapPoint(*_tracks.at(0));\r
+ QPoint ep = SnapPoint(*_tracks.at(_tracks.count()-1));\r
+ FNPointList tracks;\r
+ tracks.setAutoDelete(true);\r
+ for (uint i = 0; i < _tracks.count(); ++i) {\r
+ QPoint t = *_tracks.at(i);\r
+ tracks.append(new QPoint(t.x(), t.y()));\r
+ }\r
+ _tracks = AutoCurve(_tracks);\r
+ bool isEllipse = false;\r
+ if (sp == ep) {\r
+ if (0 < _tracks.count()) {\r
+ int vdconv = 0; //\8fc\95û\8cü\93]\8a·\r
+ int vdir = 0;\r
+ int svdir = 0;\r
+ \r
+ int hdconv = 0; //\89¡\95û\8cü\93]\8a·\r
+ int hdir = 0;\r
+ int shdir = 0;\r
+ QPoint* st = _tracks.at(0);\r
+ QPoint* l = st;\r
+ for (uint i = 1; i < _tracks.count(); ++i) {\r
+ QPoint* p = _tracks.at(i);\r
+ int thdir = sign(p->x() - l->x());\r
+ if (l->x() != p->x()) {\r
+ //\90\85\95½\95û\8cü\93]\8a·\r
+ if (0 != thdir) {\r
+ if (0 == hdir) {\r
+ shdir = thdir;\r
+ } else if (thdir != hdir) {\r
+ ++hdconv;\r
+ }\r
+ hdir = thdir;\r
+ }\r
+ }\r
+ int tvdir = sign(p->y() - l->y());\r
+ if (l->y() != p->y()) {\r
+ //\90\82\92¼\95û\8cü\93]\8a·\r
+ if (0 != tvdir) {\r
+ if (0 == vdir) {\r
+ svdir = tvdir;\r
+ } else if (tvdir != vdir) {\r
+ ++vdconv;\r
+ }\r
+ vdir = tvdir;\r
+ }\r
+ }\r
+ l = p;\r
+ }\r
+ if (shdir == hdir) {\r
+ --hdconv;\r
+ }\r
+ if (svdir == vdir) {\r
+ --vdconv;\r
+ }\r
+\r
+ if (1 >= hdconv && 1 >= vdconv) {\r
+ isEllipse = true;\r
+ int dircnt = 0;\r
+ //\82à\82¤\82P\94»\92è\r
+ tracks = AutoFormat(tracks);\r
+ if (2 < tracks.count()) {\r
+ int phdir = sign(tracks.at(1)->x() - tracks.at(0)->x());\r
+ int pvdir = sign(tracks.at(1)->y() - tracks.at(0)->y());\r
+ l = tracks.at(1);\r
+ for (uint i = 2; i < tracks.count(); ++i) {\r
+ QPoint* p = tracks.at(i);\r
+ int thdir = sign(p->x() - l->x());\r
+ int tvdir = sign(p->y() - l->y());\r
+ if ((0 == pvdir && 0 != tvdir && 0 != phdir && 0 == thdir) ||\r
+ (0 != pvdir && 0 == tvdir && 0 == phdir && 0 != thdir))\r
+ {\r
+ if (3 < dircnt) {\r
+ isEllipse = false;\r
+ break;\r
+ }\r
+ ++dircnt;\r
+ }\r
+ l = p;\r
+ phdir = thdir;\r
+ pvdir = tvdir;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (isEllipse) {\r
+ QRect r = GetBounds(_tracks);\r
+ _tracks.clear();\r
+ sp = SnapPoint(QPoint(r.x(), r.y()));\r
+ ep = SnapPoint(QPoint(r.x() + r.width(), r.y() + r.height()));\r
+ _tracks.append(new QPoint(sp.x(), sp.y()));\r
+ _tracks.append(new QPoint(ep.x(), ep.y()));\r
+ p = new FNEllipse(_pen);\r
+ } else if (2 < _tracks.count()) {\r
+ p = new FNBezier(_pen);\r
+ } else {\r
+ p = new FNPolygon(_pen);\r
+ }\r
+ } else if (MODE_SMOOTH == _drawMode) {\r
+ _tracks = Smoothing(_tracks);\r
+ if (2 < _tracks.count()) {\r
+ p = new FNBezier(_pen);\r
+ } else {\r
+ p = new FNPolygon(_pen);\r
+ }\r
+ } else {\r
+ _tracks = Reduce(_tracks);\r
+ p = new FNPolygon(_pen);\r
+ }\r
+ if (NULL != p) {\r
+ p->setFill(_fill);\r
+ if (1 < _tracks.count()) {\r
+ p->setPoints(_tracks);\r
+ redobuf_flush();\r
+ _current->draws.append(p);\r
+ }\r
+ }\r
+ } else if (MODE_TEXT == _drawMode) {\r
+ if (NULL == _txtTmp) {\r
+ textEdit(_last.x(), _last.y());\r
+ } else {\r
+ QRect r = _txtTmp->boundingRect();\r
+ if (_selection == r || 0 < _txtwait) {\r
+ textEdit(r.x(), r.y(), _txtTmp);\r
+ } else {\r
+ if (-1 != _selection.width()) {\r
+ _txtTmp->translate(_last.x() - r.x(), _last.y() - r.y());\r
+ }\r
+ }\r
+ }\r
+ _txtTmp = NULL;\r
+ }\r
+ _tracks.clear();\r
+ _isHeadingEnables = true;\r
+ _timer->start(_scrollTiming, true);\r
+ }\r
+}\r
+\r
+void FNCanvas::textEdit(int x, int y, FNText* obj)\r
+{\r
+ FNTextDialog dlg(fontname, _colorSelector, this);\r
+ dlg.show();\r
+ /*\r
+ if (width() < _tboxRect.x()) {\r
+ _tboxRect.setX(0);\r
+ }\r
+ if (50 > _tboxRect.y()) {\r
+ _tboxRect.setY(50);\r
+ }\r
+ if (height() < _tboxRect.height()) {\r
+ _tboxRect.setHeight(height());\r
+ }\r
+ if (width() < _tboxRect.width()) {\r
+ _tboxRect.setWidth(width());\r
+ }\r
+ dlg.move(_tboxRect.x(), _tboxRect.y());\r
+ dlg.resize(_tboxRect.width(), _tboxRect.height());\r
+ */\r
+ dlg.move(width() / 8, height() / 8);\r
+ dlg.resize(width() * 6 / 8, height() * 6 / 8);\r
+ QPen pen = _pen;\r
+ if (NULL != obj) {\r
+ for (uint i = 0; i < obj->lines.count(); ++i) {\r
+ dlg.lines->append(obj->lines[i]);\r
+ }\r
+ pen = obj->pen();\r
+ }\r
+ dlg.setPen(pen);\r
+ \r
+ int mx = x;\r
+ int my = y;\r
+ if (dlg.exec()) {\r
+ pen = dlg.pen();\r
+ if (0 < dlg.lines->text().length()) {\r
+ FNText* p = obj;\r
+ if (NULL == obj) {\r
+ p = new FNText(pen);\r
+ _current->draws.append((FNPolygon*)p);\r
+ }\r
+ p->pen() = pen;\r
+ p->lines.clear();\r
+ FNPointList l;\r
+ l.append(new QPoint(x, y));\r
+ QFont font(fontname);\r
+ font.setPointSize(FONTSIZE[pen.width()]);\r
+ QFontMetrics fm(font);\r
+ int h = fm.height();\r
+ for (int i = 0; i < dlg.lines->numLines(); ++i) {\r
+ p->lines.append(dlg.lines->textLine(i));\r
+ int w = fm.width(dlg.lines->textLine(i)) + x;\r
+ l.append(new QPoint(w, my));\r
+ my += h;\r
+ l.append(new QPoint(w, my));\r
+ l.append(new QPoint(x, my));\r
+ if (mx < w) {\r
+ mx = w;\r
+ }\r
+ }\r
+ p->setPoints(l);\r
+ redobuf_flush();\r
+ redraw();\r
+ } else {\r
+ if (NULL != obj) {\r
+ _current->draws.remove(obj);\r
+ }\r
+ }\r
+ }\r
+ _tboxRect = QRect(dlg.x(), dlg.y(), dlg.width(), dlg.height());\r
+}\r
+void FNCanvas::paintEvent(QPaintEvent*)\r
+{\r
+ bitBlt(this, 0, 0, &_buffer);\r
+}\r
+\r
+void FNCanvas::resizeEvent(QResizeEvent* evt)\r
+{\r
+ QPixmap save(_buffer);\r
+ _buffer.resize(evt->size());\r
+ _buffer.fill(white);\r
+ bitBlt(&_buffer, 0, 0, &save);\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::setOrigin(QPoint& o)\r
+{\r
+ this->setOrigin(o.x(), o.y());\r
+}\r
+\r
+QPoint FNCanvas::getTopLeft()\r
+{\r
+ bool hasValue = false;\r
+ int dx = 0;\r
+ int dy = 0;\r
+ if (0 < _current->draws.count()) {\r
+ dx = ((FNPolygon*)_current->draws.at(0))->boundingRect().x();\r
+ dy = ((FNPolygon*)_current->draws.at(0))->boundingRect().y();\r
+ }\r
+ \r
+ for (uint j = 0; j < _layers.count(); ++j) {\r
+ FNPolygonList& draws = _layers.at(j)->draws;\r
+ for (uint i = 0; i < draws.count(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ hasValue = true;\r
+ if (dx > p->boundingRect().x()) {\r
+ dx = p->boundingRect().x();\r
+ }\r
+ if (dy > p->boundingRect().y()) {\r
+ dy = p->boundingRect().y();\r
+ }\r
+ }\r
+ }\r
+ if (!hasValue || !_isUseAllQuadrant) {\r
+ return _origin;\r
+ }\r
+ return QPoint(snap(dx), snap(dy));\r
+}\r
+\r
+\r
+void FNCanvas::rebuild()\r
+{\r
+ if (!_isUseAllQuadrant) {\r
+ return;\r
+ }\r
+\r
+ QPoint d = getTopLeft();\r
+ d.setX(d.x() - SNAP_SIZE);\r
+ d.setY(d.y() - SNAP_SIZE);\r
+ for (uint j = 0; j < _layers.count(); ++j) {\r
+ FNPolygonList& draws = _layers.at(j)->draws;\r
+ for (uint i = 0; i < draws.count(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ p->translate(-d.x(), -d.y());\r
+ }\r
+ }\r
+ _origin = QPoint(0, 0);\r
+}\r
+\r
+void FNCanvas::resetOrigin()\r
+{\r
+ int ox = 0;\r
+ int oy = 0;\r
+ _isHeadingEnables = false;\r
+ _timer->stop();\r
+\r
+\r
+ int dx = 0;\r
+ int dy = 0;\r
+ if (!_isUseAllQuadrant) {\r
+ if (0 > ox) {\r
+ ox = 0;\r
+ }\r
+ if (0 > oy) {\r
+ oy = 0;\r
+ }\r
+ dx = _origin.x() - ox;\r
+ dy = _origin.y() - oy;\r
+ } else {\r
+ dx = _origin.x() - ox;\r
+ dy = _origin.y() - oy;\r
+ if (0 > ox) {\r
+ ox = 0;\r
+ }\r
+ if (0 > oy) {\r
+ oy = 0;\r
+ }\r
+ }\r
+ for (uint i = 0; i < _tracks.count(); ++i) {\r
+ QPoint* p = _tracks.at(i);\r
+ p->setX(p->x() + dx);\r
+ p->setY(p->y() + dy);\r
+ }\r
+\r
+ for (uint i = 0; i < _layers.count(); ++i) {\r
+ FNPolygonList& draws = _layers.at(i)->draws;\r
+ for (uint j = 0; j < draws.count(); ++j) {\r
+ FNPolygon* p = draws.at(j);\r
+ p->translate(dx, dy);\r
+ }\r
+ }\r
+ _origin = QPoint(ox, oy);\r
+}\r
+\r
+void FNCanvas::setOrigin(int ox, int oy, bool isRedrawEnabled)\r
+{\r
+ ox = snap(ox);\r
+ oy = snap(oy);\r
+ _isHeadingEnables = false;\r
+ _timer->stop();\r
+\r
+ int dx = 0;\r
+ int dy = 0;\r
+ if (!_isUseAllQuadrant) {\r
+ if (0 > ox) {\r
+ ox = 0;\r
+ }\r
+ if (0 > oy) {\r
+ oy = 0;\r
+ }\r
+ dx = _origin.x() - ox;\r
+ dy = _origin.y() - oy;\r
+ } else {\r
+ dx = _origin.x() - ox;\r
+ dy = _origin.y() - oy;\r
+ if (0 > ox) {\r
+ ox = 0;\r
+ }\r
+ if (0 > oy) {\r
+ oy = 0;\r
+ }\r
+ }\r
+ if (dx == 0 && dy == 0) {\r
+ return;\r
+ }\r
+ for (uint i = 0; i < _tracks.count(); ++i) {\r
+ QPoint* p = _tracks.at(i);\r
+ p->setX(p->x() + dx);\r
+ p->setY(p->y() + dy);\r
+ }\r
+\r
+ for (uint j = 0; j < _layers.count(); ++j) {\r
+ FNPolygonList& draws = _layers.at(j)->draws;\r
+ for (uint i = 0; i < draws.count(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ p->translate(dx, dy);\r
+ }\r
+ }\r
+ if (-1 != _selection.width()) {\r
+ _selection.moveBy(dx, dy);\r
+ }\r
+\r
+ _origin = QPoint(ox, oy);\r
+ emit originChanged(ox, oy);\r
+ if (isRedrawEnabled) {\r
+ redraw();\r
+ }\r
+}\r
+\r
+void FNCanvas::redraw()\r
+{\r
+ if (_isDrawing) {\r
+ return;\r
+ }\r
+ if (_isDragging) {\r
+ return;\r
+ }\r
+ if (!this->isVisible()) {\r
+ return;\r
+ }\r
+ \r
+ _isDrawing = true;\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (_isTinyPaging) {\r
+ if (_current == &layer) {\r
+ layer.IsShow = true;\r
+ } else {\r
+ layer.IsShow = false;\r
+ }\r
+ }\r
+ }\r
+ int h = height(); //(height() / 40) * 40;\r
+ _buffer.fill(white);\r
+ QRect r = QRect(0, 0, width(), height());\r
+ QPainter pbuf;\r
+ pbuf.begin(&_buffer);\r
+ pbuf.setFont(QFont(fontname));\r
+ pbuf.setClipRect(0, 0, width(), height());\r
+ if (_viewMode) {\r
+ float wx = 0;\r
+ float wy = 0;\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (layer.IsShow) {\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ QRect r = p->boundingRect();\r
+ if (wx < r.right()) {\r
+ wx = r.right();\r
+ } \r
+ if (wy < r.bottom()) {\r
+ wy = r.bottom();\r
+ }\r
+ }\r
+ }\r
+ }\r
+ wx += SNAP_SIZE;\r
+ wy += SNAP_SIZE;\r
+ wx = snap((int)wx);\r
+ wy = snap((int)wy);\r
+ wx = wx + _origin.x();\r
+ wy = wy + _origin.y();\r
+ _scale_x = (float)width() / wx;\r
+ _scale_y = (float)height() / wy;\r
+ if (1.0f < _scale_x) { \r
+ _scale_x = 1.0f;\r
+ }\r
+ if (1.0f < _scale_y) {\r
+ _scale_y = 1.0f;\r
+ }\r
+ if (_scale_x > _scale_y) {\r
+ _scale_x = _scale_y;\r
+ } else if (_scale_x < _scale_y) {\r
+ _scale_y = _scale_x;\r
+ }\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (!layer.IsShow) {\r
+ continue;\r
+ }\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ FNPolygon* t = NULL;\r
+ if (p->type() == FN_BEZIER) {\r
+ t = new FNBezier(*(FNBezier*)p);\r
+ } else if (p->type() == FN_ELLIPSE) {\r
+ t = new FNEllipse(*(FNEllipse*)p);\r
+ } else if (p->type() == FN_TEXT) {\r
+ t = new FNText(*(FNText*)p);\r
+ } else {\r
+ t = new FNPolygon(*p);\r
+ }\r
+ t->translate(-_origin.x(), -_origin.y());\r
+ for (uint j = 0; j < t->points().count(); ++j) {\r
+ QPoint& pts = t->points().at(j);\r
+ int x = (int)(pts.x() * _scale_x);\r
+ int y = (int)(pts.y() * _scale_y);\r
+ pts.setX(x);\r
+ pts.setY(y);\r
+ }\r
+ double pensize = t->pen().width();\r
+ if (_scale_x > _scale_y) {\r
+ pensize = pensize * _scale_y;\r
+ } else {\r
+ pensize = pensize * _scale_x;\r
+ }\r
+ if (0 >= pensize) {\r
+ pensize = 1;\r
+ }\r
+ if (p->type() == FN_TEXT) {\r
+ FNText* tp = (FNText*)t;\r
+ QPoint& sp = t->points().at(0);\r
+\r
+ //default font size checking...\r
+ QFont f(fontname, FONTSIZE[p->pen().width()]);\r
+ QFontMetrics fm(f);\r
+ int h = fm.height();\r
+ int wx = 0;\r
+ int wy = 0;\r
+ for (uint i = 0; i < tp->lines.count(); ++i) {\r
+ int tw = fm.width(tp->lines[i]);\r
+ if (tw > wx) {\r
+ wx = tw;\r
+ }\r
+ wy += h;\r
+ }\r
+\r
+ //create default font image...\r
+ QRect r = tp->boundingRect();\r
+ QPixmap tmp(wx + 1, wy + 1);\r
+ tmp.fill(Qt::white);\r
+ QPainter pt;\r
+ pt.begin(&tmp);\r
+ pt.setFont(f);\r
+ pt.setPen(p->pen());\r
+ int y = h + 1;\r
+ for (uint i = 0; i < tp->lines.count(); ++i) {\r
+ pt.drawText(1, y, tp->lines[i]);\r
+ y += h;\r
+ }\r
+ pt.flush();\r
+ pt.end();\r
+\r
+ //draw to font image\r
+ tmp = tmp.convertToImage().smoothScale(r.width(), r.height());\r
+ tmp.setMask(tmp.createHeuristicMask());\r
+ pbuf.drawPixmap(sp.x(), sp.y(), tmp);\r
+ pbuf.flush();\r
+ } else {\r
+ t->pen().setWidth(pensize);\r
+ t->drawShape(pbuf);\r
+ }\r
+ delete t;\r
+ }\r
+ }\r
+ } else {\r
+ if (MODE_ERASE == _drawMode || MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode || MODE_TEXT == _drawMode) {\r
+ //\83O\83\8a\83b\83h\95`\89æ\r
+ //QPen pen2(QColor(0, 0, 0), 1);\r
+ //pbuf.setPen(QPen(QColor(50, 240, 240), 1));\r
+ pbuf.setPen(QPen(GridColor));\r
+ for (int x = 0; x < width() + SNAP_SIZE; x += SNAP_SIZE) {\r
+ pbuf.drawLine(x - SNAP_SIZE / 2, 0, x - SNAP_SIZE / 2, h);\r
+ for (int y = 0; y < h + SNAP_SIZE; y += SNAP_SIZE) {\r
+ pbuf.drawLine(0, y - SNAP_SIZE / 2, width(), y - SNAP_SIZE / 2);\r
+ pbuf.drawRect(x-1,y-1,2,2);\r
+ }\r
+ }\r
+ }\r
+ if (MODE_ERASE != _drawMode) {\r
+ if (!(MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode || MODE_TEXT == _drawMode)) {\r
+ if (_showRuler) {\r
+ //\8cr\90ü\r
+ pbuf.setPen(QPen(RulerColor, 1, SolidLine));\r
+ int step = SNAP_SIZE * 2; //SNAP_SIZE\82Ì\82Q\94{\82É\81B\r
+ for (int i = 0; i < height(); i += step) {\r
+ pbuf.drawLine(0, i, width(), i);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (_isShowGuide) {\r
+ pbuf.setPen(QPen(GuideColor, 1, DashLine));\r
+ if (AS_HORIZONTAL == _asMode || AS_BOTH == _asMode) {\r
+ if (0 != _origin.x() || _isUseAllQuadrant) {\r
+ pbuf.drawLine(width() / _margin, 0, width() / _margin, h);\r
+ }\r
+ pbuf.drawLine(width() * (_margin - 1) / _margin, 0, width() * (_margin - 1) / _margin, h);\r
+ }\r
+\r
+ if (AS_VERTICAL == _asMode || AS_BOTH == _asMode) {\r
+ if (0 != _origin.y() || _isUseAllQuadrant) {\r
+ pbuf.drawLine(0, h / _margin, width(), h / _margin);\r
+ }\r
+ pbuf.drawLine(0, h * (_margin - 1) / _margin, width(), h * (_margin - 1) / _margin);\r
+ }\r
+ }\r
+\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (layer.IsShow) {\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ if (r.intersects(p->boundingRect())) {\r
+ p->drawShape(pbuf);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (layer.IsShow) {\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ if (!_selected.contains(p)) {\r
+ if (r.intersects(p->boundingRect())) {\r
+ p->drawShape(pbuf);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ _selected.at(i)->drawShape(pbuf, true);\r
+ }\r
+ if (_isSelected) {\r
+ pbuf.setPen(QPen(SelectionFrameColor, 1, DashLine));\r
+ pbuf.setBrush(NoBrush);\r
+ pbuf.drawRect(_selection);\r
+ }\r
+ }\r
+ }\r
+ pbuf.end();\r
+ _isDrawing = false;\r
+ repaint();\r
+}\r
+\r
+void FNCanvas::changeColor(QRgb c)\r
+{\r
+ _pen.setColor(QColor(c));\r
+ if (_isSelected && _drawMode == MODE_ERASE) {\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ _selected.at(i)->pen().setColor(QColor(c));\r
+ }\r
+ }\r
+}\r
+\r
+void FNCanvas::selectionMoveTo(int dx, int dy)\r
+{\r
+ if (_isSelected) {\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ _selected.at(i)->translate(dx, dy);\r
+ }\r
+ _selection.moveBy(dx, dy);\r
+ }\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::copy()\r
+{\r
+ if (MODE_ERASE != _drawMode || _viewMode) {\r
+ return;\r
+ }\r
+ _clipboard.clear();\r
+ int size = _selected.count();\r
+ int a1[size];\r
+ int a2[size];\r
+ for (int i = 0; i < size; ++i) {\r
+ a1[i] = _current->draws.findRef(_selected.at(i));\r
+ a2[i] = i;\r
+ }\r
+\r
+ //\83\\81[\83g\r
+ FNPolygonList tmp;\r
+ for (int i = 0; i < size; ++i) {\r
+ int min = i;\r
+ for (int j = i + 1; j < size; ++j) {\r
+ if (a1[min] > a1[j]) {\r
+ min = j; \r
+ }\r
+ }\r
+ tmp.append(_selected.at(a2[min]));\r
+ a1[min] = a1[i];\r
+ a2[min] = a2[i];\r
+ }\r
+ \r
+ //\95À\82Ñ\8f\87\82ð\95Û\8fØ\82µ\82Ä\83R\83s\81[\r
+ tmp.clone(_clipboard);\r
+ tmp.clear();\r
+}\r
+\r
+void FNCanvas::paste()\r
+{\r
+ if (_viewMode) {\r
+ return;\r
+ }\r
+ if (MODE_ERASE == _drawMode) {\r
+ _selected.clear();\r
+ _clipboard.clone(_selected);\r
+ _selection = QRect(0, 0, -1, -1);\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ FNPolygon* o = _selected.at(i);\r
+ o->translate(10, 10);\r
+ QRect bounds = o->boundingRect();\r
+ if (-1 == _selection.width()) {\r
+ _selection = bounds;\r
+ } else {\r
+ if (bounds.x() < _selection.x()) {\r
+ _selection.setX(bounds.x());\r
+ }\r
+ if (bounds.y() < _selection.y()) {\r
+ _selection.setY(bounds.y());\r
+ }\r
+ if (bounds.right() > _selection.right()) {\r
+ _selection.setRight(bounds.right());\r
+ }\r
+ if (bounds.bottom() > _selection.bottom()) {\r
+ _selection.setBottom(bounds.bottom());\r
+ }\r
+ }\r
+ }\r
+ _selected.copy(_current->draws);\r
+ _isSelected = true;\r
+ } else {\r
+ int my = 10;\r
+ int mx = 10;\r
+ int x = 10;\r
+ QStringList lines = QStringList::split("\n", QApplication::clipboard()->text());\r
+ if (0 < lines.count()) {\r
+ FNText* p = new FNText(_pen);\r
+ _current->draws.append((FNPolygon*)p);\r
+ p->lines.clear();\r
+ FNPointList l;\r
+ l.append(new QPoint(0, 0));\r
+ QFont font(fontname);\r
+ font.setPointSize(FONTSIZE[_pen.width()]);\r
+ QFontMetrics fm(font);\r
+ int h = fm.height();\r
+ for (uint i = 0; i < lines.count(); ++i) {\r
+ p->lines.append(lines[i]);\r
+ int w = fm.width(lines[i]) + x;\r
+ l.append(new QPoint(w, my));\r
+ my += h;\r
+ l.append(new QPoint(w, my));\r
+ l.append(new QPoint(x, my));\r
+ if (mx < w) {\r
+ mx = w;\r
+ }\r
+ }\r
+ p->setPoints(l);\r
+ }\r
+ }\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::redo()\r
+{\r
+ if (MODE_ERASE != _drawMode) {\r
+ _current->redo();\r
+ }\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::clearList(FNPolygonList& list)\r
+{\r
+ list.setAutoDelete(true);\r
+ list.clear();\r
+ list.setAutoDelete(false);\r
+}\r
+\r
+void FNCanvas::resetSelection()\r
+{\r
+ _selection = QRect(0, 0, -1, -1);\r
+ _selected.clear();\r
+ _isSelected = false;\r
+}\r
+\r
+void FNCanvas::clear()\r
+{\r
+ resetSelection();\r
+ _layers.clear();\r
+ _current = new FNLayer();\r
+ _layers.append(_current);\r
+ _current->Name = "Layer0";\r
+ _selIdx = 0;\r
+ _isTinyPaging = false;\r
+ //_undobuf.clear();\r
+ setOrigin(0, 0);\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::undo()\r
+{\r
+ _timer->stop();\r
+ if (MODE_ERASE != _drawMode) {\r
+ _current->undo();\r
+ } else {\r
+ _selected.clear();\r
+ _isSelected = false;\r
+ _layers.clear();\r
+ for (uint i = 0; i < _undobuf.count(); ++i) {\r
+ _layers.append(new FNLayer(*_undobuf.at(i)));\r
+ }\r
+ _current = _layers.at(0);\r
+ _selIdx = 0;\r
+ }\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::viewChanged(bool flg)\r
+{\r
+ _tracks.clear();\r
+ _viewMode = flg;\r
+ if (_viewMode) {\r
+ if (_isUseAllQuadrant) {\r
+ rebuild();\r
+ }\r
+ setOrigin(0, 0, false);\r
+ }\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::redobuf_flush()\r
+{\r
+ _current->redobuf_flush();\r
+}\r
+\r
+void FNCanvas::modeChanged(int mode)\r
+{\r
+ _tracks.clear();\r
+ resetSelection();\r
+ _drawMode = mode;\r
+ for (uint i = 0; i < _layers.count(); ++i) {\r
+ FNLayer* p = _layers.at(i);\r
+ p->modeChanged();\r
+ }\r
+ _undobuf.clear();\r
+ if (MODE_ERASE == mode) {\r
+ _isEraseWaiting = false;\r
+ for (uint i = 0; i < _layers.count(); ++i) {\r
+ _undobuf.append(new FNLayer(*_layers.at(i)));\r
+ }\r
+ }\r
+ if (MODE_CPICK != mode) {\r
+ _prevMode = mode;\r
+ }\r
+ redraw();\r
+}\r
+\r
+QRect FNCanvas::getMatrix(const QRect& r) const\r
+{\r
+ int ox = _origin.x();\r
+ int oy = _origin.y();\r
+ const int wide = 100;\r
+\r
+ int left = r.left() + ox;\r
+ int top = r.top() + oy;\r
+ int right = r.right() + ox;\r
+ int bottom = r.bottom() + oy;\r
+ \r
+ left = (int)(left / wide) * wide;\r
+ top = (int)(top / wide) * wide;\r
+ right = (right % wide == 0 && left != right) ? right : (int)((right + wide) / wide) * wide;\r
+ bottom = (bottom % wide == 0 && top != bottom) ? bottom : (int)((bottom + wide) / wide) * wide;\r
+ \r
+ return QRect(left - ox, top - oy, right - left, bottom - top);\r
+}\r
+\r
+void FNCanvas::CR() \r
+{\r
+ if (MODE_ERASE == _drawMode) {\r
+ return;\r
+ }\r
+ int h = height(); //(height() / 40) * 40;\r
+ int step = snap(h) / _margin;\r
+ if (_isHeadingEnables) {\r
+ //last\82©\82ç\81A\8d¶\95û\8cü\82É\8cü\82¯\82Ä\92T\8dõ\82·\82é\81B\r
+ QRect r = getMatrix(_current->draws.last()->boundingRect());\r
+ bool isSearching = true;\r
+ r.moveBy(-100, 0);\r
+ while (isSearching) {\r
+ isSearching = false;\r
+ for (uint i = 0; i < _current->draws.count(); ++i) {\r
+ FNPolygon* p = _current->draws.at(i);\r
+ const QRect& r2 = p->boundingRect();\r
+ if (r.intersects(r2)) {\r
+ if (r.left() + 100 > r2.left()) {\r
+ r = getMatrix(r2);\r
+ r.moveBy(-100, 0);\r
+ isSearching = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ r.moveBy(100, 0);\r
+ //last\82ª\89æ\96Ê\82Ì4/5\88È\89º\82È\82ç\82Î\81A\83X\83N\83\8d\81[\83\8b\83A\83b\83v\82·\82é\81B\r
+ //\82»\82¤\82Å\82È\82¯\82ê\82Î\81A\83w\83b\83f\83B\83\93\83O\82Ì\82Ý\81B\r
+ if (_last.y() > h * 4 / 5) {\r
+ setOrigin(_origin.x() + r.x(), _origin.y() + step);\r
+ } else {\r
+ setOrigin(_origin.x() + r.x(), _origin.y());\r
+ }\r
+ _isHeadingEnables = false;\r
+ } else {\r
+ //last\82Ì\8eü\88Í\82É\89½\82à\96³\82¢\8fê\8d\87\82Í\81A\8fc\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B\r
+ setOrigin(_origin.x(), _origin.y() + step);\r
+ }\r
+}\r
+\r
+void FNCanvas::erase()\r
+{\r
+ if (MODE_ERASE != _drawMode) {\r
+ return;\r
+ }\r
+ FNPolygonList temp;\r
+ int w = _eraser_s;\r
+ if (PENWIDTH_MAX / 2 < _pen.width()) {\r
+ w = _eraser_l;\r
+ }\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ _current->draws.remove(_selected.at(i));\r
+ //_marks.append(_selected.at(i));\r
+ }\r
+ resetSelection();\r
+ _tracks.clear();\r
+ _isEraseWaiting = false;\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::setPensize(int sz)\r
+{\r
+ _pen.setWidth(sz);\r
+ if (_isSelected) {\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ if (FN_TEXT != _selected.at(i)->type()) {\r
+ _selected.at(i)->pen().setWidth(sz);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+bool FNCanvas::exportPNG(const QFileInfo& info, QPixmap& buf)\r
+{\r
+ if (0 == info.fileName().length()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");\r
+ return false;\r
+ }\r
+ if (info.extension(false) != "png") {\r
+ QMessageBox::warning(0,"FreeNoteQt", "extension '.png' expected.");\r
+ return false;\r
+ }\r
+\r
+ bool ret;\r
+ if (_isColorRevision) {\r
+ QImage img = buf.convertToImage();\r
+ int wd = buf.width();\r
+ int ht = buf.height();\r
+ for (int i = 0; i < ht; ++i) {\r
+ for (int j = 0; j < wd; ++j) {\r
+ QRgb c = img.pixel(j, i);\r
+ int r = qRed(c) >> 3;\r
+ int g = qGreen(c) >> 2;\r
+ int b = qBlue(c) >> 3;\r
+ r = (r << 3) | (r >> 2);\r
+ b = (b << 3) | (b >> 2);\r
+ g = (g << 2) | (g >> 4);\r
+ //float f1 = 248f / 255f;\r
+ //float f2 = 252f / 255f;\r
+ //img.setPixel(qRed(c) * f1, qGreen(c) * f2, qBlue(c) * f1);\r
+ img.setPixel(j, i, qRgb(r, g, b));\r
+ }\r
+ }\r
+ ret = img.save(info.absFilePath(), "PNG");\r
+ } else {\r
+ ret = buf.save(info.absFilePath(), "PNG");\r
+ }\r
+ if (ret) {\r
+ FNMessageBox::information(0,"FreeNoteQt", "export PNG complete.");\r
+ } else {\r
+ QMessageBox::warning(0,"FreeNoteQt", "could not export file.");\r
+ }\r
+ return ret;\r
+}\r
+\r
+QString FNCanvas::mkPDFscript(FNPolygon* elm, int wy)\r
+{\r
+ QString s ="";\r
+ char buf[1024];\r
+ float r;\r
+ float g;\r
+ float b;\r
+ if (_isColorRevision) {\r
+ r = (float)elm->pen().color().red() / 248.0f;\r
+ g = (float)elm->pen().color().green() / 252.0f;\r
+ b = (float)elm->pen().color().blue() / 248.0f;\r
+ } else {\r
+ r = (float)elm->pen().color().red() / 255.0f;\r
+ g = (float)elm->pen().color().green() / 255.0f;\r
+ b = (float)elm->pen().color().blue() / 255.0f;\r
+ }\r
+ if (elm->type() == FN_TEXT) {\r
+ FNText* t = (FNText*)elm;\r
+ sprintf(buf, "BT\r\n/F1 %d Tf\r\n", FONTSIZE[elm->pen().width()]);\r
+ s += buf;\r
+ sprintf(buf, "0 Tr\r\n%f %f %f rg\r\n", r, g, b);\r
+ s += buf;\r
+ QRect r = t->boundingRect();\r
+ r.moveBy(_origin.x(), _origin.y());\r
+ QFont font(fontname);\r
+ font.setPointSize(FONTSIZE[elm->pen().width()]);\r
+ QFontMetrics fm(font);\r
+ int h = fm.height();\r
+ int y = r.y() + h;\r
+ for (uint i = 0; i < t->lines.count(); ++i) {\r
+ sprintf(buf, "1 0 0 1 %d %d Tm\r\n", r.x() + 3, wy - y);\r
+ s += buf;\r
+ y = y + h;\r
+ s += "<";\r
+ for (uint j = 0; j < t->lines[i].length(); ++j) {\r
+ sprintf(buf, "%04X", (t->lines[i].at(j).unicode() & 0x0ffff));\r
+ s += buf;\r
+ }\r
+ s += "> Tj\r\n";\r
+ }\r
+ s += "ET\r\n";\r
+ } else {\r
+ s += "q\r\n";\r
+ if (elm->fill()) {\r
+ sprintf(buf, "%f %f %f rg\r\n", r, g, b);\r
+ } else {\r
+ sprintf(buf, "%f %f %f RG\r\n", r, g, b);\r
+ }\r
+ s += buf;\r
+ QPointArray points = elm->points().copy();\r
+ points.translate(_origin.x(), _origin.y());\r
+ if (elm->type() == FN_BEZIER) {\r
+ sprintf(buf, "%d %d m\r\n", points[0].x(), wy - points[0].y());\r
+ s += buf;\r
+ for (uint j = 1; j < points.count(); j += 3) {\r
+ sprintf(buf, "%d %d %d %d %d %d c\r\n",\r
+ points[j].x(), wy - points[j].y(),\r
+ points[j + 1].x(), wy - points[j + 1].y(),\r
+ points[j + 2].x(), wy - points[j + 2].y()\r
+ );\r
+ s += buf;\r
+ }\r
+ } else if (elm->type() == FN_ELLIPSE) {\r
+ int x = points[0].x();\r
+ int y = points[0].y();\r
+ int ex = points[1].x();\r
+ int ey = points[1].y();\r
+ int w = ex - x;\r
+ int h = ey - y;\r
+ int cx = x + w/2;\r
+ int cy = y;\r
+ int x1 = x + 3*w/4;\r
+ int y1 = y;\r
+ int x2 = x + w;\r
+ int y2 = y + h/4;\r
+ int x3 = x + w;\r
+ int y3 = y + h/2;\r
+ \r
+ sprintf(buf, "%d %d m\r\n%d %d %d %d %d %d c\r\n", cx, wy - cy, x1, wy - y1, x2, wy - y2, x3, wy - y3);\r
+ s += buf;\r
+ x1 = x + w;\r
+ y1 = y + 3 * h / 4;\r
+ x2 = x + 3 * w / 4;\r
+ y2 = y + h;\r
+ x3 = x + w/2;\r
+ y3 = y + h;\r
+ sprintf(buf, "%d %d %d %d %d %d c\r\n", x1, wy - y1, x2, wy - y2, x3, wy - y3);\r
+ s += buf;\r
+\r
+ x1 = x + w / 4;\r
+ y1 = y + h;\r
+ x2 = x;\r
+ y2 = y + 3 * h / 4;\r
+ x3 = x;\r
+ y3 = y + h / 2;\r
+ sprintf(buf, "%d %d %d %d %d %d c\r\n", x1, wy - y1, x2, wy - y2, x3, wy - y3);\r
+ s += buf;\r
+ x1 = x;\r
+ y1 = y + h / 4;\r
+ x2 = x + w / 4;\r
+ y2 = y;\r
+ x3 = x + w / 2;\r
+ y3 = y;\r
+ sprintf(buf, "%d %d %d %d %d %d c\r\n", x1, wy - y1, x2, wy - y2, x3, wy - y3);\r
+ s += buf;\r
+ } else {\r
+ sprintf(buf, "%d %d m\r\n", points[0].x(), wy - points[0].y());\r
+ s += buf;\r
+ for (uint j = 1; j < points.count(); ++j) {\r
+ sprintf(buf, "%d %d l\r\n", points[j].x(), wy - points[j].y());\r
+ s += buf;\r
+ }\r
+ }\r
+ sprintf(buf, "%d w\r\n", elm->pen().width());\r
+ s += buf;\r
+ if (elm->fill()) {\r
+ s += "f*\r\n";\r
+ } else {\r
+ s += "S\r\n";\r
+ }\r
+ s += "Q\r\n";\r
+ }\r
+ return s;\r
+}\r
+\r
+bool FNCanvas::exportPDF(const QFileInfo& info)\r
+{\r
+ if (0 == info.fileName().length()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");\r
+ return false;\r
+ }\r
+ if (info.extension(false) != "pdf") {\r
+ QMessageBox::warning(0,"FreeNoteQt", "extension '.pdf' expected.");\r
+ return false;\r
+ }\r
+\r
+ FILE* fp = NULL;\r
+ if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "could not export file.");\r
+ return false;\r
+ }\r
+\r
+ QPoint o = getTopLeft();\r
+ rebuild();\r
+ int wx = 595;\r
+ int wy = 842;\r
+ char buf[1024];\r
+ int bias = 0;\r
+ if (_isUseAllQuadrant) {\r
+ bias = SNAP_SIZE;\r
+ }\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ FNPolygon* p = draws.at(i);\r
+ QRect r = p->boundingRect();\r
+ r.moveBy(_origin.x(), _origin.y());\r
+ if (wx < r.right() + bias) {\r
+ wx = r.right() + bias;\r
+ }\r
+ if (wy < r.bottom() + bias) {\r
+ wy = r.bottom() + bias;\r
+ }\r
+ }\r
+ }\r
+\r
+ int len = 0;\r
+ \r
+ /*\r
+ sprintf(buf, "1 0 0 -1 0 %d cm\r\n", wy);\r
+ QString cm = buf;\r
+ len += cm.length();\r
+ */\r
+ QString cm = "";\r
+\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (layer.IsShow) {\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ QString s = mkPDFscript(draws.at(i), wy);\r
+ len += s.length();\r
+ }\r
+ }\r
+ }\r
+\r
+ //int ref = 0;\r
+ QString header = "";\r
+ QStringList xref;\r
+ xref.append("0000000000 65535 f\r\n");\r
+\r
+ header += "%PDF-1.3\r\n";\r
+ sprintf(buf, "%010d 00000 n\r\n", header.length());\r
+ xref.append(buf);\r
+\r
+ header += "1 0 obj<</Type/Catalog/Outlines 2 0 R/Pages 3 0 R>>\r\n";\r
+ header += "endobj\r\n";\r
+ sprintf(buf, "%010d 00000 n\r\n", header.length());\r
+ xref.append(buf);\r
+\r
+\r
+ header += "2 0 obj<</Type/Outlines/Count 0>>\r\n";\r
+ header += "endobj\r\n";\r
+ sprintf(buf, "%010d 00000 n\r\n", header.length());\r
+ xref.append(buf);\r
+\r
+ header += "3 0 obj<</Type/Pages/Kids[4 0 R]/Count 1>>\r\n";\r
+ header += "endobj\r\n";\r
+ sprintf(buf, "%010d 00000 n\r\n", header.length());\r
+ xref.append(buf);\r
+\r
+ header += "4 0 obj<</Type/Page/Parent 3 0 R";\r
+ sprintf(buf, "/MediaBox[0 0 %d %d]", wx, wy);\r
+ header += buf;\r
+ header += "/Contents 6 0 R/Resources<</Font<</F1 5 0 R>>/ProcSet[/PDF/Text]>>>>\r\n";\r
+ header += "endobj\r\n";\r
+ sprintf(buf, "%010d 00000 n\r\n", header.length());\r
+ xref.append(buf);\r
+\r
+ if (encode == QString("WinAnsiEncoding")) {\r
+ header += "5 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica/FirstChar 0/LastChar 255/Encoding/WinAnsiEncoding>>\r\n";\r
+ } else if (encode == QString("UniJIS-UCS2-H")) {\r
+ header += "5 0 obj<</Type/Font/Encoding/UniJIS-UCS2-H/BaseFont/MSGothic/Subtype/Type0/DescendantFonts[<</W[0[1000] 1 94 500 231 324 500 327 389 500 631 [500] 668 [500]]/Type/Font/BaseFont/MSGothic/Subtype/CIDFontType2/CIDSystemInfo<</Ordering(Japan1)/Registry(Adobe)/Supplement 2>>/FontDescriptor<</Type/FontDescriptor/FontBBox[0 -137 1000 859]/FontName/MSGothic/Flags 32/StemV 92/CapHeight 770/XHeight 543/Ascent 859/Descent -137/ItalicAngle 0>>/DW 1000>>]>>\r\n";\r
+ }\r
+ header += "endobj\r\n";\r
+ sprintf(buf, "%010d 00000 n\r\n", header.length());\r
+ xref.append(buf);\r
+\r
+ sprintf(buf, "6 0 obj<</Length %d>>\r\n", len);\r
+ header += buf;\r
+ header += "stream\r\n";\r
+\r
+ QString footer = "";\r
+ footer += "xref\r\n";\r
+ sprintf(buf, "0 %d\r\n", xref.count());\r
+ footer += buf;\r
+ for (uint i = 0; i < xref.count(); ++i) {\r
+ footer += xref[i];\r
+ }\r
+ footer += "trailer\r\n";\r
+ sprintf(buf, "<</Size %d/Root 1 0 R>>\r\n", xref.count());\r
+ footer += buf;\r
+ footer += "startxref\r\n";\r
+\r
+ len = cm.length();\r
+ len += header.length();\r
+ fputs(header, fp);\r
+ fputs(cm, fp);\r
+\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ if (layer.IsShow) {\r
+ FNPolygonList& draws = layer.draws;\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ QString s = mkPDFscript(draws.at(i), wy);\r
+ len += s.length();\r
+ fputs(s, fp);\r
+ }\r
+ }\r
+ }\r
+ QString streamfooter = "endstream\r\nendobj\r\n";\r
+ len += streamfooter.length();\r
+ fputs(streamfooter, fp);\r
+\r
+ fputs(footer, fp);\r
+ sprintf(buf, "%d\r\n", len);\r
+ fputs(buf, fp);\r
+ fputs("%%EOF\r\n", fp);\r
+ fclose(fp);\r
+ if (_isUseAllQuadrant) {\r
+ setOrigin(-o.x(), -o.y());\r
+ }\r
+ FNMessageBox::information(0,"FreeNoteQt", "export PDF complete.");\r
+ return true;\r
+}\r
+\r
+bool FNCanvas::save(const QFileInfo& info)\r
+{\r
+ if (0 == info.fileName().length()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");\r
+ return false;\r
+ }\r
+ if (info.extension(false) != "free") {\r
+ QMessageBox::warning(0,"FreeNoteQt", "extension '.free' expected.");\r
+ return false;\r
+ }\r
+ FILE* fp = NULL;\r
+ if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "could not save file.");\r
+ return false;\r
+ }\r
+ QPoint o = getTopLeft();\r
+ rebuild();\r
+ fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", fp);\r
+ char buf[1024];\r
+ sprintf(buf, "<freenote version=\"4.1\" pg=%d idx=\"%d\">\n", _isTinyPaging, _selIdx);\r
+ fputs(buf, fp);\r
+ for (uint l = 0; l < _layers.count(); ++l) {\r
+ FNLayer& layer = *_layers.at(l);\r
+ FNPolygonList& draws = layer.draws;\r
+ QString s = "<layer v=";\r
+ if (layer.IsShow) {\r
+ s += "1 name=\"";\r
+ } else {\r
+ s += "0 name=\"";\r
+ }\r
+ s += layer.Name;\r
+ s += "\">\n";\r
+ fputs(s.utf8(), fp);\r
+ for (uint i = 0; i < draws.count() - layer.disp_offset(); ++i) {\r
+ FNPolygon p(*draws.at(i));\r
+ p.translate(_origin.x(), _origin.y());\r
+ if (p.type() == FN_BEZIER) {\r
+ sprintf(buf, "\t<bz color=\"%x\" width=\"%d\" f=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width(), p.fill());\r
+ } else if (p.type() == FN_ELLIPSE) {\r
+ sprintf(buf, "\t<el color=\"%x\" width=\"%d\" f=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width(), p.fill());\r
+ } else if (p.type() == FN_TEXT) {\r
+ sprintf(buf, "\t<tx color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());\r
+ } else {\r
+ sprintf(buf, "\t<po color=\"%x\" width=\"%d\" f=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width(), p.fill());\r
+ }\r
+ fputs(buf, fp);\r
+ QPointArray& points = p.points();\r
+ for (uint j = 0; j < points.count(); ++j) {\r
+ QPoint point = points.point(j);\r
+ sprintf(buf, "\t\t<p x=\"%d\" y=\"%d\"/>\n", point.x(), point.y());\r
+ fputs(buf, fp);\r
+ }\r
+ if (p.type() == FN_BEZIER) {\r
+ fputs("\t</bz>\n", fp);\r
+ } else if (p.type() == FN_ELLIPSE) {\r
+ fputs("\t</el>\n", fp);\r
+ } else if (p.type() == FN_TEXT) {\r
+ FNText* tp = (FNText*)draws.at(i);\r
+ for (uint j = 0; j < tp->lines.count(); ++j) {\r
+ s = "\t\t<t v=\"";\r
+ s += tp->lines[j];\r
+ s += "\"/>\n";\r
+ fputs(s.utf8(), fp);\r
+ }\r
+ fputs("\t</tx>\n", fp);\r
+ } else {\r
+ fputs("\t</po>\n", fp);\r
+ }\r
+ }\r
+ fputs("</layer>\n", fp);\r
+ }\r
+ fputs("</freenote>\n", fp);\r
+ fclose(fp);\r
+ if (_isUseAllQuadrant) {\r
+ setOrigin(-o.x()+SNAP_SIZE, -o.y()+SNAP_SIZE);\r
+ }\r
+ FNMessageBox::information(0, "FreeNoteQt", "save complete.");\r
+ return true;\r
+}\r
+\r
+bool FNCanvas::load(const QFileInfo& info)\r
+{\r
+ if (0 == info.fileName().length()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");\r
+ return false;\r
+ }\r
+ if (!info.exists()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file not exists.");\r
+ return false;\r
+ }\r
+ FILE* fp = NULL;\r
+ if (!(fp = fopen(info.absFilePath().utf8(), "rt"))) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "could not open file.");\r
+ return false;\r
+ }\r
+ clear();\r
+ open(_layers, fp);\r
+ if ((uint)_selIdx >= _layers.count()) {\r
+ _selIdx = 0;\r
+ }\r
+ _current = _layers.at(_selIdx);\r
+ fclose(fp);\r
+\r
+ redraw();\r
+ FNMessageBox::information(0,"FreeNoteQt", "load complete.");\r
+\r
+ return true;\r
+}\r
+\r
+bool FNCanvas::import(const QFileInfo& info)\r
+{\r
+ if (0 == info.fileName().length()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");\r
+ return false;\r
+ }\r
+ if (!info.exists()) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "file not exists.");\r
+ return false;\r
+ }\r
+ FILE* fp = NULL;\r
+ if (!(fp = fopen(info.absFilePath().utf8(), "rt"))) {\r
+ QMessageBox::warning(0,"FreeNoteQt", "could not open file.");\r
+ return false;\r
+ }\r
+ clearList(_clipboard);\r
+ open(_clipboard, fp);\r
+ fclose(fp);\r
+ if (0 < _clipboard.count()) {\r
+ int x = _clipboard.at(0)->boundingRect().left();\r
+ int y = _clipboard.at(0)->boundingRect().top();\r
+ for (uint i = 1; i < _clipboard.count(); ++i) {\r
+ if (y > _clipboard.at(i)->boundingRect().top()) {\r
+ y = _clipboard.at(i)->boundingRect().top();\r
+ }\r
+ if (x > _clipboard.at(i)->boundingRect().left()) {\r
+ x = _clipboard.at(i)->boundingRect().left();\r
+ }\r
+ }\r
+ for (uint i = 0; i < _clipboard.count(); ++i) {\r
+ _clipboard.at(i)->translate(-x, -y);\r
+ }\r
+ }\r
+ FNMessageBox::information(0,"FreeNoteQt", "import complete.");\r
+\r
+ return true;\r
+}\r
+void FNCanvas::open(FNPolygonList& list, FILE* fp)\r
+{\r
+ clearList(list);\r
+ FNLayerList layers;\r
+ open(layers, fp);\r
+ for (uint i = 0; i < layers.count(); ++i) {\r
+ FNLayer& layer = *layers.at(i);\r
+ if (layer.IsShow) {\r
+ layer.draws.clone(list);\r
+ /*\r
+ FNPolygonList& elmlst = layer.draws;\r
+ for (uint j = 0; j < elmlst.count(); ++j) {\r
+ list.append(elmlst.at(j));\r
+ }\r
+ elmlst.clear();\r
+ */\r
+ }\r
+ }\r
+ layers.clear();\r
+}\r
+\r
+void FNCanvas::open(FNLayerList& layers, FILE* fp)\r
+{\r
+ QString line;\r
+ FNPointList points;\r
+ points.setAutoDelete(true);\r
+ int c;\r
+ int w;\r
+ QPen pen(Qt::black, 1);\r
+ FNPolygon* polygon;\r
+ \r
+ char rdbuf[1024];\r
+ char buf[1024];\r
+ QString type = "";\r
+ QStringList lines;\r
+ layers.setAutoDelete(true);\r
+ layers.clear();\r
+ layers.setAutoDelete(false);\r
+ FNLayer* layer = new FNLayer();\r
+ layer->IsShow = true;\r
+ layer->Name = "Layer0";\r
+ //_current = layer;\r
+ layers.append(layer);\r
+ FNPolygonList* list = &layer->draws;\r
+ bool isFirstLayer = true;\r
+ bool fill = false;\r
+ while (!feof(fp)) {\r
+ fgets(rdbuf, sizeof(rdbuf), fp);\r
+ line = rdbuf;\r
+ if (-1 != line.find("<freenote")) {\r
+ if (-1 != line.find("pg=1")) {\r
+ _isTinyPaging = true;\r
+ } else {\r
+ _isTinyPaging = false;\r
+ }\r
+ int st = line.find("idx=") + 5;\r
+ int ed = line.find("\"", st);\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ sscanf(buf, "%d", &_selIdx);\r
+ } else if (-1 != line.find("<layer ")) {\r
+ if (false == isFirstLayer) {\r
+ layer = new FNLayer();\r
+ list = &layer->draws;\r
+ layers.append(layer);\r
+ }\r
+ isFirstLayer = false;\r
+\r
+ if (-1 != line.find("v=0")) {\r
+ layer->IsShow = false;\r
+ } else if (-1 != line.find("v=1")) {\r
+ layer->IsShow = true;\r
+ }\r
+ int st = line.find("name=") + 6;\r
+ int ed = line.find("\"", st);\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ QTextCodec *codec = QTextCodec::codecForName("utf8");\r
+ layer->Name = codec->toUnicode(buf);\r
+ } else if (-1 != line.find("<fnpolygon ") ||\r
+ -1 != line.find("<po ") ||\r
+ -1 != line.find("<bz ") ||\r
+ -1 != line.find("<el ") ||\r
+ -1 != line.find("<tx ")\r
+ ) {\r
+ if (-1 != line.find("<el ")) {\r
+ type = "Ellipse";\r
+ } else if (-1 != line.find("<bz ")) {\r
+ type = "Bezier";\r
+ } else if (-1 != line.find("<tx ")) {\r
+ type = "Text";\r
+ lines.clear();\r
+ } else {\r
+ type = "Polygon";\r
+ }\r
+ fill = false;\r
+ points.clear();\r
+ int st = line.find("color") + 7;\r
+ int ed = line.find("\"", st);\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ sscanf(buf, "%x", &c);\r
+\r
+ st = line.find("width") + 7;\r
+ ed = line.find("\"", st);\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ sscanf(buf, "%d", &w);\r
+ \r
+ if (-1 != line.find(" f=\"1\"")) {\r
+ fill = true;\r
+ }\r
+ } else if (-1 != line.find("<point ") ||\r
+ -1 != line.find("<p ")\r
+ ) {\r
+ int st = line.find("x=") + 3;\r
+ int ed = line.find("\"", st);\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ int x;\r
+ sscanf(buf, "%d", &x);\r
+\r
+ st = line.find("y=") + 3;\r
+ ed = line.find("\"", st);\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ int y;\r
+ sscanf(buf, "%d", &y);\r
+ points.append(createPts(x, y)); //\83o\83O\91Î\8dô\r
+ } else if (-1 != line.find("<t ")) {\r
+ int st = line.find("v=") + 3;\r
+ int ed = line.findRev("\"");\r
+ strcpy(buf, line.mid(st, ed - st));\r
+ QTextCodec *codec = QTextCodec::codecForName("utf8");\r
+ lines.append(codec->toUnicode(buf));\r
+ } else if (-1 != line.find("</fnpolygon") || \r
+ -1 != line.find("</bz") ||\r
+ -1 != line.find("</el") ||\r
+ -1 != line.find("</po") ||\r
+ -1 != line.find("</tx")) {\r
+ pen.setColor((QRgb)c);\r
+ pen.setWidth(w);\r
+ if (type == "Bezier") {\r
+ list->append(polygon = createBezier(pen)); //\83o\83O\91Î\8dô\r
+ } else if (type == "Ellipse") {\r
+ list->append(polygon = createEllipse(pen)); //\83o\83O\91Î\8dô\r
+ } else if (type == "Text") {\r
+ list->append(polygon = createText(pen, lines));\r
+ } else {\r
+ list->append(polygon = createPolygon(pen)); //\83o\83O\91Î\8dô\r
+ }\r
+ polygon->setFill(fill);\r
+ polygon->setPoints(points);\r
+ points.clear();\r
+ }\r
+ }\r
+}\r
+\r
+FNPolygon* FNCanvas::createPolygon(QPen& pen)\r
+{\r
+ return new FNPolygon(pen);\r
+}\r
+\r
+FNPolygon* FNCanvas::createBezier(QPen& pen)\r
+{\r
+ return new FNBezier(pen);\r
+}\r
+\r
+\r
+FNPolygon* FNCanvas::createEllipse(QPen& pen)\r
+{\r
+ return new FNEllipse(pen);\r
+}\r
+\r
+FNPolygon* FNCanvas::createText(QPen& pen, QStringList& lines)\r
+{\r
+ FNText* p = new FNText(pen);\r
+ p->lines = lines;\r
+ return p;\r
+}\r
+\r
+QPoint* FNCanvas::createPts(int x, int y) \r
+{\r
+ return new QPoint(x, y);\r
+}\r
+\r
+void FNCanvas::setGuide(bool f)\r
+{\r
+ _isShowGuide = f;\r
+ redraw();\r
+}\r
+\r
+void FNCanvas::fillChanged(bool f) {\r
+ _fill = f;\r
+ if (_isSelected) {\r
+ for (uint i = 0; i < _selected.count(); ++i) {\r
+ _selected.at(i)->setFill(f);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/* FreeNote for Sharp SLA300, B500, C7x0, C860 Linux PDA
+ Copyright (C) 2003-2005 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
+
+ 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.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+/*
+2005/02/27 FreeNote 1.11.10pre
+\81EPDF\82Ì\8fo\97Í\8c`\8e®\82ð\88ê\95\94\95Ï\8dX
+\81E\83C\83\93\83|\81[\83g\8e\9e\82Ì\83o\83Ofix
+
+2005/01/04 FreeNote 1.11.6pre
+\81E\83J\81[\83u\83\82\81[\83h\82Å\82W\82Ì\8e\9a\82ª\82©\82¯\82é\82æ\82¤\82É\90®\8c`\83G\83\93\83W\83\93\82ð\89ü\91P
+
+2004/10/17 FreeNote 1.10.0\83\8a\83\8a\81[\83X
+2004/02/14 ver 1.7.2pre
+\81E\8c\9f\8dõ\8b@\94\\82Ì\92Ç\89Á
+*/
+#include "fnfinddialog.h"
+#include "fmtengine.h"
+#include <qlineedit.h>
+#include <stdio.h>
+#include <qregexp.h>
+#include <qcheckbox.h>
+
+FNFindDialog::FNFindDialog( QWidget* parent, const char* name)
+ :FNFindDialogBase(parent, name, true, 0), _idx(0)
+{
+}
+
+void FNFindDialog::setElements(FNLayerList& v)
+{
+ _texts.clear();
+ for (uint i = 0; i < v.count(); ++i) {
+ FNLayer& layer = *v.at(i);
+ if (layer.IsShow) {
+ FNPolygonList& draws = layer.draws;
+ for (uint j = 0; j < draws.count(); ++j) {
+ FNPolygon* p = draws.at(j);
+ if (FN_TEXT == p->type()) {
+ _texts.append(p);
+ }
+ }
+ }
+ }
+ _idx = -1;
+}
+
+void FNFindDialog::findPrev()
+{
+ QString sch = txtSearch->text();
+ QRegExp rex(sch);
+ if (0 == sch.length()) {
+ return;
+ }
+ if (0 > _idx) {
+ _idx = _texts.count() - 1;
+ }
+ if ((uint)_idx >= _texts.count()) {
+ _idx = _texts.count() - 1;
+ }
+ for (; _idx >= 0; --_idx) {
+ FNText* p = (FNText*)_texts.at(_idx);
+ for (uint i = 0; i < p->lines.count(); ++i) {
+ if (ckbIsRegExp->isChecked()) {
+ for (uint i = 0; i < p->lines.count(); ++i) {
+ if (-1 != p->lines[i].find(rex)) {
+ emit resetOrigin();
+ QPoint sp = p->points().point(0);
+ emit originChanged(sp.x() - SNAP_SIZE, sp.y() - SNAP_SIZE);
+ --_idx;
+ return;
+ }
+ }
+ } else {
+ for (uint i = 0; i < p->lines.count(); ++i) {
+ if (-1 != p->lines[i].find(sch)) {
+ emit resetOrigin();
+ QPoint sp = p->points().point(0);
+ emit originChanged(sp.x() - SNAP_SIZE, sp.y() - SNAP_SIZE);
+ --_idx;
+ return;
+ }
+ }
+ }
+ }
+ }
+}
+
+void FNFindDialog::findNext()
+{
+ QString sch = txtSearch->text();
+ QRegExp rex(sch);
+ if (0 == sch.length()) {
+ return;
+ }
+ if (0 > _idx) {
+ _idx = 0;
+ }
+ if ((uint)_idx >= _texts.count()) {
+ _idx = 0;
+ }
+ for (; (uint)_idx < _texts.count(); ++_idx) {
+ FNText* p = (FNText*)_texts.at(_idx);
+ if (ckbIsRegExp->isChecked()) {
+ for (uint i = 0; i < p->lines.count(); ++i) {
+ if (-1 != p->lines[i].find(rex)) {
+ emit resetOrigin();
+ QPoint sp = p->points().point(0);
+ emit originChanged(sp.x() - SNAP_SIZE, sp.y() - SNAP_SIZE);
+ ++_idx;
+ return;
+ }
+ }
+ } else {
+ for (uint i = 0; i < p->lines.count(); ++i) {
+ if (-1 != p->lines[i].find(sch)) {
+ emit resetOrigin();
+ QPoint sp = p->points().point(0);
+ emit originChanged(sp.x() - SNAP_SIZE, sp.y() - SNAP_SIZE);
+ ++_idx;
+ return;
+ }
+ }
+ }
+ }
+}
+
+
+FNFindDialog::~FNFindDialog()
+{
+}
--- /dev/null
+/* FreeNote for Sharp SLA300, B500, C7x0, C860 Linux PDA\r
+ Copyright (C) 2003-2005 Joe Kanemori.<kanemori@ymg.urban.ne.jp>\r
+\r
+ This program is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ This program is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with this program; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+*/\r
+/*\r
+2005/02/27 FreeNote 1.11.10pre\r
+\81EPDF\82Ì\8fo\97Í\8c`\8e®\82ð\88ê\95\94\95Ï\8dX\r
+\81E\83C\83\93\83|\81[\83g\8e\9e\82Ì\83o\83Ofix\r
+\r
+2004/10/17 FreeNote 1.10.0\83\8a\83\8a\81[\83X\r
+2003/08/15 FreeNote 1.2.1\82ð\8cö\8aJ\r
+\81E\95Û\91¶\8e\9e\82Ì\83o\83O\8fC\90³\r
+\81E\8a®\97¹\83_\83C\83A\83\8d\83O\82Ì\8e©\93®\8fÁ\8b\8e\r
+\81EPNG\83t\83@\83C\83\8b\82Ö\82Ì\8fo\97Í\r
+*/\r
+#include "fnmessagebox.h"\r
+int ___fnmessagebox_timing = 1500;\r
+\r
+FNMessageBox::FNMessageBox(QWidget *parent, const char* name) : QMessageBox(parent, name)\r
+{\r
+ _timer = new QTimer(this);\r
+ connect(_timer, SIGNAL(timeout()), this, SLOT(timeout()));\r
+}\r
+\r
+FNMessageBox::FNMessageBox(const QString& caption, const QString& text, Icon icon, int button0, int button1, int button2, QWidget* parent, const char* name, bool modal, WFlags f) : QMessageBox(caption, text, icon, button0, button1, button2, parent, name, modal, f)\r
+{\r
+ _timer = new QTimer(this);\r
+ connect(_timer, SIGNAL(timeout()), this, SLOT(timeout()));\r
+}\r
+\r
+FNMessageBox::~FNMessageBox()\r
+{\r
+ delete _timer;\r
+}\r
+\r
+int FNMessageBox::information(QWidget* parent, const QString& caption, const QString& text, int button0, int button1, int button2)\r
+{\r
+ FNMessageBox dlg(caption, text, QMessageBox::Information, button0, button1, button2, parent);\r
+ dlg.show();\r
+ return dlg.exec();\r
+}\r
+\r
+int FNMessageBox::information(QWidget* parent, const QString& caption, const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text, int defaultButtonNumber, int escapeButtonNumber)\r
+{\r
+ int button0 = 0;\r
+ int button1 = 0;\r
+ int button2 = 0;\r
+ if (QString::null == button0Text) {\r
+ int id = Ok;\r
+ if (0 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (0 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button0 = id;\r
+ }\r
+ if (QString::null != button1Text) {\r
+ int id = Cancel;\r
+ if (1 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (1 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button1 = id;\r
+ }\r
+ if (QString::null != button2Text) {\r
+ int id = Abort;\r
+ if (2 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (2 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button2 = id;\r
+ }\r
+ FNMessageBox dlg(caption, text, QMessageBox::Information, button0, button1, button2, parent);\r
+ if (0 != button0) {\r
+ dlg.setButtonText(button0, button0Text);\r
+ }\r
+ if (0 != button1) {\r
+ dlg.setButtonText(button1, button1Text);\r
+ }\r
+ if (0 != button2) {\r
+ dlg.setButtonText(button2, button2Text);\r
+ }\r
+ dlg.show();\r
+ return dlg.exec();\r
+}\r
+\r
+int FNMessageBox::warning(QWidget* parent, const QString& caption, const QString& text, int button0, int button1, int button2)\r
+{\r
+ FNMessageBox dlg(caption, text, QMessageBox::Warning, button0, button1, button2, parent);\r
+ dlg.show();\r
+ return dlg.exec();\r
+}\r
+\r
+int FNMessageBox::warning(QWidget* parent, const QString& caption, const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text, int defaultButtonNumber, int escapeButtonNumber)\r
+{\r
+ int button0 = 0;\r
+ int button1 = 0;\r
+ int button2 = 0;\r
+ if (QString::null == button0Text) {\r
+ int id = Ok;\r
+ if (0 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (0 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button0 = id;\r
+ }\r
+ if (QString::null != button1Text) {\r
+ int id = Cancel;\r
+ if (1 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (1 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button1 = id;\r
+ }\r
+ if (QString::null != button2Text) {\r
+ int id = Abort;\r
+ if (2 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (2 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button2 = id;\r
+ }\r
+ FNMessageBox dlg(caption, text, QMessageBox::Warning, button0, button1, button2, parent);\r
+ if (0 != button0) {\r
+ dlg.setButtonText(button0, button0Text);\r
+ }\r
+ if (0 != button1) {\r
+ dlg.setButtonText(button1, button1Text);\r
+ }\r
+ if (0 != button2) {\r
+ dlg.setButtonText(button2, button2Text);\r
+ }\r
+ dlg.show();\r
+ return dlg.exec();\r
+}\r
+\r
+int FNMessageBox::critical(QWidget* parent, const QString& caption, const QString& text, int button0, int button1, int button2)\r
+{\r
+ FNMessageBox dlg(caption, text, QMessageBox::Critical, button0, button1, button2, parent);\r
+ dlg.show();\r
+ return dlg.exec();\r
+}\r
+\r
+int FNMessageBox::critical(QWidget* parent, const QString& caption, const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text, int defaultButtonNumber, int escapeButtonNumber)\r
+{\r
+ int button0 = 0;\r
+ int button1 = 0;\r
+ int button2 = 0;\r
+ if (QString::null == button0Text) {\r
+ int id = Ok;\r
+ if (0 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (0 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button0 = id;\r
+ }\r
+ if (QString::null != button1Text) {\r
+ int id = Cancel;\r
+ if (1 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (1 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button1 = id;\r
+ }\r
+ if (QString::null != button2Text) {\r
+ int id = Abort;\r
+ if (2 == defaultButtonNumber) {\r
+ id += Default;\r
+ }\r
+ if (2 == escapeButtonNumber) {\r
+ id += Escape;\r
+ }\r
+ button2 = id;\r
+ }\r
+ FNMessageBox dlg(caption, text, QMessageBox::Critical, button0, button1, button2, parent);\r
+ if (0 != button0) {\r
+ dlg.setButtonText(button0, button0Text);\r
+ }\r
+ if (0 != button1) {\r
+ dlg.setButtonText(button1, button1Text);\r
+ }\r
+ if (0 != button2) {\r
+ dlg.setButtonText(button2, button2Text);\r
+ }\r
+ dlg.show();\r
+ return dlg.exec();\r
+}\r
+\r
+void FNMessageBox::about(QWidget* parent, const QString& caption, const QString& text)\r
+{\r
+ FNMessageBox dlg(caption, text, QMessageBox::NoIcon, 0, 0, 0, parent);\r
+ dlg.show();\r
+ dlg.exec();\r
+}\r
+\r
+void FNMessageBox::about(QWidget* parent, const QString& caption)\r
+{\r
+ FNMessageBox dlg(caption, QString::null, QMessageBox::NoIcon, 0, 0, 0, parent);\r
+ dlg.show();\r
+ dlg.exec();\r
+}\r
+\r
+void FNMessageBox::setTiming(const int v)\r
+{\r
+ ___fnmessagebox_timing = v;\r
+}\r
+\r
+void FNMessageBox::timeout() {\r
+ accept();\r
+}\r
+\r
+void FNMessageBox::showEvent(QShowEvent* ext)\r
+{\r
+ _timer->start(___fnmessagebox_timing, true);\r
+}\r
--- /dev/null
+/* FreeNote for Sharp SLA300, B500, C7x0, C860 Linux PDA
+ Copyright (C) 2003-2005 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
+
+ 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.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+/*
+2005/02/27 FreeNote 1.11.10pre
+\81EPDF\82Ì\8fo\97Í\8c`\8e®\82ð\88ê\95\94\95Ï\8dX
+\81E\83C\83\93\83|\81[\83g\8e\9e\82Ì\83o\83Ofix
+
+2005/01/04 FreeNote 1.11.6pre
+\81E\83J\81[\83u\83\82\81[\83h\82Å\82W\82Ì\8e\9a\82ª\82©\82¯\82é\82æ\82¤\82É\90®\8c`\83G\83\93\83W\83\93\82ð\89ü\91P
+
+2004/10/17 FreeNote 1.10.0\83\8a\83\8a\81[\83X
+2004/02/12 ver 1.7.1pre
+\81E\83t\83H\83\93\83g\8ed\97l\82Ì\95Ï\8dX
+\81E\83e\83L\83X\83g\8f\88\97\9d\82Ì\8d\82\91¬\89»
+\81E\83e\83L\83X\83g\83{\83b\83N\83X\82Ì\91½\8b@\94\\89»
+*/
+#include "fntextdialog.h"
+#include <stdio.h>
+#include <qcombobox.h>
+#include <qfontdatabase.h>
+#include <qcolor.h>
+#include <qtoolbutton.h>
+#include <qpalette.h>
+#include <qmultilineedit.h>
+#include "fncolordialog.h"
+
+FNTextDialog::FNTextDialog(const QString& fontname, FNColorDialog* dlg, QWidget* parent, const char* name )
+ :FNTextDialogBase(parent, name, true, 0), _pen(1), _colorSelector(dlg)
+{
+ static QFontDatabase fbase;
+ QValueList<int> sizes = fbase.pointSizes(fontname);
+ char buf[10];
+ for (uint i = 0; i < sizes.count(); ++i) {
+ sprintf(buf, "%d", sizes[i]);
+ cboFontSize->insertItem(buf);
+ }
+ lines->setFont(QFont(fontname, 20));
+}
+
+
+FNTextDialog::~FNTextDialog()
+{
+}
+
+void FNTextDialog::changeColor(QRgb c)
+{
+ fraColor->setBackgroundColor(QColor(c));
+ _pen.setColor(QColor(c));
+}
+
+void FNTextDialog::choose(int v)
+{
+ _pen.setWidth(v);
+}
+
+void FNTextDialog::btnColor_Clicked()
+{
+ _colorSelector->setColor(_pen.color());
+ _colorSelector->show();
+ if (_colorSelector->exec()) {
+ changeColor(_colorSelector->color().rgb());
+ }
+}
+
+void FNTextDialog::setPen(const QPen& pen)
+{
+ _pen = pen;
+ if (cboFontSize->count() <= (int)pen.width()) {
+ _pen.setWidth(cboFontSize->count()-1);
+ }
+ cboFontSize->setCurrentItem(_pen.width());
+ fraColor->setBackgroundColor(_pen.color());
+}
+
+const QPen& FNTextDialog::pen() const
+{
+ return _pen;
+}
--- /dev/null
+/* FreeNote for Sharp SLA300, B500, C7x0, C860 Linux PDA\r
+ Copyright (C) 2003-2005 Joe Kanemori.<kanemori@ymg.urban.ne.jp>\r
+\r
+ This program is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ This program is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with this program; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+*/\r
+/*\r
+2005/02/27 FreeNote 1.11.10pre\r
+\81EPDF\82Ì\8fo\97Í\8c`\8e®\82ð\88ê\95\94\95Ï\8dX\r
+\81E\83C\83\93\83|\81[\83g\8e\9e\82Ì\83o\83Ofix\r
+\r
+2005/01/04 FreeNote 1.11.6pre\r
+\81E\83J\81[\83u\83\82\81[\83h\82Å\82W\82Ì\8e\9a\82ª\82©\82¯\82é\82æ\82¤\82É\90®\8c`\83G\83\93\83W\83\93\82ð\89ü\91P\r
+\r
+2005/01/09 FNViewer \83W\83F\83X\83`\83\83\81[\97p\83\8d\83W\83b\83N\92Ç\89Á\r
+2004/10/17 FreeNote 1.10.0\83\8a\83\8a\81[\83X\r
+2003/12/16-19 FreeNote ver 1.5.5pre\r
+\81E\8bÈ\90ü\95`\89æ\83\8d\83W\83b\83N\82Ì\89ü\97Ç\r
+\r
+2003/12/14 FreeNote 1.5.4pre\r
+\81E\8bÈ\90ü\95`\89æ\83\8d\83W\83b\83N\82Ì\89ü\97Ç\r
+\r
+2003/11/30-2003/12/04 FreeNote 1.5.3pre\r
+\81E\83x\83W\83F\8aÖ\90\94\82Ì\83X\83y\83\8b\83~\83X\82ð\8fC\90³\r
+\r
+2003/11/16 FreeNote 1.5.2pre\r
+\81E\89~\95`\89æ\82Ì\83\8d\83W\83b\83N\82ð\92Ç\89Á\r
+\r
+2003/11/13 FreeNote 1.5.1pre\r
+\81E\83X\83\80\81[\83W\83\93\83O\92Ç\89Á\r
+2003/11/10-12\r
+\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á\r
+2003/11/09 \92Ç\89Á\r
+*/\r
+#include "fmtengine.h"\r
+#include <qpointarray.h>\r
+#include <qpe/qmath.h>\r
+#include <math.h>\r
+#include <qrect.h>\r
+#include <stdlib.h>\r
+\r
+int SNAP_SIZE = 32;\r
+int PHASE1_ANGLE = 30;\r
+int PHASE2_ANGLE = 30;\r
+double Surface(const QPoint& p1, const QPoint& p2)\r
+{\r
+ return 0.5 * abs(p1.x() * p2.y() - p1.y() * p2.x());\r
+}\r
+\r
+bool IsLinear(const QPoint& p1, const QPoint& p2, const QPoint& p3)\r
+{\r
+ double s1 = Surface(p1, p2);\r
+ double s2 = Surface(p2, p3);\r
+ double s3 = Surface(p1, p3);\r
+ if (s1 + s2 == s3) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+}\r
+\r
+const double Angle(const QPoint& p1, const QPoint& p2)\r
+{\r
+ return qATan2((double)(p2.y() - p1.y()), (double)(p2.x() - p1.x()));\r
+}\r
+\r
+const double DiffAngle(double a1, double a2)\r
+{\r
+ if (0.0 > a1) {\r
+ a1 = 2 * M_PI + a1;\r
+ }\r
+ if (0.0 > a2) {\r
+ a2 = 2 * M_PI + a2;\r
+ }\r
+ return fabs(a1 - a2);\r
+}\r
+\r
+const double DiffAngle2(double a1, double a2)\r
+{\r
+ if (0.0 > a1) {\r
+ a1 = 360 + a1;\r
+ }\r
+ if (0.0 > a2) {\r
+ a2 = 360 + a2;\r
+ }\r
+ return fabs(a1 - a2);\r
+}\r
+\r
+const double DiffAngle(const QPoint& p1, const QPoint& p2, const QPoint& p3)\r
+{\r
+ return DiffAngle(Angle(p1, p2), Angle(p2, p3));\r
+}\r
+\r
+const double ToDegree(double t)\r
+{\r
+ return t * 180 / M_PI;\r
+}\r
+\r
+const double ToRadian(double d)\r
+{\r
+ return d * M_PI / 180;\r
+}\r
+\r
+const double Distance(const QPoint& p1, const QPoint& p2)\r
+{\r
+ return hypot(p1.x() - p2.x(), p1.y() - p2.y());\r
+}\r
+\r
+const QPoint SnapPoint(const QPoint& p, int snap)\r
+{\r
+ int x = ((int)(p.x() + snap / 2) / snap) * snap;\r
+ int y = ((int)(p.y() + snap / 2) / snap) * snap;\r
+ return QPoint(x, y);\r
+}\r
+const QPoint SnapPoint(const QPoint& p)\r
+{\r
+ return SnapPoint(p, SNAP_SIZE);\r
+}\r
+/*\r
+const QPoint SnapPoint(const QPoint& p)\r
+{\r
+ int x = ((int)(p.x() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;\r
+ int y = ((int)(p.y() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;\r
+ return QPoint(x, y);\r
+}\r
+*/\r
+\r
+const QPoint ArrangePoint(const QPoint& p1, const QPoint& p2)\r
+{\r
+ int x = p2.x();\r
+ int y = p2.y();\r
+ if (p1.x() - SNAP_SIZE / 2 <= x && p1.x() + SNAP_SIZE / 2 >= x) {\r
+ x = p1.x();\r
+ }\r
+ if (p1.y() - SNAP_SIZE / 2 <= y && p1.y() + SNAP_SIZE / 2 >= y) {\r
+ y = p1.y();\r
+ }\r
+ return QPoint(x, y);\r
+}\r
+\r
+FNPointList ReducePoints(FNPointList& p)\r
+{\r
+ if (2 >= p.count()) {\r
+ return p;\r
+ }\r
+ FNPointList rt;\r
+ rt.append(p.first());\r
+ QPoint* p1 = p.first();\r
+ QPoint* p2 = p.at(1);\r
+ QPoint* p3 = NULL;\r
+ for (uint i = 2; i < p.count(); ++i) {\r
+ p3 = p.at(i);\r
+ if (false == IsLinear(*p1, *p2, *p3)) {\r
+ rt.append(p2);\r
+ p1 = p2;\r
+ }\r
+ p2 = p3;\r
+ }\r
+ rt.append(p3);\r
+ return rt;\r
+}\r
+\r
+FNPointList ExtractAngle2(FNPointList& p, const int deg)\r
+{\r
+ FNPointList rt;\r
+ rt.append(p.first());\r
+ QPoint* st = p.first();\r
+ QPoint* mp = p.at(1);\r
+ QPoint* ed = p.last();\r
+ for (uint i = 2; i < p.count(); ++i) {\r
+ ed = p.at(i);\r
+ if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) {\r
+ st = mp;\r
+ rt.append(mp);\r
+ }\r
+ mp = ed;\r
+ }\r
+ rt.append(ed);\r
+ return rt;\r
+}\r
+\r
+FNPointList ExtractAngle(FNPointList& p, const int deg)\r
+{\r
+ FNPointList rt;\r
+ rt.append(p.first());\r
+ QPoint* st = p.first();\r
+ QPoint* mp = p.at(1);\r
+ QPoint* ed = p.last();\r
+ for (uint i = 2; i < p.count(); ++i) {\r
+ ed = p.at(i);\r
+ if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) {\r
+ st = mp;\r
+ rt.append(mp); \r
+ }\r
+ mp = ed;\r
+ }\r
+ if (SNAP_SIZE / 2 > Distance(*p.first(), *p.last()) && 3 < p.count()) {\r
+ rt.append(p.first());\r
+ } else {\r
+ rt.append(ed);\r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList SumupPoints(FNPointList& p)\r
+{\r
+ if (3 >= p.count()) {\r
+ return p;\r
+ }\r
+ FNPointList rt;\r
+ rt.append(p.first());\r
+ QPoint* p1 = p.first();\r
+ QPoint* p2 = NULL;\r
+ double pred = 0;\r
+ for (uint i = 1; i < p.count() - 1; ++i) {\r
+ p2 = p.at(i);\r
+ double d = Distance(*p1, *p2);\r
+ if (SNAP_SIZE / 2 < d || pred > d) {\r
+ rt.append(p2);\r
+ p1 = p2;\r
+ d = 0;\r
+ }\r
+ pred = d;\r
+ }\r
+ rt.append(p.last());\r
+ return rt;\r
+}\r
+\r
+FNPointList SnapPoints(FNPointList& p)\r
+{\r
+ FNPointList rt;\r
+ for (uint i = 0; i < p.count(); ++i) {\r
+ QPoint tp = SnapPoint(*p.at(i));\r
+ p.at(i)->setX(tp.x());\r
+ p.at(i)->setY(tp.y());\r
+ rt.append(p.at(i));\r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList ArrangePoints(FNPointList& p)\r
+{\r
+ if (3 >= p.count() && 2 != p.count()) {\r
+ return p;\r
+ }\r
+ FNPointList rt;\r
+ rt.append(p.first());\r
+ QPoint* p1 = p.first();\r
+ QPoint* p2 = NULL;\r
+ for (uint i = 1; i < p.count(); ++i) {\r
+ p2 = p.at(i);\r
+ QPoint tp = ArrangePoint(*p1, *p2);\r
+ p2->setX(tp.x());\r
+ p2->setY(tp.y());\r
+ rt.append(p2);\r
+ p1 = p2;\r
+ }\r
+ if (*p.first() == *p.last()) {\r
+ QPoint tp = ArrangePoint(*p1, *p.first());\r
+ rt.first()->setX(tp.x());\r
+ rt.first()->setY(tp.y());\r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList TuningPoints(FNPointList& p)\r
+{\r
+ FNPointList rt;\r
+ if (3 >= p.count()) {\r
+ for (uint i = 0; i < p.count(); ++i) {\r
+ rt.append(new QPoint(*p.at(i)));\r
+ }\r
+ return rt;\r
+ }\r
+ rt.append(new QPoint(*p.at(0)));\r
+ for (uint i = 1; i < p.count() - 1; ++i) {\r
+ QPoint* p1 = p.at(i);\r
+ QPoint* p2 = p.at(i + 1);\r
+ rt.append(new QPoint(*p1));\r
+ if (i < p.count() - 2) {\r
+ rt.append(new QPoint((p1->x() + p2->x())/2, (p1->y() + p2->y())/2));\r
+ }\r
+ }\r
+ rt.append(new QPoint(*p.at(p.count()-1)));\r
+ return rt;\r
+}\r
+\r
+FNPointList ToBezier(FNPointList& p) {\r
+ FNPointList rt;\r
+ rt.append(new QPoint(*p.at(0)));\r
+ for (uint i = 0; i < p.count() - 2; i += 2) {\r
+ int x1 = p.at(i)->x();\r
+ int xa = p.at(i + 1)->x();\r
+ int x4 = p.at(i + 2)->x();\r
+\r
+ int x2 = (x1 + xa) / 2;\r
+ int x3 = (xa + x4) / 2;\r
+ \r
+ int y1 = p.at(i)->y();\r
+ int ya = p.at(i + 1)->y();\r
+ int y4 = p.at(i + 2)->y();\r
+\r
+ int y2 = (y1 + ya) / 2;\r
+ int y3 = (ya + y4) / 2;\r
+ \r
+ rt.append(new QPoint(x2 ,y2));\r
+ rt.append(new QPoint(x3 ,y3));\r
+ rt.append(new QPoint(x4 ,y4));\r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList ToCurves(FNPointList& p) {\r
+ if (3 <= p.count()) {\r
+ //\83x\83W\83F\82É\82æ\82é\95â\8a® \r
+ return ToBezier(p);\r
+ } else {\r
+ FNPointList rt;\r
+ for (uint i = 0; i < p.count(); ++i) {\r
+ rt.append(new QPoint(*p.at(i)));\r
+ }\r
+ return rt;\r
+ }\r
+}\r
+\r
+FNPointList AutoFormat(FNPointList& p)\r
+{\r
+ FNPointList tp = ExtractAngle(p, PHASE1_ANGLE);\r
+ uint n;\r
+ do {\r
+ n = tp.count();\r
+ tp = SumupPoints(tp);\r
+ tp = ExtractAngle(tp, PHASE1_ANGLE);\r
+ tp = ArrangePoints(tp);\r
+ } while (n > tp.count());\r
+ tp = SnapPoints(tp);\r
+ tp = ReducePoints(tp);\r
+ FNPointList rt;\r
+ if (2 == tp.count()) {\r
+ if (*tp.first() == *tp.last()) {\r
+ return rt;\r
+ }\r
+ }\r
+ for (uint i = 0; i < tp.count(); ++i) {\r
+ rt.append(new QPoint(*tp.at(i)));\r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList ToEllipse(int x, int y, int w, int h) {\r
+ FNPointList rt;\r
+ QPointArray pa;\r
+ pa.makeEllipse(x, y, w, h);\r
+ for (uint i = 0; i < pa.count(); ++i) {\r
+ rt.append(new QPoint(pa.point(i)));\r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList AutoCurve(FNPointList& p)\r
+{\r
+ FNPointList tp2;\r
+ tp2.setAutoDelete(true); \r
+ FNPointList tp4;\r
+ tp4.setAutoDelete(true); \r
+ /*\r
+ QPoint sp = SnapPoint(*p.at(0));\r
+ QPoint ep = SnapPoint(*p.at(p.count()-1));\r
+ if (sp == ep) {\r
+ //\91È\89~\r
+ int sx = p.at(0)->x();\r
+ int sy = p.at(0)->y();\r
+ int ex = sx;\r
+ int ey = sy;\r
+ for (uint i = 1; i < p.count(); ++i) {\r
+ QPoint tp = *p.at(i);\r
+ if (sx > tp.x()) {\r
+ sx = tp.x();\r
+ } else if (ex < tp.x()) {\r
+ ex = tp.x();\r
+ }\r
+ if (sy > tp.y()) {\r
+ sy = tp.y();\r
+ } else if (ey < tp.y()) {\r
+ ey = tp.y();\r
+ }\r
+ }\r
+ sp = SnapPoint(QPoint(sx, sy));\r
+ ep = SnapPoint(QPoint(ex, ey));\r
+ tp2.append(new QPoint(sp.x(), sp.y()));\r
+ tp2.append(new QPoint(ep.x(), ep.y()));\r
+ } else {\r
+ */\r
+ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE);\r
+ uint n;\r
+ do {\r
+ n = tp.count();\r
+ tp = SumupPoints(tp);\r
+ tp = ExtractAngle2(tp, PHASE2_ANGLE);\r
+ tp = SnapPoints(tp);\r
+ } while (n > tp.count());\r
+ tp = SumupPoints(tp);\r
+ tp = ReducePoints(tp);\r
+ tp4 = TuningPoints(tp);\r
+ tp2 = ToCurves(tp4);\r
+ //}\r
+ FNPointList rt;\r
+ if (2 == tp2.count()) {\r
+ if (*tp2.first() == *tp2.last()) { \r
+ return rt;\r
+ }\r
+ }\r
+ for (uint i = 0; i < tp2.count(); ++i) {\r
+ rt.append(new QPoint(*tp2.at(i))); \r
+ }\r
+ return rt;\r
+}\r
+\r
+FNPointList Smoothing(FNPointList& p)\r
+{\r
+ int tsnap = SNAP_SIZE;\r
+ SNAP_SIZE=8;\r
+ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE);\r
+ tp = SumupPoints(tp);\r
+ tp = ReducePoints(tp);\r
+ FNPointList tp4 = TuningPoints(tp);\r
+ tp4.setAutoDelete(true);\r
+ FNPointList tp2 = ToCurves(tp4);\r
+ tp2.setAutoDelete(true);\r
+ FNPointList rt;\r
+ for (uint i = 0; i < tp2.count(); ++i) {\r
+ rt.append(new QPoint(*tp2.at(i))); \r
+ }\r
+ SNAP_SIZE = tsnap;\r
+ return rt;\r
+}\r
+\r
+FNPointList Reduce(FNPointList& p)\r
+{\r
+ FNPointList tp = ReducePoints(p);\r
+ FNPointList rt;\r
+ for (uint i = 0; i < tp.count(); ++i) {\r
+ rt.append(new QPoint(*tp.at(i))); \r
+ }\r
+ return rt;\r
+}\r
+\r
+QRect GetBounds(FNPointList& v)\r
+{\r
+ if (1 > v.count()) {\r
+ return QRect(0, 0, 1, 1);\r
+ }\r
+ QPoint sp = *v.at(0);\r
+ QPoint ep = sp;\r
+ for (uint i = 1; i < v.count(); ++i) {\r
+ QPoint& p = *v.at(i);\r
+ if (sp.x() > p.x()) {\r
+ sp.setX(p.x());\r
+ }\r
+ if (sp.y() > p.y()) {\r
+ sp.setY(p.y());\r
+ }\r
+ if (ep.x() < p.x()) {\r
+ ep.setX(p.x());\r
+ }\r
+ if (ep.y() < p.y()) {\r
+ ep.setY(p.y());\r
+ }\r
+ }\r
+ return QRect(sp, ep);\r
+}\r
+\r
+FNPointList Translate(FNPointList& v, int x, int y, double xs, double ys)\r
+{\r
+ FNPointList rt;\r
+ for (uint i = 0; i < v.count(); ++i) {\r
+ QPoint& p = *v.at(i);\r
+ int X = (int)((p.x() - x) * xs);\r
+ int Y = (int)((p.y() - y) * ys);\r
+ rt.append(new QPoint(X, Y));\r
+ }\r
+ return rt;\r
+}\r
+\r
+double ToStrokeDeg(double v)\r
+{\r
+ double d = ((int)(v * 10 / 225)) * 22.5;\r
+ return d;\r
+}\r
+\r
+int sign(int v)\r
+{\r
+ if (0 > v) {\r
+ return -1;\r
+ } else if (0 < v) {\r
+ return 1;\r
+ } else {\r
+ return 0;\r
+ }\r
+};\r
+\r
--- /dev/null
+/* FreeNote for Sharp SLA300, B500, C7x0, C860 Linux PDA
+ Copyright (C) 2003-2005 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
+
+ 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 Foundatibannwaon; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+/*
+2005/07/12 FreeNote 1.12.0
+\81EFix\83\8a\83\8a\81[\83X
+
+2005/06/04 FreeNote 1.11.12pre
+\81E\83O\83\8a\83b\83h\82Ì\98g\90ü\82ð\8eÀ\8dÛ\82Ì\91I\91ð\94Í\88Í\82æ\82è\82à\91å\82«\82\95\\8e¦\82·\82é\82æ\82¤\82É\95Ï\8dX\81B
+\81E\94Í\88Í\91I\91ð\81A\83O\83\8a\83b\83h\81A\83K\83C\83h\81A\8cr\90ü\83J\83\89\81[\82Ì\83J\83X\83^\83}\83C\83Y\82ð\89Â\94\\82É\81B
+\81E\83J\83\89\81[\83s\83b\83J\81[\83\82\81[\83h\82Ì\92Ç\89Á
+
+2005/06/02 FreeNote 1.11.11Apre
+\81E\83e\83L\83X\83g\88Ú\93®\98g\82Ì\95s\8bï\8d\87\8fC\90³
+\81E\8cr\90ü\82ð\83O\83\8a\83b\83h\82Ì\82Q\94{\82Å\95\\8e¦\82·\82é\82æ\82¤\82É\95Ï\8dX
+\81E\8fÁ\82µ\83S\83\80\8e\9e\82Ì\94Í\88Í\8ew\92è\8e\9e\82É\81A\83y\83\93\83I\83t\82µ\82Ä\83\8f\83\93\83e\83\93\83|\82¨\82¢\82Ä\82©\82ç\94Í\88Í\8am\92è\82·\82é\82æ\82¤\82É\95Ï\8dX
+
+2005/03/18 FreeNote 1.11.10Bpre
+\81E\95`\89æ\82Ì\8dÅ\93K\89»
+
+2005/02/27 FreeNote 1.11.10pre
+\81EPDF\82Ì\8fo\97Í\8c`\8e®\82ð\88ê\95\94\95Ï\8dX
+\81E\83C\83\93\83|\81[\83g\8e\9e\82Ì\83o\83Ofix
+
+2005/01/04 FreeNote 1.11.6pre
+\81E\83J\81[\83u\83\82\81[\83h\82Å\82W\82Ì\8e\9a\82ª\82©\82¯\82é\82æ\82¤\82É\90®\8c`\83G\83\93\83W\83\93\82ð\89ü\91P
+
+2005/01/04 FreeNote 1.11.5Apre
+\81E\83o\83O\83t\83B\83b\83N\83X
+
+2004/12/25 FreeNote 1.11.5pre
+\81E\83\8c\83C\83\84\81[\8b@\94\\92Ç\89Á
+
+2004/10/17 FreeNote 1.10.0\83\8a\83\8a\81[\83X
+\81E\83c\81[\83\8b\8b@\94\\92Ç2004/08/26 ver 1.9.3Apre
+\81E\8cr\90ü\8b@\94\\82Ì\8fC\90³
+
+\81E\83c\81[\83\8b\8b@\94\\92Ç2004/08/26 ver 1.9.3pre
+\81E\8cr\90ü\8b@\94\\82ð\92Ç\89Á
+
+2004/06/19-25 ver 1.9.2pre
+\81Eqcop\91\95\94õ
+
+2004/05/19 ver 1.9.1pre
+\81EPDF\82Ì\83e\83L\83X\83g\82ðUnicode\82Ö\81B
+\81E\83I\83v\83V\83\87\83\93\82ÉPDF::Encode\8d\80\96Ú\82ð\92Ç\89Á\81B
+
+2004/02/26 ver 1.9.0pre
+\81E\83C\83\93\83|\81[\83g\8b@\94\
+
+2004/02/19 ver 1.8.0 fix.
+2004/02/16 ver 1.7.3pre
+\81E\95Ò\8fW\8b@\94\\8b\89»
+
+2004/02/14 ver 1.7.2pre
+\81E\8c\9f\8dõ\8b@\94\\92Ç\89Á
+
+2004/02/12 ver 1.7.1pre
+\81E\83t\83H\83\93\83g\8ed\97l\82Ì\95Ï\8dX
+\81E\83e\83L\83X\83g\8f\88\97\9d\82Ì\8d\82\91¬\89»
+\81E\83e\83L\83X\83g\83{\83b\83N\83X\82Ì\91½\8b@\94\\89»
+
+2004/02/10 ver 1.7.0pre
+\81E\95¶\8e\9a\93ü\97Í
+
+2003/12/21 ver 1.6.0
+\81E\83t\83\8d\81[\83e\83B\83\93\83O\83p\83\8c\83b\83g\82ª\96³\8cø\82Æ\82È\82Á\82Ä\82¢\82½\83o\83O\82ð\8fC\90³
+\81E\8b@\94\\82ð\82e\82\89\82\98
+
+2003/12/16-19 ver 1.5.5pre
+\81E\83y\83\93\95\9d\82Ì\8ag\92£(1-8)
+\81E\83A\83\93\83h\83D\81A\83\8a\83h\83D\82Ì\8eÀ\91\95
+\81E\83\81\83j\83\85\81[\82Ì\8f\88\97\9d\95û\96@\82ð\88ê\95\94\89ü\97Ç
+\81E\8d\82\91¬Quit\8eÀ\91\95
+
+2003/12/14 FreeNote 1.5.4pre
+\81E\83y\83\93\83T\83C\83Y\82ð\91I\91ð\89Â\94\\82É\81B
+
+2003/11/30-2003/12/04 FreeNote 1.5.3pre
+\81EExportPNG, ExportPDF\82Ì\8f\89\8aú\83t\83@\83C\83\8b\96¼\82ªfree\83t\83@\83C\83\8b\96¼\82É\89\88\82¤\82æ\82¤\82É\8fC\90³
+
+2003/11/16 FreeNote 1.5.2pre
+\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\8fC\90³
+\81@\89~\95`\89æ\82Ì\83\8d\83W\83b\83N\82ð\92Ç\89Á
+
+2003/11/10-12 ver 1.5.1pre
+\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á
+
+2003/11/09 ver 1.5.0pre
+\81E\8e©\93®\90®\8c`\83\82\81[\83h\92Ç\89Á
+
+2003/09/03 ver 1.3.4pre
+\81EUse all quadrant OFF\8e\9e\82É\95\\8e¦\88Ê\92u\82ª\83\8a\83Z\83b\83g\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\83o\83O\91Î\89\9e\81B
+
+2003/09/01-03 ver 1.3.3pre
+\81E\83X\83N\83\8d\81[\83\8b\82Ì\89ü\97Ç
+\81EUse all quadrant(\91S\8fÛ\8cÀ\82ð\8eg\97p\82·\82é)\83\81\83j\83\85\81[\82ð\92Ç\89Á
+
+2003/08/17-23 ver 1.3.0pre
+\81Eabout\82ð\95t\97^
+\81ECR\83{\83^\83\93\92Ç\89Á
+\81E\83X\83N\83\8d\81[\83\8b\83\82\81[\83h\82Ì\95Û\91¶
+\81E\83K\83C\83h\8fó\91Ô\82Ì\95Û\91¶
+
+2003/08/17 FreeNote 1.2.2\82ð\8cö\8aJ
+\81E\8ag\92£\8eq.free\82Ì\8e©\93®\95t\97^\82ª\8e¸\94s\82·\82é\83P\81[\83X\82ð\8fC\90³
+
+2003/08/15 FreeNote 1.2.1\82ð\8cö\8aJ
+\81E\95Û\91¶\8e\9e\82Ì\83o\83O\8fC\90³
+\81E\8a®\97¹\83_\83C\83A\83\8d\83O\82Ì\8e©\93®\8fÁ\8b\8e
+\81EPNG\83t\83@\83C\83\8b\82Ö\82Ì\8fo\97Í
+
+2003/08/15 FreeNote 1.2\82ð\8cö\8aJ
+\81E\83I\83v\83V\83\87\83\93\92Ç\89Á
+\81E\83X\83N\83\8d\81[\83\8b\83K\83C\83h
+\81EFree\83t\83@\83C\83\8b\8aÖ\98A\95t\82¯
+\81E\83A\83C\83R\83\93\82Ì\95Ï\8dX
+
+2003/08/05 FreeNote 1.1.1pre\82ð\8cö\8aJ
+\81E\8d\82\91¬\8bN\93®\8e\9e\82É\95Â\82¶\82½\8fó\91Ô\82ð\95Û\8e\9d
+\81E\95`\89æ\83\82\81[\83h\90Ø\91Ö\82¦\8e\9e\82É\8fÁ\82µ\83S\83\80\95\\8e¦
+\81E\95Û\91¶\8e\9e\8aÔ\92Z\8fk
+\81EView\83\82\81[\83h\82Ì\8b\93\93®\82ð\95Ï\8dX
+\81E\83\81\83j\83\85\81[\82Ì\8c©\82½\96Ú\82ð\95Ï\8dX
+*/
+#include "frmmain.h"
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <qpe/global.h>
+#include <qpe/qcopenvelope_qws.h>
+#include <qpe/applnk.h>
+#include <qpe/mimetype.h>
+
+#include <qapplication.h>
+#include <qtoolbutton.h>
+#include <qmessagebox.h>
+#include <qgrid.h>
+#include <qdir.h>
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qtextcodec.h>
+#include <qdatastream.h>
+#include <qpixmap.h>
+
+#include "fnfiledialog.h"
+#include "fniconset.h"
+#include "fmtengine.h"
+#include "fnmessagebox.h"
+#include "fnlayerdlg.h"
+#include "fnpolygon.h"
+
+#define VERSION "1.12.0"
+/*
+ * Constructs a FrmMain which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'
+ */
+FrmMain::FrmMain( QWidget* parent, const char* name, WFlags fl )
+ : QMainWindow( parent, name, fl ),
+ _drawMode(MODE_DRAW),
+ _scrollMode(AS_BOTH),
+ _useAllQuadrant(false),
+ _showRuler(false),
+ _isFullscreen(false),
+ _isLocked(true),
+ _isTinyPaging(false),
+ _isTracking(true)
+{
+ connect( qApp, SIGNAL(appMessage( const QCString&, const QByteArray&)), this, SLOT( qcop_receive( const QCString&, const QByteArray& )));
+ init();
+ setup();
+ setTitle();
+}
+
+void FrmMain::setup()
+{
+ _options.load();
+ setOptions(_options);
+}
+
+void FrmMain::qcop_receive(const QCString& msg, const QByteArray& data)
+{
+ QDataStream stream(data, IO_ReadOnly );
+
+ if (msg == "setPensize(int)") {
+ int v;
+ stream >> v;
+ if (0 <= v && v <= 8) {
+ penSelected(v);
+ }
+ } else if (msg == "setup()") {
+ setup();
+ } else if (msg == "modeChanged(int)") {
+ int v;
+ stream >> v;
+ if (0 <= v && v <= MODE_MAX) {
+ modeChanged(v);
+ }
+ } else if (msg == "changeColor(int,int,int)") {
+ int r;
+ int g;
+ int b;
+ stream >> r;
+ stream >> g;
+ stream >> b;
+ if (0 <= r && r <= 255 &&
+ 0 <= g && g <= 255 &&
+ 0 <= b && b <= 255)
+ {
+ changeColor(qRgb(r, g, b));
+ }
+ } else if (msg == "find()") {
+ _canvas->find();
+ } else if (msg == "undo()") {
+ undo();
+ } else if (msg == "redo()") {
+ _canvas->redo();
+ } else if (msg == "erase()") {
+ _canvas->erase();
+ } else if (msg == "copy()") {
+ _canvas->copy();
+ } else if (msg == "paste()") {
+ _canvas->paste();
+ } else if (msg == "clear()") {
+ clear();
+ } else if (msg == "CR()") {
+ hitRet();
+ } else if (msg == "setViewMode(int)") {
+ int v;
+ stream >> v;
+ if (0 == v) {
+ setViewMode(false);
+ } else {
+ setViewMode(true);
+ }
+ } else if (msg == "load(QString)") {
+ QString fname;
+ stream >> fname;
+ _canvas->load(QFileInfo(fname));
+ } else if (msg == "import(QString)") {
+ QString fname;
+ stream >> fname;
+ _canvas->import(QFileInfo(fname));
+ } else if (msg == "save(QString)") {
+ QString fname;
+ stream >> fname;
+ _canvas->save(QFileInfo(fname));
+ } else if (msg == "exportPDF(QString)") {
+ QString fname;
+ stream >> fname;
+ _canvas->exportPDF(QFileInfo(fname));
+ } else if (msg == "exportPNG(QString)") {
+ QString fname;
+ stream >> fname;
+ QPixmap save(_canvas->wbuffer());
+ _canvas->exportPNG(QFileInfo(fname), save);
+ } else if (msg == "tool(int)") {
+ int v;
+ stream >> v;
+ if (1 <= v && v <= 8) {
+ tool(v);
+ }
+ }
+}
+
+
+//\95`\89æ\83\82\81[\83h\82Ì\95Ï\8dX
+void FrmMain::modeChanged(int mode)
+{
+ _drawMode = mode;
+ _btnCopy->setEnabled(false);
+ //_btnPaste->setEnabled(false);
+ _btnPaste->setEnabled(true);
+ _btnRedo->setEnabled(true);
+ _btnUndo->setEnabled(true);
+ switch (_drawMode) {
+ case MODE_DRAW: //\95`\89æ
+ _menubar->changeItem(_id_mode, QPixmap((const char**)draw_xpm));
+ break;
+ case MODE_FORMAT: //\8e©\93®\90®\8c`
+ _menubar->changeItem(_id_mode, QPixmap((const char**)format_xpm));
+ break;
+ case MODE_CURVE: //\8bÈ\90ü\90®\8c`
+ _menubar->changeItem(_id_mode, QPixmap((const char**)curve_xpm));
+ break;
+ case MODE_SMOOTH: //\83X\83\80\81[\83W\83\93\83O
+ _menubar->changeItem(_id_mode, QPixmap((const char**)smooth_xpm));
+ break;
+ case MODE_TEXT: //\83e\83L\83X\83g
+ _menubar->changeItem(_id_mode, QPixmap((const char**)text_xpm));
+ break;
+ case MODE_ERASE: //\95Ò\8fW\83\82\81[\83h
+ _btnCopy->setEnabled(true);
+ _btnRedo->setEnabled(false);
+ _menubar->changeItem(_id_mode, QPixmap((const char**)eraser_xpm));
+ break;
+ case MODE_CPICK:
+ _menubar->changeItem(_id_mode, QPixmap((const char**)cpick_xpm));
+ break;
+ }
+ _canvas->modeChanged(_drawMode);
+}
+
+//\95`\89æ\83\82\81[\83h\82Ì\90Ø\82è\91Ö\82¦
+void FrmMain::modeMenuChanged(int id)
+{
+ modeChanged(_draw_menu->indexOf(id));
+}
+
+void FrmMain::tool(int id)
+{
+ QString home = getenv("HOME");
+ QString cmd = _options.toolScripts[id];
+ if (cmd == "") {
+ return;
+ }
+ QStringList token = QStringList::split(' ', cmd);
+ QDateTime dtime = QDateTime::currentDateTime();
+ QDate dt = dtime.date();
+ QTime tm = dtime.time();
+ char buf[32];
+ sprintf(buf, "%02d%02d%02d%02d%02d%02d", dt.year() % 100, dt.month(), dt.day(), tm.hour(), tm.minute(), tm.second());
+ QString wkdir = _options.wkdir;
+ if (false == QFileInfo(wkdir).isDir()) {
+ wkdir = home;
+ }
+ int st = 0;
+ for (uint i = st; i < token.count(); ++i) {
+ if (token[i] == "%file") {
+ save();
+ if (_prefile == "") {
+ return;
+ }
+ token[i] = _prefile;
+ } else if (token[i] == "%pdf") {
+ exportPDF();
+ if (_prepdf == "") {
+ return;
+ }
+ token[i] = _prepdf;
+ } else if (token[i] == "%png") {
+ exportPNG();
+ if (_prepng == "") {
+ return;
+ }
+ token[i] = _prepng;
+ } else if (token[i] == "%tmpfile") {
+ _canvas->save(QFileInfo(home + "/.tmp.free"));
+ token[i] = home + "/.tmp.free";
+ } else if (token[i] == "%tmppng") {
+ QPixmap save(_canvas->wbuffer());
+ _canvas->exportPNG(QFileInfo(home + "/.tmp.png"), save);
+ token[i] = home + "/.tmp.png";
+ } else if (token[i] == "%tmppdf") {
+ _canvas->exportPDF(QFileInfo(home + "/.tmp.pdf"));
+ token[i] = home + "/.tmp.pdf";
+ } else if (token[i] == "%newfile") {
+ token[i] = wkdir + "/" + buf +".free";
+ _canvas->save(QFileInfo(token[i]));
+ } else if (token[i] == "%newpng") {
+ QPixmap save(_canvas->wbuffer());
+ token[i] = wkdir + "/" + buf +".png";
+ _canvas->exportPNG(QFileInfo(token[i]), save);
+ } else if (token[i] == "%newpdf") {
+ token[i] = wkdir + "/" + buf +".pdf";
+ _canvas->exportPDF(QFileInfo(token[i]));
+ }
+ }
+
+ QFileInfo exefile(token[0]);
+ if (exefile.extension() == "desktop") {
+ const AppLnk *app= new AppLnk(exefile.absFilePath());
+ QStringList args;
+ for (uint i = 1; i < token.count(); ++i) {
+ args << token[i];
+ }
+ app->execute(args);
+ delete app;
+ showMinimized();
+ } else if (token[0] == "qcop") {
+ if (3 <= token.count()) {
+ QCopEnvelope qcop((const char*)token[1], (const char*)token[2]);
+ for (uint i = 3; i < token.count(); ++i) {
+ qcop << token[i];
+ }
+ }
+ } else {
+ QString args = token[0];
+ for (uint i = 1; i < token.count(); ++i) {
+ args += " ";
+ args += token[i];
+ }
+ //Global::invoke(args);
+ Global::execute(args);
+ }
+}
+
+//\83I\83v\83V\83\87\83\93\82Ì\90Ý\92è
+void FrmMain::setOptions(const FNOptionData& o)
+{
+ _tool_menu->changeItem(_id_tool1, "1:" + o.toolNames[0]);
+ _tool_menu->changeItem(_id_tool2, "2:" + o.toolNames[1]);
+ _tool_menu->changeItem(_id_tool3, "3:" + o.toolNames[2]);
+ _tool_menu->changeItem(_id_tool4, "4:" + o.toolNames[3]);
+ _tool_menu->changeItem(_id_tool5, "5:" + o.toolNames[4]);
+ _tool_menu->changeItem(_id_tool6, "6:" + o.toolNames[5]);
+ _tool_menu->changeItem(_id_tool7, "7:" + o.toolNames[6]);
+ _tool_menu->changeItem(_id_tool8, "8:" + o.toolNames[7]);
+
+ _canvas->setScrollTiming(o.timing);
+ _canvas->setVStep(o.v_step);
+ _canvas->setHStep(o.h_step);
+ _canvas->setSEraser(o.eraser_s);
+ _canvas->setLEraser(o.eraser_l);
+ _canvas->setMargin(o.margin);
+
+ _vscb->setPageStep(o.v_step);
+ _vscb->setLineStep(o.grid_size * 2);
+ _hscb->setPageStep(o.h_step);
+ _hscb->setLineStep(o.grid_size * 2);
+
+ SNAP_SIZE = o.grid_size;
+ PHASE1_ANGLE = o.phase1;
+ PHASE2_ANGLE = o.phase2;
+
+ if (o.isLMvAOn) {
+ _btnLMvA->show();
+ } else {
+ _btnLMvA->hide();
+ }
+ if (o.isLMvBOn) {
+ _btnLMvB->show();
+ } else {
+ _btnLMvB->hide();
+ }
+ if (o.isLAddOn) {
+ _btnLAdd->show();
+ } else {
+ _btnLAdd->hide();
+ }
+ if (o.isFindOn) {
+ _btnFind->show();
+ } else {
+ _btnFind->hide();
+ }
+
+ if (o.isMaximizedOn) {
+ _btnMaximized->show();
+ } else {
+ _btnMaximized->hide();
+ }
+
+ if (o.isCopyOn) {
+ _btnCopy->show();
+ } else {
+ _btnCopy->hide();
+ }
+
+ if (o.isPasteOn) {
+ _btnPaste->show();
+ } else {
+ _btnPaste->hide();
+ }
+
+ if (o.isImportOn) {
+ _btnImport->show();
+ } else {
+ _btnImport->hide();
+ }
+
+ if (o.isUndoOn) {
+ _btnUndo->show();
+ } else {
+ _btnUndo->hide();
+ }
+
+ if (o.isRedoOn) {
+ _btnRedo->show();
+ } else {
+ _btnRedo->hide();
+ }
+
+ if (o.isZoomOn) {
+ _btnZoom->show();
+ } else {
+ _btnZoom->hide();
+ }
+
+ if (o.isCROn) {
+ _btnRet->show();
+ } else {
+ _btnRet->hide();
+ }
+
+ if (o.isGuideOn) {
+ _btnGuide->show();
+ } else {
+ _btnGuide->hide();
+ }
+
+ if (o.isNewOn) {
+ _btnNew->show();
+ } else {
+ _btnNew->hide();
+ }
+
+ if (o.isClearOn) {
+ _btnClear->show();
+ } else {
+ _btnClear->hide();
+ }
+
+ if (o.isOpenOn) {
+ _btnLoad->show();
+ } else {
+ _btnLoad->hide();
+ }
+
+ if (o.isSaveOn) {
+ _btnSave->show();
+ } else {
+ _btnSave->hide();
+ }
+
+ if (o.isExportOn) {
+ _btnExportPDF->show();
+ } else {
+ _btnExportPDF->hide();
+ }
+
+ if (o.isExportPNGOn) {
+ _btnExportPNG->show();
+ } else {
+ _btnExportPNG->hide();
+ }
+
+ if (o.isLayerOn) {
+ _btnLayer->show();
+ } else {
+ _btnLayer->hide();
+ }
+
+ if (AS_HORIZONTAL == o.scrollMode) {
+ _as_horz->setOn(true);
+ } else if (AS_VERTICAL == o.scrollMode) {
+ _as_vert->setOn(true);
+ } else if (AS_BOTH == o.scrollMode) {
+ _as_both->setOn(true);
+ }
+ _btnGuide->setOn(o.isAutoScrollEnabled);
+ this->showGuide(o.isAutoScrollEnabled);
+ _canvas->setShowRuler(_showRuler = o.isShowRuler);
+ _canvas->setUseAllQuadrant(_useAllQuadrant = o.useAllQuadrant);
+ _scroll_menu->setItemChecked(_id_quadrant, _useAllQuadrant);
+ if (_useAllQuadrant) {
+ _vscb->setMinValue(-200);
+ _hscb->setMinValue(-200);
+ } else {
+ _vscb->setMinValue(0);
+ _hscb->setMinValue(0);
+ }
+ _scroll_menu->setItemChecked(_id_ruler, _showRuler);
+ _canvas->setEncode(o.encode);
+ _canvas->setFontName(o.fontname);
+ _canvas->setColorRevision(o.isColorRevision);
+ _canvas->setTxtBoxRect(o.txtBoxRect);
+ SelectionLineColor = o.selectionLineColor;
+ SelectionBrushColor = o.selectionBrushColor;
+ SelectionFrameColor = o.selectionFrameColor;
+ RulerColor = o.rulerColor;
+ GuideColor = o.guideColor;
+ GridColor = o.gridColor;
+
+ _canvas->redraw();
+}
+
+//\8cr\90ü\82ð\95\\8e¦\82·\82é\81i\83g\83O\83\8b\81j
+void FrmMain::showRuler()
+{
+ _showRuler = !_showRuler;
+ _canvas->setShowRuler(_showRuler);
+ _options.isShowRuler = _showRuler;
+ _scroll_menu->setItemChecked(_id_ruler, _showRuler);
+ _options.save();
+}
+
+//\91S\8fÛ\8cÀ\82ð\8eg\97p\82·\82é\81i\83g\83O\83\8b\81j
+void FrmMain::useAllQuadrant()
+{
+ _useAllQuadrant = !_useAllQuadrant;
+ if (_useAllQuadrant) {
+ _vscb->setMinValue(-200);
+ _hscb->setMinValue(-200);
+ } else {
+ _vscb->setMinValue(0);
+ _hscb->setMinValue(0);
+ }
+ _canvas->setUseAllQuadrant(_useAllQuadrant);
+ _scroll_menu->setItemChecked(_id_quadrant, _useAllQuadrant);
+ _options.useAllQuadrant = _useAllQuadrant;
+ _options.save();
+}
+
+//\83t\83@\83C\83\8b\82ð\93n\82µ\82Ä\83I\81[\83v\83\93
+void FrmMain::setDocument(const QString& fname)
+{
+ this->open(fname);
+}
+
+void FrmMain::showFullScreen()
+{
+ showNormal();
+ _isFullscreen = true;
+ QMainWindow::showFullScreen();
+}
+
+void FrmMain::changeColor(QRgb c)
+{
+ _btnColor->setBGColor(c);
+ _canvas->changeColor(c);
+}
+
+//\83r\83\85\81[\83\82\81[\83h\82Ì\90Ø\82è\91Ö\82¦
+void FrmMain::setViewMode(bool flg)
+{
+ if (MODE_ERASE == _drawMode) {
+ if (flg) {
+ _btnCopy->setEnabled(false);
+ _btnPaste->setEnabled(false);
+ _btnUndo->setEnabled(false);
+ _btnRedo->setEnabled(false);
+ } else {
+ _btnCopy->setEnabled(true);
+ _btnPaste->setEnabled(true);
+ _btnUndo->setEnabled(true);
+ }
+ } else {
+ _btnCopy->setEnabled(false);
+ _btnPaste->setEnabled(true);
+ _btnUndo->setEnabled(true);
+ _btnRedo->setEnabled(true);
+ }
+ _canvas->viewChanged(flg);
+ _vscb->setEnabled(!flg);
+ _hscb->setEnabled(!flg);
+}
+
+//\8f\89\8aú\90Ý\92è
+void FrmMain::init()
+{
+ _colorSelector = new FNColorDialog(this);
+ QGrid* grid = new QGrid(2, this);
+ _canvas = new FNCanvas(_colorSelector, grid);
+ _canvas->resize(240, 320);
+ _vscb = new QScrollBar(0, 960, 10, 100, 0, Qt::Vertical, grid);
+ _hscb = new QScrollBar(0, 960, 10, 100, 0, Qt::Horizontal, grid);
+ this->setCentralWidget(grid);
+ this->setToolBarsMovable(false);
+ connect(_vscb, SIGNAL(valueChanged(int)), this, SLOT(scroll()));
+ connect(_hscb, SIGNAL(valueChanged(int)), this, SLOT(scroll()));
+ connect(_canvas, SIGNAL(originChanged(int, int)), this, SLOT( scrollbarChange(int, int)));
+ //\83\81\83j\83\85\81[\82Ì\8d\\92z
+ bool isVGA = false;
+ if (320 < QApplication::desktop()->width()) {
+ isVGA = true;
+ }
+
+ _page_tool = new QPEToolBar(this);
+ _page_tool->setHorizontalStretchable(true);
+
+ _btnColor = new FNColorPalette(black, _page_tool);
+ _chkFill = new QCheckBox(_page_tool);
+ _chkFill->setText("F");
+ _chkFill->setFocusPolicy(NoFocus);
+ _page_tool->addSeparator();
+ if (isVGA) {
+ _btnColor->setMinimumSize(48, 32);
+ _btnColor->setMaximumSize(48, 32);
+ } else {
+ _btnColor->setMinimumSize(24, 18);
+ _btnColor->setMaximumSize(24, 18);
+ }
+ _btnLMvA = newToolButton(_page_tool, (const char**)movetoabove_xpm, "move to above layer", isVGA);
+ _btnLMvB = newToolButton(_page_tool, (const char**)movetobelow_xpm, "move to below layer", isVGA);
+ _btnLAdd = newToolButton(_page_tool, (const char**)addlayer_xpm, "add new layer", isVGA);
+ _btnFind = newToolButton(_page_tool, (const char**)find_xpm, "find", isVGA);
+ _btnMaximized = newToolButton(_page_tool, (const char **)maximized_xpm, "maximized", isVGA);
+ _btnCopy = newToolButton(_page_tool, (const char**)copy_xpm, "copy", isVGA);
+ _btnPaste = newToolButton(_page_tool, (const char**)paste_xpm, "paste", isVGA);
+ _btnImport = newToolButton(_page_tool, (const char**)import_xpm, "import", isVGA);
+ _btnUndo = newToolButton(_page_tool, (const char**)undo_xpm, "undo", isVGA);
+ _btnRedo = newToolButton(_page_tool, (const char**)redo_xpm, "redo", isVGA);
+ //_btnColor = newToolButton(_page_tool, (const char **)color_xpm, "select color", isVGA);
+
+ _btnZoom = newToolButton(_page_tool, (const char **)zoom_xpm, "zoom", isVGA, true, false, 48);
+ _btnRet = newToolButton(_page_tool, (const char**)ret_xpm, "return", isVGA);
+ _btnGuide = newToolButton(_page_tool, (const char **)guide_xpm, "scroll guide", isVGA, true);
+ _btnNew = newToolButton(_page_tool, (const char **)new_xpm, "new page", isVGA);
+ _btnClear = newToolButton(_page_tool, (const char **)clear_xpm, "clear page", isVGA);
+ _btnLoad = newToolButton(_page_tool, (const char **)open_xpm, "load page", isVGA);
+ _btnSave = newToolButton(_page_tool, (const char **)save_xpm, "save page", isVGA);
+ _btnExportPDF = newToolButton(_page_tool, (const char **)pdf_xpm, "export PDF", isVGA);
+ _btnExportPNG = newToolButton(_page_tool, (const char **)png_xpm, "export PNG", isVGA);
+ _btnLayer = newToolButton(_page_tool, (const char**)layer_xpm, "layer on", isVGA);
+
+ connect(_btnLMvA, SIGNAL(clicked()), this, SLOT(moveAboveLayer()));
+ connect(_btnLMvB, SIGNAL(clicked()), this, SLOT(moveBelowLayer()));
+ connect(_btnLAdd, SIGNAL(clicked()), this, SLOT(addLayer()));
+ connect(_btnFind, SIGNAL(clicked()), _canvas, SLOT(find()));
+ connect(_btnColor, SIGNAL(clicked(FNPaletteBase*)), this, SLOT(colorSelectorPopup()));
+
+ connect(_btnRet, SIGNAL(clicked()), this, SLOT(hitRet()));
+ connect(_btnSave, SIGNAL(clicked()), this, SLOT(save()));
+ connect(_btnLoad, SIGNAL(clicked()), this, SLOT(load()));
+ connect(_btnNew, SIGNAL(clicked()), this, SLOT(newPage()));
+ connect(_btnClear, SIGNAL(clicked()), this, SLOT(clear()));
+ connect(_btnExportPDF, SIGNAL(clicked()), this, SLOT(exportPDF()));
+ connect(_btnExportPNG, SIGNAL(clicked()), this, SLOT(exportPNG()));
+ connect(_btnLayer, SIGNAL(clicked()), this, SLOT(showLayer()));
+
+ connect(_btnMaximized, SIGNAL(clicked()), this, SLOT(showFullScreen()));
+ connect(_btnZoom, SIGNAL(toggled(bool)), this, SLOT(setViewMode(bool)));
+ connect(_btnCopy, SIGNAL(clicked()), _canvas, SLOT(copy()));
+ connect(_btnPaste, SIGNAL(clicked()), _canvas, SLOT(paste()));
+ connect(_btnImport, SIGNAL(clicked()), this, SLOT(import()));
+ connect(_btnUndo, SIGNAL(clicked()), this, SLOT(undo()));
+ connect(_btnRedo, SIGNAL(clicked()), _canvas, SLOT(redo()));
+ connect(_btnGuide, SIGNAL(toggled(bool)), this, SLOT(showGuide(bool)));
+ connect(_canvas, SIGNAL(resetViewMode()), _btnZoom, SLOT(toggle()));
+ connect(_chkFill, SIGNAL(toggled(bool)), _canvas, SLOT(fillChanged(bool)));
+ connect(_canvas, SIGNAL(pickColor(QRgb)), this, SLOT(changeColor(QRgb)));
+
+ _scroll_menu = new QPopupMenu();
+ QActionGroup* scroll_action_group = new QActionGroup(_scroll_menu, "scroll actions", true);
+ scroll_action_group->insert(_as_horz = new QAction("horz", "&Horizontal", 0, scroll_action_group, 0, true));
+ scroll_action_group->insert(_as_vert = new QAction("vert", "&Vertical", 0, scroll_action_group, 0, true));
+ scroll_action_group->insert(_as_both = new QAction("both", "&Both", 0, scroll_action_group, 0, true));
+ _as_both->setOn(true);
+ _id_guide = _scroll_menu->insertItem("&Guide", _btnGuide, SLOT(toggle()), CTRL + Key_G);
+ _id_ruler = _scroll_menu->insertItem("show &Ruler", this, SLOT(showRuler()), CTRL + Key_K);
+ _id_quadrant = _scroll_menu->insertItem("&Use all quadrant", this, SLOT(useAllQuadrant()), CTRL + Key_U);
+ _scroll_menu->insertSeparator();
+ scroll_action_group->addTo(_scroll_menu);
+ connect(scroll_action_group, SIGNAL(selected(QAction*)), this, SLOT(scroll_menu_selected(QAction*)));
+
+ _main_menu = new QPopupMenu();
+ _main_menu->setCheckable(true);
+
+ _edit_menu = new QPopupMenu();
+ _edit_menu->insertItem("&Copy", _canvas, SLOT(copy()), CTRL + Key_C);
+ _edit_menu->insertItem("&Paste", _canvas, SLOT(paste()), CTRL + Key_V);
+ _edit_menu->insertItem("&Undo", this, SLOT(undo()), CTRL + Key_Z);
+ _edit_menu->insertItem("&Redo", _canvas, SLOT(redo()), CTRL + Key_Y);
+ _edit_menu->insertItem("&Find", _canvas, SLOT(find()), CTRL + Key_F);
+
+ _main_menu->insertItem("&Edit", _edit_menu);
+
+ _layer_menu = new QPopupMenu();
+ _layer_menu->insertItem("show", this, SLOT(showLayer()), CTRL + Key_B);
+ _layer_menu->insertItem("move above", this, SLOT(moveAboveLayer()), Key_A);
+ _layer_menu->insertItem("move below", this, SLOT(moveBelowLayer()), Key_Z);
+ _layer_menu->insertItem("add layer", this, SLOT(addLayer()), CTRL + Key_A);
+ _id_tinyPaging = _layer_menu->insertItem("tiny paging mode", this, SLOT(toggleTinyPaging()), CTRL + Key_T);
+ _main_menu->insertItem("&Layer", _layer_menu);
+
+
+ _tool_menu = new QPopupMenu();
+ _id_tool1 = _tool_menu->insertItem("1:", this, SLOT(tool1()), CTRL + Key_1);
+ _id_tool2 = _tool_menu->insertItem("2:", this, SLOT(tool2()), CTRL + Key_2);
+ _id_tool3 = _tool_menu->insertItem("3:", this, SLOT(tool3()), CTRL + Key_3);
+ _id_tool4 = _tool_menu->insertItem("4:", this, SLOT(tool4()), CTRL + Key_4);
+ _id_tool5 = _tool_menu->insertItem("5:", this, SLOT(tool5()), CTRL + Key_5);
+ _id_tool6 = _tool_menu->insertItem("6:", this, SLOT(tool6()), CTRL + Key_6);
+ _id_tool7 = _tool_menu->insertItem("7:", this, SLOT(tool7()), CTRL + Key_7);
+ _id_tool8 = _tool_menu->insertItem("8:", this, SLOT(tool8()), CTRL + Key_8);
+ _main_menu->insertItem("&Tool", _tool_menu);
+
+ _main_menu->insertItem("&Zoom", _btnZoom, SLOT(toggle()), Key_Tab);
+ _main_menu->insertItem("&Maximize", this, SLOT(showFullScreen()), CTRL + Key_M);
+ _main_menu->insertItem("&Normalize", this, SLOT(showNormal()), CTRL + Key_R);
+ _main_menu->insertSeparator();
+
+ _main_menu->insertItem("&Scroll", _scroll_menu);
+ _main_menu->insertSeparator();
+
+ _file_menu = new QPopupMenu();
+ _file_menu->setCheckable(true);
+ _file_menu->insertItem("&New", this, SLOT(newPage()), CTRL + Key_N);
+ _file_menu->insertItem("&Clear", this, SLOT(clear()), CTRL + Key_L);
+ _file_menu->insertItem("&Import", this, SLOT(import()), CTRL + Key_I);
+ _file_menu->insertItem("&Load", this, SLOT(load()), CTRL + Key_O);
+ _file_menu->insertItem("&Save", this, SLOT(save()), CTRL + Key_S);
+ _file_menu->insertItem("save &As", this, SLOT(saveAs()));
+ _main_menu->insertItem("&File", _file_menu);
+
+ _export_menu = new QPopupMenu();
+ _export_menu->setCheckable(true);
+ _export_menu->insertItem("PDF", this, SLOT(exportPDF()), CTRL + Key_P);
+ _export_menu->insertItem("PNG", this, SLOT(exportPNG()), CTRL + Key_E);
+ _export_menu->insertSeparator();
+ _id_saveNPdf = _export_menu->insertItem("save with pdf", this, SLOT(toggleSaveNPdf()));
+
+ _main_menu->insertItem("&Export", _export_menu);
+ _main_menu->insertSeparator();
+ _main_menu->insertItem("&Quit", this, SLOT(quit()), Key_Escape);
+ _main_menu->insertSeparator();
+ _main_menu->insertItem("&About", this, SLOT(about()));
+
+ _menubar = new QPEMenuBar(this);
+ _menubar->insertItem("&Menu", _main_menu);
+
+ _draw_menu = new QPopupMenu();
+ int id_draw;
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)draw_xpm)), "&Draw");
+ _draw_menu->setAccel(Key_D, id_draw);
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)format_xpm)), "Auto&Format");
+ _draw_menu->setAccel(Key_F, id_draw);
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)curve_xpm)), "Auto&Curve");
+ _draw_menu->setAccel(Key_C, id_draw);
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)smooth_xpm)), "&Smooth");
+ _draw_menu->setAccel(Key_S, id_draw);
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)text_xpm)), "&Text");
+ _draw_menu->setAccel(Key_T, id_draw);
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)eraser_xpm)), "&Eraser");
+ _draw_menu->setAccel(Key_E, id_draw);
+ id_draw = _draw_menu->insertItem(QIconSet(QPixmap((const char**)cpick_xpm)), "Color&Picker");
+ _draw_menu->setAccel(Key_P, id_draw);
+ _id_mode = _menubar->insertItem(QPixmap((const char**)draw_xpm), _draw_menu);
+ connect(_draw_menu, SIGNAL(activated(int)), this, SLOT(modeMenuChanged(int)));
+ connect(_canvas, SIGNAL(changeMode(int)), this, SLOT(modeChanged(int)));
+
+ _pen_menu = new QPopupMenu();
+ for (int i = 0; i < 8; ++i) {
+ char buf[5];
+ sprintf(buf, "%dpts.", (i + 1));
+ int id = _pen_menu->insertItem(QIconSet(makePenPixmap(i + 1)), buf);
+ _pen_menu->setAccel(Key_1 + i, id);
+ }
+ _id_pen = _menubar->insertItem(makePenPixmap(1), _pen_menu);
+ connect(_pen_menu, SIGNAL(activated(int)), this, SLOT(penSelected(int)));
+ _menubar->insertItem(_page_tool);
+ _btnCopy->setEnabled(false);
+ _btnPaste->setEnabled(true);
+ _title = "";
+}
+
+void FrmMain::undo()
+{
+ _canvas->undo();
+ setTitle();
+}
+
+void FrmMain::addLayer()
+{
+ _canvas->addLayer();
+ setTitle();
+}
+
+void FrmMain::moveAboveLayer()
+{
+ _canvas->moveAboveLayer();
+ setTitle();
+}
+
+void FrmMain::moveBelowLayer()
+{
+ _canvas->moveBelowLayer();
+ setTitle();
+}
+
+//\8aÈ\88Õ\83y\81[\83W\83\82\81[\83h\82ð\90Ø\82è\91Ö\82¦\82é
+void FrmMain::toggleTinyPaging()
+{
+ bool f = _canvas->isTinyPaging();
+ _canvas->setTinyPaging(!f);
+ setTitle();
+}
+
+
+//\83y\83\93\89æ\91\9c\82Ì\8dì\90¬
+QPixmap FrmMain::makePenPixmap(int n)
+{
+ const char** icons[] = {
+ (const char**)pt1_xpm,
+ (const char**)pt2_xpm,
+ (const char**)pt3_xpm,
+ (const char**)pt4_xpm,
+ (const char**)pt5_xpm,
+ (const char**)pt6_xpm,
+ (const char**)pt7_xpm,
+ (const char**)pt8_xpm,
+ };
+ QPixmap pt(icons[n - 1]);
+ QImage mask = pt.mask()->convertToImage();
+ pt = pt.convertToImage().smoothScale(32/*48*/, 16);
+ QBitmap msk;
+ msk = mask.smoothScale(32/*48*/, 16);
+ pt.setMask(msk);
+ return pt;
+}
+
+//\83y\83\93\82Ì\91I\91ð
+void FrmMain::penSelected(int id)
+{
+ int idx = _pen_menu->indexOf(id);
+ if (-1 != idx) {
+ _menubar->changeItem(_id_pen, makePenPixmap(idx + 1));
+ _canvas->setPensize(idx + 1);
+ }
+}
+
+//Save with PDF\82Ì\90Ø\82è\91Ö\82¦
+void FrmMain::toggleSaveNPdf()
+{
+ if (_export_menu->isItemChecked(_id_saveNPdf)) {
+ _export_menu->setItemChecked(_id_saveNPdf, false);
+ } else {
+ _export_menu->setItemChecked(_id_saveNPdf, true);
+ }
+}
+
+//\83c\81[\83\8b\83{\83^\83\93\82Ì\8dì\90¬
+QToolButton* FrmMain::newToolButton(QWidget* parent, const char** icon1, const char** icon2, const QString& textLabel, const bool isVGA, const bool isToggle, const bool isOn, const int width)
+{
+ QToolButton* btn = new QToolButton(parent);
+ if (isVGA) {
+ btn->setMinimumSize(width, 32);
+ btn->setMaximumSize(width, 32);
+ } else {
+ btn->setMinimumSize(18, 18);
+ btn->setMaximumSize(18, 18);
+ }
+ btn->setOnIconSet(QIconSet(QPixmap(icon1)));
+ btn->setOffIconSet(QIconSet(QPixmap(icon2)));
+ btn->setToggleButton(isToggle);
+ btn->setOn(isOn);
+ btn->setTextLabel(textLabel);
+ btn->setAutoRaise(false);
+
+ return btn;
+}
+
+//\83c\81[\83\8b\83{\83^\83\93\82Ì\8dì\90¬
+QToolButton* FrmMain::newToolButton(QWidget* parent, const char** icon, const QString& textLabel, const bool isVGA, const bool isToggle, const bool isOn, const int width)
+{
+ QToolButton* btn = new QToolButton(parent);
+ if (isVGA) {
+ btn->setMinimumSize(width, 32);
+ btn->setMaximumSize(width, 32);
+ } else {
+ btn->setMinimumSize(20, 20);
+ btn->setMaximumSize(20, 20);
+ }
+ btn->setPixmap(QPixmap(icon));
+ btn->setToggleButton(isToggle);
+ btn->setOn(isOn);
+ btn->setTextLabel(textLabel);
+ btn->setAutoRaise(false);
+
+ return btn;
+}
+
+//\83X\83N\83\8d\81[\83\8b\83\81\83j\83\85\81[\82Ì\91I\91ð
+void FrmMain::scroll_menu_selected(QAction* act)
+{
+ if (act->text() == "horz") {
+ _options.scrollMode = _scrollMode = AS_HORIZONTAL;
+ } else if (act->text() == "vert") {
+ _options.scrollMode = _scrollMode = AS_VERTICAL;
+ } else if (act->text() == "both") {
+ _options.scrollMode = _scrollMode = AS_BOTH;
+ }
+ _options.save();
+ if (_btnGuide->isOn()) {
+ _canvas->setScrollMode(_scrollMode);
+ }
+}
+
+//\83K\83C\83h\82Ì\95\\8e¦
+void FrmMain::showGuide(bool flg)
+{
+ _canvas->setGuide(flg);
+ if (flg) {
+ _canvas->setScrollMode(_scrollMode);
+ } else {
+ _canvas->setScrollMode(AS_NONE);
+ }
+ _main_menu->setItemChecked(_id_guide, flg);
+ if (flg != _options.isAutoScrollEnabled) {
+ _options.isAutoScrollEnabled = flg;
+ _options.save();
+ }
+}
+
+//\83X\83N\83\8d\81[\83\8b\83o\81[\82Ì\90Ý\92è
+void FrmMain::scrollbarChange(int x, int y)
+{
+ //*
+ if (_useAllQuadrant) {
+ if (-200 != _vscb->minValue()) {
+ _vscb->setMinValue(-200);
+ }
+ if (-200 != _hscb->minValue()) {
+ _hscb->setMinValue(-200);
+ }
+ } else {
+ if (0 != _vscb->minValue()) {
+ _vscb->setMinValue(0);
+ }
+ if (0 != _hscb->minValue()) {
+ _hscb->setMinValue(0);
+ }
+ }
+ //*/
+ if (_canvas->isShowGuide()) {
+ _isTracking = false;
+ } else {
+ _isTracking = false;
+ }
+ _hscb->setValue(x);
+ _vscb->setValue(y);
+}
+
+//\90V\8bK\83y\81[\83W\8dì\90¬
+void FrmMain::newPage()
+{
+ if (QMessageBox::warning( this, "FreeNote Qt", "OK to create new page ?", "OK", "Cancel", 0, 1, 1 )) {
+ return;
+ }
+ _hscb->setMaxValue(960);
+ _vscb->setMaxValue(960);
+ _canvas->clear();
+ QDir dir = _file.dir();
+ _file.setFile(dir, "");
+ _title = "";
+ setTitle();
+}
+
+//\83y\81[\83W\83N\83\8a\83A
+void FrmMain::clear()
+{
+ if (QMessageBox::warning( this, "FreeNote Qt", "OK to clear this page ?", "OK", "Cancel", 0, 1, 1 )) {
+ return;
+ }
+ _hscb->setMaxValue(960);
+ _vscb->setMaxValue(960);
+ _canvas->clear();
+}
+
+//\83J\83\89\81[\83Z\83\8c\83N\83^\82Ì\95\\8e¦
+void FrmMain::colorSelectorPopup()
+{
+ _colorSelector->setColor(_btnColor->color());
+ _colorSelector->show();
+ if (_colorSelector->exec()) {
+ changeColor(_colorSelector->color().rgb());
+ }
+}
+
+//\83t\83@\83C\83\8b\83I\81[\83v\83\93
+void FrmMain::open(const QString& fname)
+{
+ _file.setFile(fname);
+ if (_file.exists()) {
+ _canvas->load(_file.absFilePath());
+ setTitle(&_file);
+ } else {
+ _file.setFile(_file.dir(), "");
+ }
+}
+
+//\83t\83@\83C\83\8b\95Û\91¶
+void FrmMain::save()
+{
+ _prefile = "";
+ if (!_file.exists() || _file.isDir() || _file.extension(false) != "free") {
+ return saveAs();
+ } else {
+ Config conf("FreeNoteQt");
+ conf.setGroup("Format");
+ _file.setFile(QDir(conf.readEntry("free", _file.dirPath())), _file.fileName());
+ _canvas->save(_file.absFilePath());
+ _prefile = _file.absFilePath();
+ conf.writeEntry("free", _file.dirPath() + "/");
+ setTitle(&_file);
+ if (_export_menu->isItemChecked(_id_saveNPdf)) {
+ QFileInfo info = _file;
+ QString tmpf = _file.absFilePath();
+ tmpf = tmpf.left(tmpf.findRev(".free"));
+ info.setFile(tmpf + ".pdf");
+ _canvas->exportPDF(info);
+ }
+ }
+}
+
+//\95Ê\96¼\95Û\91¶
+void FrmMain::saveAs()
+{
+ _prefile = "";
+ Config conf("FreeNoteQt");
+ conf.setGroup("Format");
+ if (_file.baseName() == "") {
+ _file.setFile(QDir(conf.readEntry("free", _file.dirPath())), "");
+ } else {
+ _file.setFile(QDir(conf.readEntry("free", _file.dirPath())), _file.fileName());
+ }
+
+ //_frmPalette->close();
+ FNFileDialog dlg(this, "*.free", "FreeNote Qt - save", false);
+ dlg.setCurrentFile(_file);
+ dlg.showMaximized();
+ if (dlg.exec()) {
+ QFileInfo info = dlg.currentFile();
+ if (!info.isDir() && !dlg.isTopDir()) {
+ if (info.extension(false) != "free") {
+ QDir dir = info.dir(true);
+ QString fname = info.fileName();
+ info.setFile(dir, fname + ".free");
+ }
+ if (info.exists()) {
+ if (QMessageBox::warning( this, "FreeNote Qt", "file " + info.fileName() + "\n already exists.\n\n OK to overwrite ?", "OK", "Cancel", 0, 1, 1 )) {
+ return;
+ }
+ }
+ _file = info;
+ if (_canvas->save(_file)) {
+ _prefile = _file.absFilePath();
+ conf.writeEntry("free", _file.dirPath() + "/");
+ setTitle(&_file);
+ if (_export_menu->isItemChecked(_id_saveNPdf)) {
+ QString tmpf = _file.absFilePath();
+ tmpf = tmpf.left(tmpf.findRev(".free"));
+ info.setFile(tmpf + ".pdf");
+ _canvas->exportPDF(info);
+ }
+ }
+ }
+ }
+}
+
+//\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
+void FrmMain::load()
+{
+ Config conf("FreeNoteQt");
+ conf.setGroup("Format");
+ if (_file.fileName() == "") {
+ _file.setFile(QDir(conf.readEntry("free", _file.dirPath())), ".free");
+ } else {
+ _file.setFile(QDir(conf.readEntry("free", _file.dirPath())), _file.fileName());
+ }
+
+ //_frmPalette->close();
+ FNFileDialog dlg(this, "*.free", "FreeNote Qt - load", true);
+ dlg.setCurrentFile(_file);
+ dlg.showMaximized();
+ if (dlg.exec()) {
+ QFileInfo info = dlg.currentFile();
+ if (info.isFile() && info.exists()) {
+ _file = info;
+ if (_canvas->load(_file)) {
+ _prefile = _file.absFilePath();
+ conf.writeEntry("free", _file.dirPath() + "/");
+ setTitle(&_file);
+ }
+ }
+ }
+}
+
+//\83N\83\8a\83b\83v\83{\81[\83h\93Ç\82Ý\8d\9e\82Ý
+void FrmMain::import()
+{
+ Config conf("FreeNoteQt");
+ conf.setGroup("Format");
+ QFileInfo info = _file;
+ if (info.fileName() == "") {
+ info.setFile(QDir(conf.readEntry("import", info.dirPath())), ".free");
+ } else {
+ info.setFile(QDir(conf.readEntry("import", info.dirPath())), info.fileName());
+ }
+
+ //_frmPalette->close();
+ FNFileDialog dlg(this, "*.free", "FreeNote Qt - import", true);
+ dlg.setCurrentFile(info);
+ dlg.showMaximized();
+ if (dlg.exec()) {
+ info = dlg.currentFile();
+ if (info.isFile() && info.exists()) {
+ _canvas->import(info);
+ conf.writeEntry("import", info.dirPath() + "/");
+ }
+ }
+}
+
+//PNG\82Ö\82Ì\8fo\97Í
+void FrmMain::exportPNG()
+{
+ _prepng = "";
+ Config conf("FreeNoteQt");
+ conf.setGroup("Format");
+ QFileInfo info = _file;
+ if (info.fileName() == "") {
+ info.setFile(QDir(conf.readEntry("png", info.dirPath())), "");
+ } else {
+ info.setFile(QDir(conf.readEntry("png", info.dirPath())), info.fileName());
+ }
+
+ //_frmPalette->close();
+ QPixmap save(_canvas->wbuffer());
+ FNFileDialog dlg(this, "*.png", "FreeNote Qt - exportPNG", false);
+ if (info.extension()=="free") {
+ QString tmpf = info.absFilePath();
+ tmpf = tmpf.left(tmpf.findRev(".free"));
+ info.setFile(tmpf);
+ } else {
+ info.setFile(info.dir(), "");
+ }
+ dlg.setCurrentFile(info);
+ dlg.showMaximized();
+ if (dlg.exec() && !dlg.isTopDir()) {
+ info = dlg.currentFile();
+ if (!info.isDir() && !dlg.isTopDir()) {
+ if (info.extension(false) != "png") {
+ QDir dir = info.dir(true);
+ QString fname = info.fileName();
+ info.setFile(dir, fname + ".png");
+ }
+ if (info.exists()) {
+ if (QMessageBox::warning( this, "FreeNote Qt", "file " + info.fileName() + "\n already exists.\n\n OK to overwrite ?", "OK", "Cancel", 0, 1, 1 )) {
+ return;
+ }
+ }
+ _canvas->exportPNG(info, save);
+ _prepng = info.absFilePath();
+ conf.writeEntry("png", info.dirPath() + "/");
+ }
+ }
+}
+
+//PDF\82Ö\82Ì\8fo\97Í
+void FrmMain::exportPDF()
+{
+ _prepdf = "";
+ Config conf("FreeNoteQt");
+ conf.setGroup("Format");
+
+ QFileInfo info = _file;
+ if (info.fileName() == "") {
+ info.setFile(QDir(conf.readEntry("pdf", info.dirPath())), "");
+ } else {
+ info.setFile(QDir(conf.readEntry("pdf", info.dirPath())), info.fileName());
+ }
+
+ //_frmPalette->close();
+ FNFileDialog dlg(this, "*.pdf", "FreeNote Qt - exportPDF", false);
+ if (info.extension()=="free") {
+ QString tmpf = info.absFilePath();
+ tmpf = tmpf.left(tmpf.findRev(".free"));
+ info.setFile(tmpf);
+ } else {
+ info.setFile(info.dir(), "");
+ }
+
+ dlg.setCurrentFile(info);
+ dlg.showMaximized();
+
+ if (dlg.exec() && !dlg.isTopDir()) {
+ info = dlg.currentFile();
+ if (!info.isDir() && !dlg.isTopDir()) {
+ if (info.extension(false) != "pdf") {
+ QDir dir = info.dir(true);
+ QString fname = info.fileName();
+ info.setFile(dir, fname + ".pdf");
+ }
+ if (info.exists()) {
+ if (QMessageBox::warning( this, "FreeNote Qt", "file " + info.fileName() + "\n already exists.\n\n OK to overwrite ?", "OK", "Cancel", 0, 1, 1 )) {
+ return;
+ }
+ }
+ _canvas->exportPDF(info);
+ _prepdf = info.absFilePath();
+ conf.writeEntry("pdf", info.dirPath() + "/");
+ }
+ }
+}
+
+//\83X\83N\83\8d\81[\83\8b
+void FrmMain::scroll()
+{
+ if (!_isTracking) {
+ _isTracking = true;
+ return;
+ }
+ if (_canvas->isDrawing()) {
+ return;
+ }
+ int ox = _hscb->value();
+ int oy = _vscb->value();
+ _canvas->setOrigin(ox, oy);
+ int mx = _hscb->maxValue();
+ int my = _vscb->maxValue();
+ if (ox + 50 > mx) {
+ _hscb->setMaxValue(mx + 100);
+ }
+ if (oy + 50 > my) {
+ _vscb->setMaxValue(my + 100);
+ }
+ this->setFocus();
+}
+
+//\8fI\97¹
+void FrmMain::quit()
+{
+ _options.txtBoxRect = _canvas->txtBoxRect();
+ _options.save();
+ showNormal();
+ close();
+}
+
+//\8fI\97¹\91O\8f\88\97\9d
+void FrmMain::closeEvent(QCloseEvent* e)
+{
+ if (!_options.isQuitQuickly) {
+ if (QMessageBox::warning( this, "FreeNote Qt", "OK to quit ?", "OK", "Cancel", 0, 1, 1 )) {
+ return;
+ }
+ }
+ e->accept();
+}
+
+//\83\8a\83^\81[\83\93\89\9f\89º\8f\88\97\9d
+void FrmMain::hitRet()
+{
+ _canvas->erase();
+ _canvas->CR();
+}
+
+//\83L\81[\89\9f\89º\83C\83x\83\93\83g
+void FrmMain::keyPressEvent(QKeyEvent* evt)
+{
+ if (!_btnZoom->isOn()) {
+ int key = evt->key();
+ switch (key) {
+ case Qt::Key_Return:
+ case Qt::Key_Space:
+ case Qt::Key_F33:
+ _canvas->erase();
+ _canvas->CR();
+ break;
+ case Qt::Key_Left:
+ if (_canvas->isSelected()) {
+ _canvas->selectionMoveTo(-1, 0);
+ } else {
+ _hscb->subtractPage();
+ scroll();
+ }
+ break;
+ case Qt::Key_Right:
+ if (_canvas->isSelected()) {
+ _canvas->selectionMoveTo(1, 0);
+ } else {
+ _hscb->addPage();
+ scroll();
+ }
+ break;
+ case Qt::Key_Up:
+ if (_canvas->isSelected()) {
+ _canvas->selectionMoveTo(0, -1);
+ } else {
+ _vscb->subtractPage();
+ scroll();
+ }
+ break;
+ case Qt::Key_Down:
+ if (_canvas->isSelected()) {
+ _canvas->selectionMoveTo(0, 1);
+ } else {
+ _vscb->addPage();
+ scroll();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void FrmMain::showLayer()
+{
+ FNLayerDlg dlg(_canvas);
+ _canvas->resetSelection();
+ dlg.show();
+ dlg.exec();
+ setTitle();
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+FrmMain::~FrmMain()
+{
+ // no need to delete child widgets, Qt does it all for us
+ delete _colorSelector;
+}
+
+//about box\82Ì\95\\8e¦
+void FrmMain::about()
+{
+ char buf[1024];
+ sprintf(buf, "FreeNote Qt\nversion %s\nCopyright(c) 2003-2005,jojo3", VERSION);
+ QMessageBox::about(this, "FreeNote Qt", buf);
+}
+
+void FrmMain::setTitle(QFileInfo* file) {
+ if (NULL != file) {
+ _title = file->fileName();
+ }
+ QString t = "FreeNote Qt[";
+ if (_canvas->isTinyPaging()) {
+ _layer_menu->setItemChecked(_id_tinyPaging, true);
+ t += "P:";
+ } else {
+ _layer_menu->setItemChecked(_id_tinyPaging, false);
+ t += "L:";
+ }
+ t += _canvas->currentLayerName();
+ t += "] ";
+ setCaption(t + _title);
+}
--- /dev/null
+[Desktop Entry]
+Comment=
+Exec=FreeNote
+Icon=freenote
+Type=Application
+Name=FreeNoteQt
+Display=640x480/144dpi,480x640/144dpi
+MimeType=application/freenote
+MimeTypeIcons=freenote
+CanFastload=1
--- /dev/null
+[Desktop Entry]\r
+Comment=\r
+Exec=FreeNoteSetup\r
+Icon=fnsetup\r
+Type=Application\r
+Name=FNSetup\r
+Name[ja]=FN設定\r
+Display=640x480/144dpi,480x640/144dpi\r
+CanFastload=0\r
--- /dev/null
+DESCRIPTION = "Auto-Correction Paint Program for Opie/Qtopia"
+SECTION = "opie/applications"
+PRIORITY = "optional"
+LICENSE = "GPL"
+APPNAME = "FreeNote"
+APPTYPE = "binary"
+APPDESKTOP = "apps/Applications"
+
+SRC_URI = "http://www.urban.ne.jp/home/kanemori/zaurus/FreeNote_1.12.0.tar.gz \
+ file://FreeNote"
+S = "${WORKDIR}/FreeNote"
+
+inherit opie
+
+do_configure_prepend() {
+ mv -f FreeNote subdir1
+ mv -f FreeNoteSetup subdir2
+ echo -e "TEMPLATE=subdirs\nSUBDIRS=subdir1 subdir2\n" >> freenote.pro
+ pushd ${S}/subdir1 && rm *.pro && qmake -project && echo "TARGET=FreeNote" >> subdir1.pro && popd
+ pushd ${S}/subdir2 && rm *.pro && qmake -project && echo "TARGET=FreeNoteSetup" >> subdir2.pro && popd
+}
+
+do_install() {
+ install -d ${D}${palmtopdir}/bin/
+ install -m 0755 FreeNoteSetup ${D}${palmtopdir}/bin/
+ install -d ${D}${palmtopdir}/pics/
+ install -m 0644 pics/freenote.png ${D}${palmtopdir}/pics
+ install -m 0644 pics/fnsetup.png ${D}${palmtopdir}/pics
+ install -d ${D}${palmtopdir}/apps/Applications
+ install -m 0644 apps/Applications/FreeNote.desktop ${D}${palmtopdir}/apps/Applications
+ install -d ${D}${palmtopdir}/apps/Settings
+ install -m 0644 apps/Settings/FreeNoteSetup.desktop ${D}${palmtopdir}/apps/Settings
+}
+++ /dev/null
-
-#
-# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher
-#
-
---- FreeNote_1.6.1_arm/FmtEngine.cpp~compile 2003-12-23 15:53:46.000000000 +0100
-+++ FreeNote_1.6.1_arm/FmtEngine.cpp 2004-02-01 18:42:32.000000000 +0100
-@@ -1,409 +1,410 @@
--/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA
-- Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
--
-- 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.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--*/
--/*
--2003/12/16-19 FreeNote ver 1.5.5pre
--\81E\8bÈ\90ü\95`\89æ\83\8d\83W\83b\83N\82Ì\89ü\97Ç
--
--2003/12/14 FreeNote 1.5.4pre
--\81E\8bÈ\90ü\95`\89æ\83\8d\83W\83b\83N\82Ì\89ü\97Ç
--
--2003/11/30-2003/12/04 FreeNote 1.5.3pre
--\81E\83x\83W\83F\8aÖ\90\94\82Ì\83X\83y\83\8b\83~\83X\82ð\8fC\90³
--
--2003/11/16 FreeNote 1.5.2pre
--\81E\89~\95`\89æ\82Ì\83\8d\83W\83b\83N\82ð\92Ç\89Á
--
--2003/11/13 FreeNote 1.5.1pre
--\81E\83X\83\80\81[\83W\83\93\83O\92Ç\89Á
--2003/11/10-12
--\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á
--2003/11/09 \92Ç\89Á
--*/
--#include "fmtengine.h"
--#include <qpointarray.h>
--#include <qpe/qmath.h>
--#include <math.h>
--int SNAP_SIZE = 32;
--int PHASE1_ANGLE = 30;
--int PHASE2_ANGLE = 30;
--double Surface(const QPoint& p1, const QPoint& p2)
--{
-- return 0.5 * abs(p1.x() * p2.y() - p1.y() * p2.x());
--}
--
--bool IsLinear(const QPoint& p1, const QPoint& p2, const QPoint& p3)
--{
-- double s1 = Surface(p1, p2);
-- double s2 = Surface(p2, p3);
-- double s3 = Surface(p1, p3);
-- if (s1 + s2 == s3) {
-- return true;
-- } else {
-- return false;
-- }
--}
--
--const double Angle(const QPoint& p1, const QPoint& p2)
--{
-- return qATan2((double)(p2.y() - p1.y()), (double)(p2.x() - p1.x()));
--}
--
--const double DiffAngle(const QPoint& p1, const QPoint& p2, const QPoint& p3)
--{
-- return fabs(Angle(p1, p2) - Angle(p2, p3));
--}
--
--const double ToDegree(double t)
--{
-- return t * 180 / M_PI;
--}
--
--const double ToRadian(double d)
--{
-- return d * M_PI / 180;
--}
--
--const double Distance(const QPoint& p1, const QPoint& p2)
--{
-- return hypot(p1.x() - p2.x(), p1.y() - p2.y());
--}
--
--const QPoint SnapPoint(const QPoint& p)
--{
-- int x = ((int)(p.x() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;
-- int y = ((int)(p.y() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;
-- return QPoint(x, y);
--}
--
--const QPoint ArrangePoint(const QPoint& p1, const QPoint& p2)
--{
-- int x = p2.x();
-- int y = p2.y();
-- if (p1.x() - SNAP_SIZE / 2 <= x && p1.x() + SNAP_SIZE / 2 >= x) {
-- x = p1.x();
-- }
-- if (p1.y() - SNAP_SIZE / 2 <= y && p1.y() + SNAP_SIZE / 2 >= y) {
-- y = p1.y();
-- }
-- return QPoint(x, y);
--}
--
--FNPointList ReducePoints(FNPointList& p)
--{
-- if (3 >= p.count()) {
-- return p;
-- }
-- FNPointList rt;
-- rt.append(p.first());
-- QPoint* p1 = p.first();
-- QPoint* p2 = p.at(1);
-- QPoint* p3 = NULL;
-- for (uint i = 2; i < p.count(); ++i) {
-- p3 = p.at(i);
-- if (false == IsLinear(*p1, *p2, *p3)) {
-- rt.append(p2);
-- p1 = p2;
-- }
-- p2 = p3;
-- }
-- rt.append(p3);
-- return rt;
--}
--
--FNPointList ExtractAngle2(FNPointList& p, const int deg)
--{
-- FNPointList rt;
-- rt.append(p.first());
-- QPoint* st = p.first();
-- QPoint* mp = p.at(1);
-- QPoint* ed = p.last();
-- for (uint i = 2; i < p.count(); ++i) {
-- ed = p.at(i);
-- if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) {
-- st = mp;
-- rt.append(mp);
-- }
-- mp = ed;
-- }
-- rt.append(ed);
-- return rt;
--}
--
--FNPointList ExtractAngle(FNPointList& p, const int deg)
--{
-- FNPointList rt;
-- rt.append(p.first());
-- QPoint* st = p.first();
-- QPoint* mp = p.at(1);
-- QPoint* ed = p.last();
-- for (uint i = 2; i < p.count(); ++i) {
-- ed = p.at(i);
-- if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) {
-- st = mp;
-- rt.append(mp);
-- }
-- mp = ed;
-- }
-- if (SNAP_SIZE / 2 > Distance(*p.first(), *p.last()) && 3 < p.count()) {
-- rt.append(p.first());
-- } else {
-- rt.append(ed);
-- }
-- return rt;
--}
--
--FNPointList SumupPoints(FNPointList& p)
--{
-- if (3 >= p.count()) {
-- return p;
-- }
-- FNPointList rt;
-- rt.append(p.first());
-- QPoint* p1 = p.first();
-- QPoint* p2 = NULL;
-- double pred = 0;
-- for (uint i = 1; i < p.count() - 1; ++i) {
-- p2 = p.at(i);
-- double d = Distance(*p1, *p2);
-- if (SNAP_SIZE / 2 < d || pred > d) {
-- rt.append(p2);
-- p1 = p2;
-- d = 0;
-- }
-- pred = d;
-- }
-- rt.append(p.last());
-- return rt;
--}
--
--FNPointList SnapPoints(FNPointList& p)
--{
-- FNPointList rt;
-- for (uint i = 0; i < p.count(); ++i) {
-- QPoint tp = SnapPoint(*p.at(i));
-- p.at(i)->setX(tp.x());
-- p.at(i)->setY(tp.y());
-- rt.append(p.at(i));
-- }
-- return rt;
--}
--
--FNPointList ArrangePoints(FNPointList& p)
--{
-- if (3 >= p.count() && 2 != p.count()) {
-- return p;
-- }
-- FNPointList rt;
-- rt.append(p.first());
-- QPoint* p1 = p.first();
-- QPoint* p2 = NULL;
-- for (uint i = 1; i < p.count(); ++i) {
-- p2 = p.at(i);
-- QPoint tp = ArrangePoint(*p1, *p2);
-- p2->setX(tp.x());
-- p2->setY(tp.y());
-- rt.append(p2);
-- p1 = p2;
-- }
-- if (*p.first() == *p.last()) {
-- QPoint tp = ArrangePoint(*p1, *p.first());
-- rt.first()->setX(tp.x());
-- rt.first()->setY(tp.y());
-- }
-- return rt;
--}
--
--FNPointList TuningPoints(FNPointList& p)
--{
-- FNPointList rt;
-- if (3 >= p.count()) {
-- for (uint i = 0; i < p.count(); ++i) {
-- rt.append(new QPoint(*p.at(i)));
-- }
-- return rt;
-- }
-- rt.append(new QPoint(*p.at(0)));
-- for (uint i = 1; i < p.count() - 1; ++i) {
-- QPoint* p1 = p.at(i);
-- QPoint* p2 = p.at(i + 1);
-- rt.append(new QPoint(*p1));
-- if (i < p.count() - 2) {
-- rt.append(new QPoint((p1->x() + p2->x())/2, (p1->y() + p2->y())/2));
-- }
-- }
-- rt.append(new QPoint(*p.at(p.count()-1)));
-- return rt;
--}
--
--FNPointList ToBezier(FNPointList& p) {
-- FNPointList rt;
-- rt.append(new QPoint(*p.at(0)));
-- for (uint i = 0; i < p.count() - 2; i += 2) {
-- int x1 = p.at(i)->x();
-- int xa = p.at(i + 1)->x();
-- int x4 = p.at(i + 2)->x();
--
-- int x2 = (x1 + xa) / 2;
-- int x3 = (xa + x4) / 2;
--
-- int y1 = p.at(i)->y();
-- int ya = p.at(i + 1)->y();
-- int y4 = p.at(i + 2)->y();
--
-- int y2 = (y1 + ya) / 2;
-- int y3 = (ya + y4) / 2;
--
-- rt.append(new QPoint(x2 ,y2));
-- rt.append(new QPoint(x3 ,y3));
-- rt.append(new QPoint(x4 ,y4));
-- }
-- return rt;
--}
--
--FNPointList ToCurves(FNPointList& p) {
-- if (3 <= p.count()) {
-- //\83x\83W\83F\82É\82æ\82é\95â\8a®
-- return ToBezier(p);
-- } else {
-- FNPointList rt;
-- for (uint i = 0; i < p.count(); ++i) {
-- rt.append(new QPoint(*p.at(i)));
-- }
-- return rt;
-- }
--}
--
--FNPointList AutoFormat(FNPointList& p)
--{
-- FNPointList tp = ExtractAngle(p, PHASE1_ANGLE);
-- uint n;
-- do {
-- n = tp.count();
-- tp = SumupPoints(tp);
-- tp = ExtractAngle(tp, PHASE1_ANGLE);
-- tp = ArrangePoints(tp);
-- } while (n > tp.count());
-- tp = SnapPoints(tp);
-- tp = ReducePoints(tp);
-- FNPointList rt;
-- if (2 == tp.count()) {
-- if (*tp.first() == *tp.last()) {
-- return rt;
-- }
-- }
-- for (uint i = 0; i < tp.count(); ++i) {
-- rt.append(new QPoint(*tp.at(i)));
-- }
-- return rt;
--}
--
--FNPointList ToEllipse(int x, int y, int w, int h) {
-- FNPointList rt;
-- QPointArray pa;
-- pa.makeEllipse(x, y, w, h);
-- for (uint i = 0; i < pa.count(); ++i) {
-- rt.append(new QPoint(pa.point(i)));
-- }
-- return rt;
--}
--
--FNPointList AutoCurve(FNPointList& p)
--{
-- FNPointList tp2;
-- tp2.setAutoDelete(true);
-- FNPointList tp4;
-- tp4.setAutoDelete(true);
-- QPoint sp = SnapPoint(*p.at(0));
-- QPoint ep = SnapPoint(*p.at(p.count()-1));
-- if (sp == ep) {
-- //\91È\89~
-- int sx = p.at(0)->x();
-- int sy = p.at(0)->y();
-- int ex = sx;
-- int ey = sy;
-- for (uint i = 1; i < p.count(); ++i) {
-- QPoint tp = *p.at(i);
-- if (sx > tp.x()) {
-- sx = tp.x();
-- } else if (ex < tp.x()) {
-- ex = tp.x();
-- }
-- if (sy > tp.y()) {
-- sy = tp.y();
-- } else if (ey < tp.y()) {
-- ey = tp.y();
-- }
-- }
-- sp = SnapPoint(QPoint(sx, sy));
-- ep = SnapPoint(QPoint(ex, ey));
-- tp2.append(new QPoint(sp.x(), sp.y()));
-- tp2.append(new QPoint(ep.x(), ep.y()));
-- } else {
-- FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE);
-- uint n;
-- do {
-- n = tp.count();
-- tp = SumupPoints(tp);
-- tp = ExtractAngle2(tp, PHASE2_ANGLE);
-- tp = SnapPoints(tp);
-- } while (n > tp.count());
-- tp = SumupPoints(tp);
-- tp = ReducePoints(tp);
-- tp4 = TuningPoints(tp);
-- tp2 = ToCurves(tp4);
-- }
-- FNPointList rt;
-- if (2 == tp2.count()) {
-- if (*tp2.first() == *tp2.last()) {
-- return rt;
-- }
-- }
-- for (uint i = 0; i < tp2.count(); ++i) {
-- rt.append(new QPoint(*tp2.at(i)));
-- }
-- return rt;
--}
--
--FNPointList Smoothing(FNPointList& p)
--{
-- int tsnap = SNAP_SIZE;
-- SNAP_SIZE=8;
-- FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE);
-- tp = SumupPoints(tp);
-- tp = ReducePoints(tp);
-- FNPointList tp4 = TuningPoints(tp);
-- tp4.setAutoDelete(true);
-- FNPointList tp2 = ToCurves(tp4);
-- tp2.setAutoDelete(true);
-- FNPointList rt;
-- for (uint i = 0; i < tp2.count(); ++i) {
-- rt.append(new QPoint(*tp2.at(i)));
-- }
-- SNAP_SIZE = tsnap;
-- return rt;
--}
--
--FNPointList Reduce(FNPointList& p)
--{
-- FNPointList tp = ReducePoints(p);
-- FNPointList rt;
-- for (uint i = 0; i < tp.count(); ++i) {
-- rt.append(new QPoint(*tp.at(i)));
-- }
-- return rt;
--}
-+/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA
-+ Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
-+
-+ 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.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+/*
-+2003/12/16-19 FreeNote ver 1.5.5pre
-+\81E\8bÈ\90ü\95`\89æ\83\8d\83W\83b\83N\82Ì\89ü\97Ç
-+
-+2003/12/14 FreeNote 1.5.4pre
-+\81E\8bÈ\90ü\95`\89æ\83\8d\83W\83b\83N\82Ì\89ü\97Ç
-+
-+2003/11/30-2003/12/04 FreeNote 1.5.3pre
-+\81E\83x\83W\83F\8aÖ\90\94\82Ì\83X\83y\83\8b\83~\83X\82ð\8fC\90³
-+
-+2003/11/16 FreeNote 1.5.2pre
-+\81E\89~\95`\89æ\82Ì\83\8d\83W\83b\83N\82ð\92Ç\89Á
-+
-+2003/11/13 FreeNote 1.5.1pre
-+\81E\83X\83\80\81[\83W\83\93\83O\92Ç\89Á
-+2003/11/10-12
-+\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á
-+2003/11/09 \92Ç\89Á
-+*/
-+#include "fmtengine.h"
-+#include <qpointarray.h>
-+#include <qpe/qmath.h>
-+#include <math.h>
-+#include <stdlib.h> // abs
-+int SNAP_SIZE = 32;
-+int PHASE1_ANGLE = 30;
-+int PHASE2_ANGLE = 30;
-+double Surface(const QPoint& p1, const QPoint& p2)
-+{
-+ return 0.5 * abs(p1.x() * p2.y() - p1.y() * p2.x());
-+}
-+
-+bool IsLinear(const QPoint& p1, const QPoint& p2, const QPoint& p3)
-+{
-+ double s1 = Surface(p1, p2);
-+ double s2 = Surface(p2, p3);
-+ double s3 = Surface(p1, p3);
-+ if (s1 + s2 == s3) {
-+ return true;
-+ } else {
-+ return false;
-+ }
-+}
-+
-+const double Angle(const QPoint& p1, const QPoint& p2)
-+{
-+ return qATan2((double)(p2.y() - p1.y()), (double)(p2.x() - p1.x()));
-+}
-+
-+const double DiffAngle(const QPoint& p1, const QPoint& p2, const QPoint& p3)
-+{
-+ return fabs(Angle(p1, p2) - Angle(p2, p3));
-+}
-+
-+const double ToDegree(double t)
-+{
-+ return t * 180 / M_PI;
-+}
-+
-+const double ToRadian(double d)
-+{
-+ return d * M_PI / 180;
-+}
-+
-+const double Distance(const QPoint& p1, const QPoint& p2)
-+{
-+ return hypot(p1.x() - p2.x(), p1.y() - p2.y());
-+}
-+
-+const QPoint SnapPoint(const QPoint& p)
-+{
-+ int x = ((int)(p.x() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;
-+ int y = ((int)(p.y() + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;
-+ return QPoint(x, y);
-+}
-+
-+const QPoint ArrangePoint(const QPoint& p1, const QPoint& p2)
-+{
-+ int x = p2.x();
-+ int y = p2.y();
-+ if (p1.x() - SNAP_SIZE / 2 <= x && p1.x() + SNAP_SIZE / 2 >= x) {
-+ x = p1.x();
-+ }
-+ if (p1.y() - SNAP_SIZE / 2 <= y && p1.y() + SNAP_SIZE / 2 >= y) {
-+ y = p1.y();
-+ }
-+ return QPoint(x, y);
-+}
-+
-+FNPointList ReducePoints(FNPointList& p)
-+{
-+ if (3 >= p.count()) {
-+ return p;
-+ }
-+ FNPointList rt;
-+ rt.append(p.first());
-+ QPoint* p1 = p.first();
-+ QPoint* p2 = p.at(1);
-+ QPoint* p3 = NULL;
-+ for (uint i = 2; i < p.count(); ++i) {
-+ p3 = p.at(i);
-+ if (false == IsLinear(*p1, *p2, *p3)) {
-+ rt.append(p2);
-+ p1 = p2;
-+ }
-+ p2 = p3;
-+ }
-+ rt.append(p3);
-+ return rt;
-+}
-+
-+FNPointList ExtractAngle2(FNPointList& p, const int deg)
-+{
-+ FNPointList rt;
-+ rt.append(p.first());
-+ QPoint* st = p.first();
-+ QPoint* mp = p.at(1);
-+ QPoint* ed = p.last();
-+ for (uint i = 2; i < p.count(); ++i) {
-+ ed = p.at(i);
-+ if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) {
-+ st = mp;
-+ rt.append(mp);
-+ }
-+ mp = ed;
-+ }
-+ rt.append(ed);
-+ return rt;
-+}
-+
-+FNPointList ExtractAngle(FNPointList& p, const int deg)
-+{
-+ FNPointList rt;
-+ rt.append(p.first());
-+ QPoint* st = p.first();
-+ QPoint* mp = p.at(1);
-+ QPoint* ed = p.last();
-+ for (uint i = 2; i < p.count(); ++i) {
-+ ed = p.at(i);
-+ if (ToRadian(deg) <= DiffAngle(*st, *mp, *ed)) {
-+ st = mp;
-+ rt.append(mp);
-+ }
-+ mp = ed;
-+ }
-+ if (SNAP_SIZE / 2 > Distance(*p.first(), *p.last()) && 3 < p.count()) {
-+ rt.append(p.first());
-+ } else {
-+ rt.append(ed);
-+ }
-+ return rt;
-+}
-+
-+FNPointList SumupPoints(FNPointList& p)
-+{
-+ if (3 >= p.count()) {
-+ return p;
-+ }
-+ FNPointList rt;
-+ rt.append(p.first());
-+ QPoint* p1 = p.first();
-+ QPoint* p2 = NULL;
-+ double pred = 0;
-+ for (uint i = 1; i < p.count() - 1; ++i) {
-+ p2 = p.at(i);
-+ double d = Distance(*p1, *p2);
-+ if (SNAP_SIZE / 2 < d || pred > d) {
-+ rt.append(p2);
-+ p1 = p2;
-+ d = 0;
-+ }
-+ pred = d;
-+ }
-+ rt.append(p.last());
-+ return rt;
-+}
-+
-+FNPointList SnapPoints(FNPointList& p)
-+{
-+ FNPointList rt;
-+ for (uint i = 0; i < p.count(); ++i) {
-+ QPoint tp = SnapPoint(*p.at(i));
-+ p.at(i)->setX(tp.x());
-+ p.at(i)->setY(tp.y());
-+ rt.append(p.at(i));
-+ }
-+ return rt;
-+}
-+
-+FNPointList ArrangePoints(FNPointList& p)
-+{
-+ if (3 >= p.count() && 2 != p.count()) {
-+ return p;
-+ }
-+ FNPointList rt;
-+ rt.append(p.first());
-+ QPoint* p1 = p.first();
-+ QPoint* p2 = NULL;
-+ for (uint i = 1; i < p.count(); ++i) {
-+ p2 = p.at(i);
-+ QPoint tp = ArrangePoint(*p1, *p2);
-+ p2->setX(tp.x());
-+ p2->setY(tp.y());
-+ rt.append(p2);
-+ p1 = p2;
-+ }
-+ if (*p.first() == *p.last()) {
-+ QPoint tp = ArrangePoint(*p1, *p.first());
-+ rt.first()->setX(tp.x());
-+ rt.first()->setY(tp.y());
-+ }
-+ return rt;
-+}
-+
-+FNPointList TuningPoints(FNPointList& p)
-+{
-+ FNPointList rt;
-+ if (3 >= p.count()) {
-+ for (uint i = 0; i < p.count(); ++i) {
-+ rt.append(new QPoint(*p.at(i)));
-+ }
-+ return rt;
-+ }
-+ rt.append(new QPoint(*p.at(0)));
-+ for (uint i = 1; i < p.count() - 1; ++i) {
-+ QPoint* p1 = p.at(i);
-+ QPoint* p2 = p.at(i + 1);
-+ rt.append(new QPoint(*p1));
-+ if (i < p.count() - 2) {
-+ rt.append(new QPoint((p1->x() + p2->x())/2, (p1->y() + p2->y())/2));
-+ }
-+ }
-+ rt.append(new QPoint(*p.at(p.count()-1)));
-+ return rt;
-+}
-+
-+FNPointList ToBezier(FNPointList& p) {
-+ FNPointList rt;
-+ rt.append(new QPoint(*p.at(0)));
-+ for (uint i = 0; i < p.count() - 2; i += 2) {
-+ int x1 = p.at(i)->x();
-+ int xa = p.at(i + 1)->x();
-+ int x4 = p.at(i + 2)->x();
-+
-+ int x2 = (x1 + xa) / 2;
-+ int x3 = (xa + x4) / 2;
-+
-+ int y1 = p.at(i)->y();
-+ int ya = p.at(i + 1)->y();
-+ int y4 = p.at(i + 2)->y();
-+
-+ int y2 = (y1 + ya) / 2;
-+ int y3 = (ya + y4) / 2;
-+
-+ rt.append(new QPoint(x2 ,y2));
-+ rt.append(new QPoint(x3 ,y3));
-+ rt.append(new QPoint(x4 ,y4));
-+ }
-+ return rt;
-+}
-+
-+FNPointList ToCurves(FNPointList& p) {
-+ if (3 <= p.count()) {
-+ //\83x\83W\83F\82É\82æ\82é\95â\8a®
-+ return ToBezier(p);
-+ } else {
-+ FNPointList rt;
-+ for (uint i = 0; i < p.count(); ++i) {
-+ rt.append(new QPoint(*p.at(i)));
-+ }
-+ return rt;
-+ }
-+}
-+
-+FNPointList AutoFormat(FNPointList& p)
-+{
-+ FNPointList tp = ExtractAngle(p, PHASE1_ANGLE);
-+ uint n;
-+ do {
-+ n = tp.count();
-+ tp = SumupPoints(tp);
-+ tp = ExtractAngle(tp, PHASE1_ANGLE);
-+ tp = ArrangePoints(tp);
-+ } while (n > tp.count());
-+ tp = SnapPoints(tp);
-+ tp = ReducePoints(tp);
-+ FNPointList rt;
-+ if (2 == tp.count()) {
-+ if (*tp.first() == *tp.last()) {
-+ return rt;
-+ }
-+ }
-+ for (uint i = 0; i < tp.count(); ++i) {
-+ rt.append(new QPoint(*tp.at(i)));
-+ }
-+ return rt;
-+}
-+
-+FNPointList ToEllipse(int x, int y, int w, int h) {
-+ FNPointList rt;
-+ QPointArray pa;
-+ pa.makeEllipse(x, y, w, h);
-+ for (uint i = 0; i < pa.count(); ++i) {
-+ rt.append(new QPoint(pa.point(i)));
-+ }
-+ return rt;
-+}
-+
-+FNPointList AutoCurve(FNPointList& p)
-+{
-+ FNPointList tp2;
-+ tp2.setAutoDelete(true);
-+ FNPointList tp4;
-+ tp4.setAutoDelete(true);
-+ QPoint sp = SnapPoint(*p.at(0));
-+ QPoint ep = SnapPoint(*p.at(p.count()-1));
-+ if (sp == ep) {
-+ //\91È\89~
-+ int sx = p.at(0)->x();
-+ int sy = p.at(0)->y();
-+ int ex = sx;
-+ int ey = sy;
-+ for (uint i = 1; i < p.count(); ++i) {
-+ QPoint tp = *p.at(i);
-+ if (sx > tp.x()) {
-+ sx = tp.x();
-+ } else if (ex < tp.x()) {
-+ ex = tp.x();
-+ }
-+ if (sy > tp.y()) {
-+ sy = tp.y();
-+ } else if (ey < tp.y()) {
-+ ey = tp.y();
-+ }
-+ }
-+ sp = SnapPoint(QPoint(sx, sy));
-+ ep = SnapPoint(QPoint(ex, ey));
-+ tp2.append(new QPoint(sp.x(), sp.y()));
-+ tp2.append(new QPoint(ep.x(), ep.y()));
-+ } else {
-+ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE);
-+ uint n;
-+ do {
-+ n = tp.count();
-+ tp = SumupPoints(tp);
-+ tp = ExtractAngle2(tp, PHASE2_ANGLE);
-+ tp = SnapPoints(tp);
-+ } while (n > tp.count());
-+ tp = SumupPoints(tp);
-+ tp = ReducePoints(tp);
-+ tp4 = TuningPoints(tp);
-+ tp2 = ToCurves(tp4);
-+ }
-+ FNPointList rt;
-+ if (2 == tp2.count()) {
-+ if (*tp2.first() == *tp2.last()) {
-+ return rt;
-+ }
-+ }
-+ for (uint i = 0; i < tp2.count(); ++i) {
-+ rt.append(new QPoint(*tp2.at(i)));
-+ }
-+ return rt;
-+}
-+
-+FNPointList Smoothing(FNPointList& p)
-+{
-+ int tsnap = SNAP_SIZE;
-+ SNAP_SIZE=8;
-+ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE);
-+ tp = SumupPoints(tp);
-+ tp = ReducePoints(tp);
-+ FNPointList tp4 = TuningPoints(tp);
-+ tp4.setAutoDelete(true);
-+ FNPointList tp2 = ToCurves(tp4);
-+ tp2.setAutoDelete(true);
-+ FNPointList rt;
-+ for (uint i = 0; i < tp2.count(); ++i) {
-+ rt.append(new QPoint(*tp2.at(i)));
-+ }
-+ SNAP_SIZE = tsnap;
-+ return rt;
-+}
-+
-+FNPointList Reduce(FNPointList& p)
-+{
-+ FNPointList tp = ReducePoints(p);
-+ FNPointList rt;
-+ for (uint i = 0; i < tp.count(); ++i) {
-+ rt.append(new QPoint(*tp.at(i)));
-+ }
-+ return rt;
-+}
---- FreeNote_1.6.1_arm/FNCanvas.cpp~compile 2003-12-24 15:20:16.000000000 +0100
-+++ FreeNote_1.6.1_arm/FNCanvas.cpp 2004-02-01 18:43:35.000000000 +0100
-@@ -1,1227 +1,1228 @@
--/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA
-- Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
--
-- 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.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--*/
--/*
--2003/12/23 ver 1.6.1
--\81E\95Û\91¶\8fî\95ñ\82Ì\83T\83C\83Y\8fk\8f¬
--
--2003/12/16-19 ver 1.5.5pre
--\81E\83y\83\93\83T\83C\83Y\82Ì\92Ç\89Á(1-8)
--\81E\83A\83\93\83h\83D\81E\83\8a\83h\83D\82Ì\8eÀ\91\95
--
--2003/12/14 ver 1.5.4pre
--\81E\83y\83\93\83T\83C\83Y\82ð\91I\91ð\89Â\94\\82É\81B
--
--2003/12/05 ver 1.5.3Apre
--\81E\83O\83\8a\83b\83h\82Ì\90F\82ð\8fC\90³
--
--2003/12/04 ver 1.5.3pre
--\81E\83O\83\8a\83b\83h\82Ì\95`\89æ\82ð\88ê\95\94\8fC\90³
--
--2003/11/10 ver 1.5.1pre
--\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á
--
--2003/11/09 ver 1.5.0pre
--\81E\8e©\93®\90®\8c`\83\82\81[\83h\92Ç\89Á
--
--2003/09/03 ver 1.3.4pre
--\81EUse all quadrant OFF\8e\9e\82É\95\\8e¦\88Ê\92u\82ª\83\8a\83Z\83b\83g\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\83o\83O\91Î\89\9e\81B
--
--2003/09/01-03 ver 1.3.3pre
--\81E\83X\83N\83\8d\81[\83\8b\82Ì\89ü\97Ç
--\81EUse all quadrant(\91S\8fÛ\8cÀ\82ð\8eg\97p\82·\82é)\83\81\83j\83\85\81[\82ð\92Ç\89Á
--
--2003/08/31 FreeNote 1.3.2pre
--\81E\91S\95û\8cü\83X\83N\83\8d\81[\83\8b
--
--2003/08/23 FreeNote 1.3.0pre
--\81ECR\93®\8dì\82Ì\8fC\90³
--
--2003/08/15 FreeNote 1.2.1\82ð\8cö\8aJ
--\81E\95Û\91¶\8e\9e\82Ì\83o\83O\8fC\90³
--\81E\8a®\97¹\83_\83C\83A\83\8d\83O\82Ì\8e©\93®\8fÁ\8b\8e
--\81EPNG\83t\83@\83C\83\8b\82Ö\82Ì\8fo\97Í
--
--2003/08/15 FreeNote 1.2\82ð\8cö\8aJ
--\81E\83I\83v\83V\83\87\83\93\92Ç\89Á
--\81E\83X\83N\83\8d\81[\83\8b\83K\83C\83h
--\81EFree\83t\83@\83C\83\8b\8aÖ\98A\95t\82¯
--\81E\83A\83C\83R\83\93\82Ì\95Ï\8dX
--
--2003/08/05 FreeNote 1.1.1pre\82ð\8cö\8aJ
--\81E\8d\82\91¬\8bN\93®\8e\9e\82É\95Â\82¶\82½\8fó\91Ô\82ð\95Û\8e\9d
--\81E\95`\89æ\83\82\81[\83h\90Ø\91Ö\82¦\8e\9e\82É\8fÁ\82µ\83S\83\80\95\\8e¦
--\81E\95Û\91¶\8e\9e\8aÔ\92Z\8fk
--\81EView\83\82\81[\83h\82Ì\8b\93\93®\82ð\95Ï\8dX
--\81E\83\81\83j\83\85\81[\82Ì\8c©\82½\96Ú\82ð\95Ï\8dX
--*/
--#include "fncanvas.h"
--#include <stdio.h>
--#include <qfile.h>
--#include <qmessagebox.h>
--#include <qtextstream.h>
--#include <qpen.h>
--#include <qcolor.h>
--#include <qpoint.h>
--#include <qthread.h>
--#include <qimage.h>
--#include <math.h>
--#include "fnmessagebox.h"
--#include "fmtengine.h"
--
--int snap(int v) {
-- int tv = abs(v);
-- tv = ((int)(tv + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;
-- if (0 > v) {
-- return -tv;
-- } else {
-- return tv;
-- }
--}
--
--FNCanvas::FNCanvas(QWidget* parent = 0, const char* name = 0, WFlags f = 0)
-- :QWidget(parent, name, f),
-- _pen(black, 1, SolidLine, RoundCap, RoundJoin),
-- _asMode(AS_NONE),
-- _drawMode(MODE_DRAW),
-- _disp_offset(0),
-- _eraser_l(50),
-- _eraser_s(10),
-- _h_step(100),
-- _v_step(100),
-- _margin(5),
-- _scrollTiming(800),
-- _viewMode(false),
-- _isWaiting(false),
-- _isDragging(false),
-- _isHeadingEnables(false),
-- _isShowGuide(false),
-- _isUseAllQuadrant(false),
-- _scale_x(1.0),
-- _scale_y(1.0)
--{
-- _tracks.setAutoDelete(true);
-- this->setBackgroundMode(NoBackground);
-- _timer = new QTimer(this);
-- connect(_timer, SIGNAL(timeout()), this, SLOT(autoScroll()));
--}
--
--FNCanvas::~FNCanvas()
--{
-- _timer->stop();
-- delete _timer;
--
-- _tracks.clear();
-- clearList(_draws);
--}
--
--void FNCanvas::setScrollTiming(int v)
--{
-- _scrollTiming = v;
--}
--
--
--void FNCanvas::setVStep(int v)
--{
-- _v_step = v;
--}
--
--void FNCanvas::setHStep(int v)
--{
-- _h_step = v;
--}
--
--void FNCanvas::setSEraser(int v)
--{
-- _eraser_s = v;
--}
--
--void FNCanvas::setLEraser(int v)
--{
-- _eraser_l = v;
--}
--
--
--void FNCanvas::setMargin(int v)
--{
-- if (v < 3) {
-- v = 3;
-- }
-- _margin = v;
--}
--
--void FNCanvas::setScrollMode(int as)
--{
-- _asMode = as;
-- redraw();
--}
--
--void FNCanvas::autoScroll()
--{
-- if (AS_NONE == _asMode) {
-- if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode || MODE_SMOOTH == _drawMode) {
-- setOrigin(_origin.x(), _origin.y());
-- }
-- return;
-- }
-- bool tmp = _isHeadingEnables;
-- int dx = 0;
-- int dy = 0;
-- if (AS_BOTH == _asMode || AS_HORIZONTAL == _asMode) {
-- if (_last.x() > width() * (_margin - 1) / _margin) {
-- dx = _h_step;
-- } else if (_last.x() < width() / _margin) {
-- dx = -_h_step;
-- }
-- }
-- if (AS_BOTH == _asMode || AS_VERTICAL == _asMode) {
-- if (_last.y() > height() * (_margin - 1) / _margin) {
-- dy = _v_step;
-- } else if (_last.y() < height() / _margin) {
-- dy = -_v_step;
-- }
-- }
-- setOrigin(_origin.x() + dx, _origin.y() + dy);
-- _isHeadingEnables = tmp;
--}
--
--void FNCanvas::mousePressEvent(QMouseEvent* evt)
--{
-- setFocus();
-- _timer->stop();
-- _tracks.clear();
-- if (_viewMode) {
-- _isWaiting = true;
-- _viewMode = false;
-- setOrigin((int)((evt->x()) / _scale_x) - width() / 2, (int)((evt->y()) / _scale_y) - height() / 2);
-- redraw();
-- emit resetViewMode();
-- } else if (MODE_ERASE != _drawMode) {
-- _last = evt->pos();
-- _tracks.append(new QPoint(_last));
-- } else {
-- redraw();
-- _last = evt->pos();
-- _tracks.append(new QPoint(_last));
--
-- QPainter pbuf;
-- QPainter pwin;
-- pbuf.begin(&_buffer);
-- pwin.begin(this);
--
-- int w = _eraser_s;
-- if (PENWIDTH_MAX / 2 < _pen.width()) {
-- w = _eraser_l;
-- }
-- pbuf.setRasterOp(XorROP);
-- pbuf.setPen(QPen(white, 1));
-- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
--
-- pwin.setRasterOp(XorROP);
-- pwin.setPen(QPen(white, 1));
-- pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
--
-- pbuf.end();
-- pwin.end();
-- }
-- _isDragging = true;
--}
--
--void FNCanvas::mouseMoveEvent(QMouseEvent* evt)
--{
-- if (_isWaiting) {
-- return;
-- }
-- if (MODE_ERASE != _drawMode) {
-- QPainter pwin;
-- QPainter pbuf;
--
-- pwin.begin(this);
-- pbuf.begin(&_buffer);
--
-- pwin.setPen(_pen);
-- pbuf.setPen(_pen);
--
-- pwin.drawLine(_last, evt->pos());
-- pbuf.drawLine(_last, evt->pos());
--
-- pwin.end();
-- pbuf.end();
-- _last = evt->pos();
-- _tracks.append(new QPoint(_last));
-- } else {
-- //redraw();
-- if (_last.x() == -1) {
-- return;
-- }
-- QPainter pbuf;
-- QPainter pwin;
--
-- pbuf.begin(&_buffer);
-- pwin.begin(this);
--
-- int w = _eraser_s;
-- if (PENWIDTH_MAX / 2 < _pen.width()) {
-- w = _eraser_l;
-- }
-- pbuf.setRasterOp(XorROP);
-- pwin.setRasterOp(XorROP);
-- pbuf.setPen(QPen(white, 1));
-- pwin.setPen(QPen(white, 1));
-- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-- pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
--
-- _tracks.append(new QPoint(evt->pos()));
-- _last = evt->pos();
--
-- pbuf.setRasterOp(CopyROP);
-- pwin.setRasterOp(CopyROP);
-- QRect r = QRect(0, 0, width(), height());
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon* p = _draws.at(i);
-- if (r.intersects(p->boundingRect())) {
-- bool f = false;
-- QRect selected(_last.x() - w / 2, _last.y() - w / 2, w, w);
-- for (uint j = 0; j < p->points().count(); ++j) {
-- QPoint& pts = p->points().at(j);
-- if (selected.contains(pts)) {
-- f = true;
-- break;
-- }
-- }
-- if (f) {
-- p->drawShape(pbuf, f);
-- p->drawShape(pwin, f);
-- }
-- }
-- }
-- pbuf.setRasterOp(XorROP);
-- pwin.setRasterOp(XorROP);
-- pbuf.setPen(QPen(white, 1));
-- pwin.setPen(QPen(white, 1));
-- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-- pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-- pbuf.end();
-- pwin.end();
-- }
--}
--
--void FNCanvas::mouseReleaseEvent(QMouseEvent* evt)
--{
-- _isDragging = false;
-- if (_isWaiting) {
-- _isWaiting = false;
-- return;
-- }
-- _last = evt->pos();
-- if (MODE_ERASE != _drawMode) {
-- if (1 < _tracks.count()) {
-- FNPolygon* p = NULL;
-- if (MODE_FORMAT == _drawMode) {
-- p = new FNPolygon(_pen);
-- _tracks = AutoFormat(_tracks);
-- } else if (MODE_CURVE == _drawMode) {
-- QPoint sp = SnapPoint(*_tracks.at(0));
-- QPoint ep = SnapPoint(*_tracks.at(_tracks.count()-1));
-- _tracks = AutoCurve(_tracks);
-- if (sp == ep) {
-- p = new FNEllipse(_pen);
-- } else if (2 < _tracks.count()) {
-- p = new FNBezier(_pen);
-- } else {
-- p = new FNPolygon(_pen);
-- }
-- } else if (MODE_SMOOTH == _drawMode) {
-- _tracks = Smoothing(_tracks);
-- if (2 < _tracks.count()) {
-- p = new FNBezier(_pen);
-- } else {
-- p = new FNPolygon(_pen);
-- }
-- } else {
-- _tracks = Reduce(_tracks);
-- p = new FNPolygon(_pen);
-- }
-- if (1 < _tracks.count()) {
-- p->setPoints(_tracks);
-- redobuf_flush();
-- _draws.append(p);
-- }
-- }
-- _tracks.clear();
-- _isHeadingEnables = true;
-- _timer->start(_scrollTiming, true);
-- } else {
-- _last = QPoint(-1, -1);
-- _tracks.append(new QPoint(evt->pos()));
-- redraw();
-- }
--}
--
--void FNCanvas::paintEvent(QPaintEvent* evt)
--{
-- bitBlt(this, 0, 0, &_buffer);
--}
--
--void FNCanvas::resizeEvent(QResizeEvent* evt)
--{
-- QPixmap save(_buffer);
-- _buffer.resize(evt->size());
-- _buffer.fill(white);
-- bitBlt(&_buffer, 0, 0, &save);
-- redraw();
--}
--
--void FNCanvas::setOrigin(QPoint& o)
--{
-- this->setOrigin(o.x(), o.y());
--}
--
--QPoint FNCanvas::getTopLeft()
--{
-- if (0 == _draws.count() || !_isUseAllQuadrant) {
-- return _origin;
-- }
--
-- int dx = ((FNPolygon*)_draws.at(0))->boundingRect().x();
-- int dy = ((FNPolygon*)_draws.at(0))->boundingRect().y();
-- for (uint i = 1; i < _draws.count(); ++i) {
-- FNPolygon* p = _draws.at(i);
-- if (dx > p->boundingRect().x()) {
-- dx = p->boundingRect().x();
-- }
-- if (dy > p->boundingRect().y()) {
-- dy = p->boundingRect().y();
-- }
-- }
-- return QPoint(snap(dx), snap(dy));
--}
--
--
--void FNCanvas::rebuild()
--{
-- if (0 == _draws.count() || !_isUseAllQuadrant) {
-- return;
-- }
--
-- QPoint d = getTopLeft();
-- for (uint i = 0; i < _draws.count(); ++i) {
-- FNPolygon* p = _draws.at(i);
-- p->translate(-d.x(), -d.y());
-- }
--
-- _origin = QPoint(0, 0);
--}
--
--
--void FNCanvas::setOrigin(int ox, int oy)
--{
-- ox = snap(ox);
-- oy = snap(oy);
-- _isHeadingEnables = false;
-- _timer->stop();
--
--
-- int dx = 0;
-- int dy = 0;
-- if (!_isUseAllQuadrant) {
-- if (0 > ox) {
-- ox = 0;
-- }
-- if (0 > oy) {
-- oy = 0;
-- }
-- dx = _origin.x() - ox;
-- dy = _origin.y() - oy;
-- } else {
-- dx = _origin.x() - ox;
-- dy = _origin.y() - oy;
-- if (0 > ox) {
-- ox = 0;
-- }
-- if (0 > oy) {
-- oy = 0;
-- }
-- }
-- for (uint i = 0; i < _tracks.count(); ++i) {
-- QPoint* p = _tracks.at(i);
-- p->setX(p->x() + dx);
-- p->setY(p->y() + dy);
-- }
--
-- for (uint i = 0; i < _draws.count(); ++i) {
-- FNPolygon* p = _draws.at(i);
-- p->translate(dx, dy);
-- }
-- _origin = QPoint(ox, oy);
-- emit originChanged(ox, oy);
-- redraw();
--}
--
--void FNCanvas::redraw()
--{
-- if (!this->isVisible()) {
-- return;
-- }
-- _buffer.fill(white);
-- QPainter pbuf;
-- QRect r = QRect(0, 0, width(), height());
-- pbuf.begin(&_buffer);
-- if (_viewMode) {
-- float wx = 0;
-- float wy = 0;
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon* p = _draws.at(i);
-- QRect r = p->boundingRect();
-- if (wx < r.right()) {
-- wx = r.right();
-- }
-- if (wy < r.bottom()) {
-- wy = r.bottom();
-- }
-- }
-- wx += SNAP_SIZE;
-- wy += SNAP_SIZE;
-- wx = snap((int)wx);
-- wy = snap((int)wy);
-- wx = wx + _origin.x();
-- wy = wy + _origin.y();
-- _scale_x = (float)width() / wx;
-- _scale_y = (float)height() / wy;
-- if (1.0f < _scale_x) {
-- _scale_x = 1.0f;
-- }
-- if (1.0f < _scale_y) {
-- _scale_y = 1.0f;
-- }
-- if (_scale_x > _scale_y) {
-- _scale_x = _scale_y;
-- } else if (_scale_x < _scale_y) {
-- _scale_y = _scale_x;
-- }
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon* p = _draws.at(i);
-- FNPolygon* t = NULL;
-- if (p->type() == FN_BEZIER) {
-- t = new FNBezier(*(FNBezier*)p);
-- } else if (p->type() == FN_ELLIPSE) {
-- t = new FNEllipse(*(FNEllipse*)p);
-- } else {
-- t = new FNPolygon(*p);
-- }
-- t->translate(-_origin.x(), -_origin.y());
-- for (uint j = 0; j < t->points().count(); ++j) {
-- QPoint& pts = t->points().at(j);
-- int x = (int)(pts.x() * _scale_x);
-- int y = (int)(pts.y() * _scale_y);
-- pts.setX(x);
-- pts.setY(y);
-- }
-- double pensize = t->pen().width();
-- if (_scale_x > _scale_y) {
-- pensize = pensize * _scale_y;
-- } else {
-- pensize = pensize * _scale_x;
-- }
-- if (0 >= pensize) {
-- pensize = 1;
-- }
-- t->pen().setWidth(pensize);
-- t->drawShape(pbuf);
-- delete t;
-- }
-- } else if (MODE_ERASE != _drawMode) {
-- if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode) {
-- QPen pen1(QColor(0, 240, 240), 1);
-- QPen pen2(QColor(0, 0, 0), 1);
-- pbuf.setPen(QPen(QColor(0, 240, 240), 1));
-- pbuf.setPen(pen1);
-- for (int x = 0; x < width() + SNAP_SIZE; x += SNAP_SIZE) {
-- pbuf.drawLine(x - SNAP_SIZE / 2, 0, x - SNAP_SIZE / 2, height());
-- for (int y = 0; y < height() + SNAP_SIZE; y += SNAP_SIZE) {
-- pbuf.drawLine(0, y - SNAP_SIZE / 2, width(), y - SNAP_SIZE / 2);
-- pbuf.drawRect(x-1,y-1,2,2);
-- }
-- }
-- }
-- if (_isShowGuide) {
-- pbuf.setPen(QPen(cyan, 1, DashLine));
-- if (AS_HORIZONTAL == _asMode || AS_BOTH == _asMode) {
-- if (0 != _origin.x() || _isUseAllQuadrant) {
-- pbuf.drawLine(width() / _margin, 0, width() / _margin, height());
-- }
-- pbuf.drawLine(width() * (_margin - 1) / _margin, 0, width() * (_margin - 1) / _margin, height());
-- }
--
-- if (AS_VERTICAL == _asMode || AS_BOTH == _asMode) {
-- if (0 != _origin.y() || _isUseAllQuadrant) {
-- pbuf.drawLine(0, height() / _margin, width(), height() / _margin);
-- }
-- pbuf.drawLine(0, height() * (_margin - 1) / _margin, width(), height() * (_margin - 1) / _margin);
-- }
-- }
--
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon* p = _draws.at(i);
-- if (r.intersects(p->boundingRect())) {
-- p->drawShape(pbuf);
-- }
-- }
-- } else {
-- int w = _eraser_s;
-- if (PENWIDTH_MAX / 2 < _pen.width()) {
-- w = _eraser_l;
-- }
-- FNPointList removes;
-- for (uint i = 0; i < _tracks.count(); ++i) {
-- removes.append(_tracks.at(i));
-- }
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon* p = _draws.at(i);
-- if (r.intersects(p->boundingRect())) {
-- bool f = false;
-- for (uint j = 0; j < _tracks.count(); ++j) {
-- QPoint* pts = _tracks.at(j);
-- QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w);
-- for (uint k = 0; k < p->points().count(); ++k) {
-- QPoint& pts2 = p->points().at(k);
-- if (selected.contains(pts2)) {
-- f = true;
-- removes.remove(pts);
-- break;
-- }
-- }
-- if (f) {
-- break;
-- }
-- }
-- p->drawShape(pbuf, f);
-- }
-- }
-- for (uint i = 0; i < removes.count(); ++i) {
-- _tracks.remove(removes.at(i));
-- }
-- /*
-- if (_isDragging) {
-- pbuf.setPen(QPen(black, 1));
-- pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-- }
-- */
-- }
-- pbuf.end();
-- repaint();
--}
--
--void FNCanvas::changeColor(QRgb c)
--{
-- _pen.setColor(QColor(c));
--}
--
--void FNCanvas::undo()
--{
-- if (MODE_ERASE != _drawMode) {
-- ++_disp_offset;
-- if (_disp_offset > _draws.count()) {
-- _disp_offset = _draws.count();
-- }
-- } else {
-- _draws = _undobuf;
-- _marks.clear();
-- }
-- redraw();
--}
--
--void FNCanvas::redo()
--{
-- if (MODE_ERASE != _drawMode) {
-- if (0 < _disp_offset) {
-- --_disp_offset;
-- }
-- }
-- redraw();
--}
--
--void FNCanvas::clearList(FNPolygonList& list)
--{
-- list.setAutoDelete(true);
-- list.clear();
-- list.setAutoDelete(false);
--}
--
--void FNCanvas::clear()
--{
-- _disp_offset = 0;
-- clearList(_draws);
-- _undobuf.clear();
-- setOrigin(0, 0);
-- redraw();
--}
--
--void FNCanvas::viewChanged(bool flg)
--{
-- _tracks.clear();
-- _viewMode = flg;
-- if (_viewMode) {
-- if (_isUseAllQuadrant) {
-- rebuild();
-- }
-- setOrigin(0, 0);
-- }
-- redraw();
--}
--
--void FNCanvas::redobuf_flush()
--{
-- for (uint i = 0; i < _disp_offset; ++i) {
-- FNPolygon* p = _draws.last();
-- _draws.remove(p);
-- delete p;
-- }
-- _disp_offset = 0;
--}
--
--void FNCanvas::modeChanged(int mode)
--{
-- _tracks.clear();
-- _drawMode = mode;
-- redobuf_flush();
-- if (MODE_ERASE == _drawMode) {
-- _marks.clear();
-- _undobuf = _draws;
-- } else {
-- if (_draws.count() != _undobuf.count()) {
-- for (uint i = 0; i < _marks.count(); ++i) {
-- FNPolygon* p = _marks.at(i);
-- _draws.remove(p);
-- }
-- clearList(_marks);
-- }
-- }
-- redraw();
--}
--
--QRect FNCanvas::getMatrix(const QRect& r) const
--{
-- int ox = _origin.x();
-- int oy = _origin.y();
-- const int wide = 100;
--
-- int left = r.left() + ox;
-- int top = r.top() + oy;
-- int right = r.right() + ox;
-- int bottom = r.bottom() + oy;
--
-- left = (int)(left / wide) * wide;
-- top = (int)(top / wide) * wide;
-- right = (right % wide == 0 && left != right) ? right : (int)((right + wide) / wide) * wide;
-- bottom = (bottom % wide == 0 && top != bottom) ? bottom : (int)((bottom + wide) / wide) * wide;
--
-- return QRect(left - ox, top - oy, right - left, bottom - top);
--}
--
--void FNCanvas::CR()
--{
-- if (MODE_ERASE == _drawMode) {
-- return;
-- }
-- if (_isHeadingEnables) {
-- //last\82©\82ç\81A\8d¶\95û\8cü\82É\8cü\82¯\82Ä\92T\8dõ\82·\82é\81B
-- QRect r = getMatrix(_draws.last()->boundingRect());
-- bool isSearching = true;
-- r.moveBy(-100, 0);
-- while (isSearching) {
-- isSearching = false;
-- for (uint i = 0; i < _draws.count(); ++i) {
-- FNPolygon* p = _draws.at(i);
-- const QRect& r2 = p->boundingRect();
-- if (r.intersects(r2)) {
-- if (r.left() + 100 > r2.left()) {
-- r = getMatrix(r2);
-- r.moveBy(-100, 0);
-- isSearching = true;
-- break;
-- }
-- }
-- }
-- }
-- r.moveBy(100, 0);
-- //last\82ª\89æ\96Ê\82Ì4/5\88È\89º\82È\82ç\82Î\81A\83X\83N\83\8d\81[\83\8b\83A\83b\83v\82·\82é\81B
-- //\82»\82¤\82Å\82È\82¯\82ê\82Î\81A\83w\83b\83f\83B\83\93\83O\82Ì\82Ý\81B
-- if (_last.y() > height() * 4 / 5) {
-- setOrigin(_origin.x() + r.x(), _origin.y() + 50);
-- } else {
-- setOrigin(_origin.x() + r.x(), _origin.y());
-- }
-- _isHeadingEnables = false;
-- } else {
-- //last\82Ì\8eü\88Í\82É\89½\82à\96³\82¢\8fê\8d\87\82Í\81A\8fc\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B
-- setOrigin(_origin.x(), _origin.y() + 50);
-- }
--}
--
--void FNCanvas::erase()
--{
-- if (MODE_ERASE != _drawMode) {
-- return;
-- }
-- FNPolygonList temp;
-- int w = _eraser_s;
-- if (PENWIDTH_MAX / 2 < _pen.width()) {
-- w = _eraser_l;
-- }
-- QRect r = QRect(0, 0, width(), height());
-- for (uint i = 0; i < _draws.count(); ++i) {
-- FNPolygon* p = _draws.at(i);
-- bool f = false;
-- if (r.intersects(p->boundingRect())) {
-- for (uint j = 0; j < _tracks.count(); ++j) {
-- QPoint* pts = _tracks.at(j);
-- QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w);
-- for (uint k = 0; k < p->points().count(); ++k) {
-- QPoint& pts2 = p->points().at(k);
-- if (selected.contains(pts2)) {
-- temp.append(p);
-- f = true;
-- break;
-- }
-- }
-- if (f) {
-- break;
-- }
-- }
-- }
-- }
-- for (uint i = 0; i < temp.count(); ++i) {
-- _draws.remove(temp.at(i));
-- _marks.append(temp.at(i));
-- }
-- _tracks.clear();
-- redraw();
--}
--
--void FNCanvas::setPensize(int sz)
--{
-- _pen.setWidth(sz);
--}
--
--bool FNCanvas::exportPNG(const QFileInfo& info, QPixmap& buf)
--{
-- if (0 == info.fileName().length()) {
-- QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-- return false;
-- }
-- if (info.extension(false) != "png") {
-- QMessageBox::warning(0,"FreeNoteQt", "extension '.png' expected.");
-- return false;
-- }
--
-- bool ret = buf.save(info.absFilePath(), "PNG");
-- if (ret) {
-- FNMessageBox::information(0,"FreeNoteQt", "export PNG complete.");
-- } else {
-- QMessageBox::warning(0,"FreeNoteQt", "could not export file.");
-- }
-- return ret;
--}
--
--QString FNCanvas::mkPDFscript(FNPolygon* elm)
--{
-- QString s ="";
-- char buf[1024];
--
-- float r = (float)elm->pen().color().red() / 255.0f;
-- float g = (float)elm->pen().color().green() / 255.0f;
-- float b = (float)elm->pen().color().blue() / 255.0f;
-- s += "q\n";
-- sprintf(buf, "%f %f %f RG\n", r, g, b);
-- s += buf;
-- QPointArray points = elm->points().copy();
-- points.translate(_origin.x(), _origin.y());
-- if (elm->type() == FN_BEZIER) {
-- sprintf(buf, "%d %d m\n", points[0].x(), points[0].y());
-- s += buf;
-- for (uint j = 1; j < points.count(); j += 3) {
-- sprintf(buf, "%d %d %d %d %d %d c\n",
-- points[j].x(), points[j].y(),
-- points[j + 1].x(), points[j + 1].y(),
-- points[j + 2].x(), points[j + 2].y()
-- );
-- s += buf;
-- }
-- } else if (elm->type() == FN_ELLIPSE) {
-- int x = points[0].x();
-- int y = points[0].y();
-- int ex = points[1].x();
-- int ey = points[1].y();
-- int w = ex - x;
-- int h = ey - y;
-- int cx = x + w/2;
-- int cy = y;
-- int x1 = x + 3*w/4;
-- int y1 = y;
-- int x2 = x + w;
-- int y2 = y + h/4;
-- int x3 = x + w;
-- int y3 = y + h/2;
--
-- sprintf(buf, "%d %d m\n%d %d %d %d %d %d c\n", cx, cy, x1, y1, x2, y2, x3, y3);
-- s += buf;
-- x1 = x + w;
-- y1 = y + 3 * h / 4;
-- x2 = x + 3 * w / 4;
-- y2 = y + h;
-- x3 = x + w/2;
-- y3 = y + h;
-- sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3);
-- s += buf;
--
-- x1 = x + w / 4;
-- y1 = y + h;
-- x2 = x;
-- y2 = y + 3 * h / 4;
-- x3 = x;
-- y3 = y + h / 2;
-- sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3);
-- s += buf;
-- x1 = x;
-- y1 = y + h / 4;
-- x2 = x + w / 4;
-- y2 = y;
-- x3 = x + w / 2;
-- y3 = y;
-- sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3);
-- s += buf;
-- } else {
-- sprintf(buf, "%d %d m\n", points[0].x(), points[0].y());
-- s += buf;
-- for (uint j = 1; j < points.count(); ++j) {
-- sprintf(buf, "%d %d l\n", points[j].x(), points[j].y());
-- s += buf;
-- }
-- }
-- sprintf(buf, "%d w\n", elm->pen().width());
-- s += buf;
-- s += "S\n";
-- s += "Q\n";
-- return s;
--}
--
--bool FNCanvas::exportPDF(const QFileInfo& info)
--{
-- if (0 == info.fileName().length()) {
-- QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-- return false;
-- }
-- if (info.extension(false) != "pdf") {
-- QMessageBox::warning(0,"FreeNoteQt", "extension '.pdf' expected.");
-- return false;
-- }
--
-- FILE* fp = NULL;
-- if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) {
-- QMessageBox::warning(0,"FreeNoteQt", "could not export file.");
-- return false;
-- }
--
-- QPoint o = getTopLeft();
-- rebuild();
-- int wx = 595;
-- int wy = 842;
-- char buf[1024];
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon* p = _draws.at(i);
-- QRect r = p->boundingRect();
-- r.moveBy(_origin.x(), _origin.y());
-- if (wx < r.right()) {
-- wx =r.right();
-- }
-- if (wy < r.bottom()) {
-- wy = r.bottom();
-- }
-- }
--
-- int len = 0;
--
-- sprintf(buf, "1 0 0 -1 0 %d cm\n", wy);
-- QString cm = buf;
-- len += cm.length();
--
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- QString s = mkPDFscript(_draws.at(i));
-- len += s.length();
-- }
--
-- QString header = "";
-- header += "%PDF-1.3\n";
-- header += "1 0 obj\n";
-- header += "<<\n";
-- header += "/Type /Page\n";
-- header += "/Parent 3 0 R\n";
-- header += "/Resources\n";
-- header += "<<\n";
-- header += "/ProcSet [ /PDF ]\n";
-- header += ">>\n";
-- sprintf(buf, "/MediaBox [ 0 0 %010d %010d ]\n", wx, wy);
-- header += buf;
-- header += "/Contents 4 0 R\n";
-- header += ">>\n";
-- header += "endobj\n";
-- header += "2 0 obj\n";
-- header += "<<\n";
-- header += "/Type /Catalog\n";
-- header += "/Pages 3 0 R\n";
-- header += "/PageLayout /OneColumn\n";
-- header += "/OpenAction [1 0 R /XYZ null null 1 ]\n";
-- header += ">>\n";
-- header += "endobj\n";
-- header += "3 0 obj\n";
-- header += "<<\n";
-- header += "/Type /Pages\n";
-- header += "/Kids [ 1 0 R ]\n";
-- header += "/Count 1\n";
-- header += ">>\n";
-- header += "endobj\n";
-- header += "4 0 obj\n";
-- sprintf(buf, "<< /Length %010d >>\n", len);
-- header += buf;
-- header += "stream\n";
--
-- QString footer = "";
-- footer += "xref\n";
-- footer += "0 5\n";
-- footer += "0000000000 65535 f \n";
-- footer += "0000000009 00000 n \n";
-- footer += "0000000147 00000 n \n";
-- footer += "0000000257 00000 n \n";
-- footer += "0000000316 00000 n \n";
-- footer += "trailer\n";
-- footer += "<<\n";
-- footer += "/Size 5\n";
-- footer += "/Root 2 0 R\n";
-- footer += ">>\n";
-- footer += "startxref\n";
--
-- len = cm.length();
-- len += header.length();
-- fputs(header, fp);
-- fputs(cm, fp);
--
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- QString s = mkPDFscript(_draws.at(i));
-- len += s.length();
-- fputs(s, fp);
-- }
-- QString streamfooter = "endstream\nendobj\n";
-- len += streamfooter.length();
-- fputs(streamfooter, fp);
--
-- fputs(footer, fp);
-- sprintf(buf, "%d\n", len);
-- fputs(buf, fp);
-- fputs("%%EOF\n", fp);
-- fclose(fp);
-- if (_isUseAllQuadrant) {
-- setOrigin(-o.x(), -o.y());
-- }
-- FNMessageBox::information(0,"FreeNoteQt", "export PDF complete.");
-- return true;
--}
--
--bool FNCanvas::save(const QFileInfo& info)
--{
-- if (0 == info.fileName().length()) {
-- QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-- return false;
-- }
-- if (info.extension(false) != "free") {
-- QMessageBox::warning(0,"FreeNoteQt", "extension '.free' expected.");
-- return false;
-- }
-- FILE* fp = NULL;
-- if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) {
-- QMessageBox::warning(0,"FreeNoteQt", "could not save file.");
-- return false;
-- }
-- QPoint o = getTopLeft();
-- rebuild();
-- fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", fp);
-- fputs("<freenote version=\"2.0\">\n", fp);
-- char buf[1024];
-- for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-- FNPolygon p(*_draws.at(i));
-- p.translate(_origin.x(), _origin.y());
-- if (p.type() == FN_BEZIER) {
-- sprintf(buf, "\t<bz color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());
-- } else if (p.type() == FN_ELLIPSE) {
-- sprintf(buf, "\t<el color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());
-- } else {
-- sprintf(buf, "\t<po color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());
-- }
-- fputs(buf, fp);
-- QPointArray& points = p.points();
-- for (uint j = 0; j < points.count(); ++j) {
-- QPoint point = points.point(j);
-- sprintf(buf, "\t\t<p x=\"%d\" y=\"%d\"/>\n", point.x(), point.y());
-- fputs(buf, fp);
-- }
-- if (p.type() == FN_BEZIER) {
-- fputs("\t</bz>\n", fp);
-- } else if (p.type() == FN_ELLIPSE) {
-- fputs("\t</el>\n", fp);
-- } else {
-- fputs("\t</po>\n", fp);
-- }
-- }
-- fputs("</freenote>\n", fp);
-- fclose(fp);
-- if (_isUseAllQuadrant) {
-- setOrigin(-o.x(), -o.y());
-- }
-- FNMessageBox::information(0, "FreeNoteQt", "save complete.");
-- return true;
--}
--
--bool FNCanvas::load(const QFileInfo& info)
--{
-- if (0 == info.fileName().length()) {
-- QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-- return false;
-- }
-- if (!info.exists()) {
-- QMessageBox::warning(0,"FreeNoteQt", "file not exists.");
-- return false;
-- }
-- FILE* fp = NULL;
-- if (!(fp = fopen(info.absFilePath().utf8(), "rt"))) {
-- QMessageBox::warning(0,"FreeNoteQt", "could not open file.");
-- return false;
-- }
-- clear();
--
-- QString line;
-- FNPointList points;
-- points.setAutoDelete(true);
-- int c;
-- int w;
-- QPen pen(Qt::black, 1);
-- FNPolygon* polygon;
--
-- char rdbuf[1024];
-- char buf[1024];
-- QString type = "";
-- while (!feof(fp)) {
-- fgets(rdbuf, sizeof(rdbuf), fp);
-- line = rdbuf;
-- if (-1 != line.find("<fnpolygon ") ||
-- -1 != line.find("<po ") ||
-- -1 != line.find("<bz ") ||
-- -1 != line.find("<el ")
-- ) {
-- if (-1 != line.find("<el ")) {
-- type = "Ellipse";
-- } else if (-1 != line.find("<bz ")) {
-- type = "Bezier";
-- } else {
-- type = "Polygon";
-- }
-- points.clear();
-- int st = line.find("color") + 7;
-- int ed = line.find("\"", st);
-- strcpy(buf, line.mid(st, ed - st).utf8());
-- sscanf(buf, "%x", &c);
-- st = line.find("width") + 7;
-- ed = line.find("\"", st);
-- strcpy(buf, line.mid(st, ed - st).utf8());
-- sscanf(buf, "%d", &w);
-- } else if (-1 != line.find("<point ") ||
-- -1 != line.find("<p ")
-- ) {
-- int st = line.find("x=") + 3;
-- int ed = line.find("\"", st);
-- strcpy(buf, line.mid(st, ed - st).utf8());
-- int x;
-- sscanf(buf, "%d", &x);
--
-- st = line.find("y=") + 3;
-- ed = line.find("\"", st);
-- strcpy(buf, line.mid(st, ed - st).utf8());
-- int y;
-- sscanf(buf, "%d", &y);
-- points.append(createPts(x, y)); //\83o\83O\91Î\8dô
-- } else if (-1 != line.find("</fnpolygon") ||
-- -1 != line.find("</bz") ||
-- -1 != line.find("</el") ||
-- -1 != line.find("</po")) {
-- pen.setColor((QRgb)c);
-- pen.setWidth(w);
-- if (type == "Bezier") {
-- _draws.append(polygon = createBezier(pen)); //\83o\83O\91Î\8dô
-- } else if (type == "Ellipse") {
-- _draws.append(polygon = createEllipse(pen)); //\83o\83O\91Î\8dô
-- } else {
-- _draws.append(polygon = createPolygon(pen)); //\83o\83O\91Î\8dô
-- }
-- polygon->setPoints(points);
-- points.clear();
-- }
-- }
-- fclose(fp);
-- int x = 0;
-- int y = 0;
-- for (uint i = 0; i < _draws.count(); ++i) {
-- if (y > _draws.at(i)->boundingRect().top()) {
-- y = _draws.at(i)->boundingRect().top();
-- }
-- if (x > _draws.at(i)->boundingRect().left()) {
-- x = _draws.at(i)->boundingRect().left();
-- }
-- }
-- for (uint i = 0; i < _draws.count(); ++i) {
-- _draws.at(i)->translate(-x, -y);
-- }
-- redraw();
-- FNMessageBox::information(0,"FreeNoteQt", "load complete.");
--
-- return true;
--}
--
--FNPolygon* FNCanvas::createPolygon(QPen& pen)
--{
-- return new FNPolygon(pen);
--}
--
--FNPolygon* FNCanvas::createBezier(QPen& pen)
--{
-- return new FNBezier(pen);
--}
--
--
--FNPolygon* FNCanvas::createEllipse(QPen& pen)
--{
-- return new FNEllipse(pen);
--}
--
--QPoint* FNCanvas::createPts(int x, int y)
--{
-- return new QPoint(x, y);
--}
--
--void FNCanvas::setGuide(bool f)
--{
-- _isShowGuide = f;
-- redraw();
--}
-+/* FreeNote for Sharp SLA300, B500, C7x0 Linux PDA
-+ Copyright (C) 2003 Joe Kanemori.<kanemori@ymg.urban.ne.jp>
-+
-+ 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.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+*/
-+/*
-+2003/12/23 ver 1.6.1
-+\81E\95Û\91¶\8fî\95ñ\82Ì\83T\83C\83Y\8fk\8f¬
-+
-+2003/12/16-19 ver 1.5.5pre
-+\81E\83y\83\93\83T\83C\83Y\82Ì\92Ç\89Á(1-8)
-+\81E\83A\83\93\83h\83D\81E\83\8a\83h\83D\82Ì\8eÀ\91\95
-+
-+2003/12/14 ver 1.5.4pre
-+\81E\83y\83\93\83T\83C\83Y\82ð\91I\91ð\89Â\94\\82É\81B
-+
-+2003/12/05 ver 1.5.3Apre
-+\81E\83O\83\8a\83b\83h\82Ì\90F\82ð\8fC\90³
-+
-+2003/12/04 ver 1.5.3pre
-+\81E\83O\83\8a\83b\83h\82Ì\95`\89æ\82ð\88ê\95\94\8fC\90³
-+
-+2003/11/10 ver 1.5.1pre
-+\81E\8bÈ\90ü\90®\8c`\83\82\81[\83h\92Ç\89Á
-+
-+2003/11/09 ver 1.5.0pre
-+\81E\8e©\93®\90®\8c`\83\82\81[\83h\92Ç\89Á
-+
-+2003/09/03 ver 1.3.4pre
-+\81EUse all quadrant OFF\8e\9e\82É\95\\8e¦\88Ê\92u\82ª\83\8a\83Z\83b\83g\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\83o\83O\91Î\89\9e\81B
-+
-+2003/09/01-03 ver 1.3.3pre
-+\81E\83X\83N\83\8d\81[\83\8b\82Ì\89ü\97Ç
-+\81EUse all quadrant(\91S\8fÛ\8cÀ\82ð\8eg\97p\82·\82é)\83\81\83j\83\85\81[\82ð\92Ç\89Á
-+
-+2003/08/31 FreeNote 1.3.2pre
-+\81E\91S\95û\8cü\83X\83N\83\8d\81[\83\8b
-+
-+2003/08/23 FreeNote 1.3.0pre
-+\81ECR\93®\8dì\82Ì\8fC\90³
-+
-+2003/08/15 FreeNote 1.2.1\82ð\8cö\8aJ
-+\81E\95Û\91¶\8e\9e\82Ì\83o\83O\8fC\90³
-+\81E\8a®\97¹\83_\83C\83A\83\8d\83O\82Ì\8e©\93®\8fÁ\8b\8e
-+\81EPNG\83t\83@\83C\83\8b\82Ö\82Ì\8fo\97Í
-+
-+2003/08/15 FreeNote 1.2\82ð\8cö\8aJ
-+\81E\83I\83v\83V\83\87\83\93\92Ç\89Á
-+\81E\83X\83N\83\8d\81[\83\8b\83K\83C\83h
-+\81EFree\83t\83@\83C\83\8b\8aÖ\98A\95t\82¯
-+\81E\83A\83C\83R\83\93\82Ì\95Ï\8dX
-+
-+2003/08/05 FreeNote 1.1.1pre\82ð\8cö\8aJ
-+\81E\8d\82\91¬\8bN\93®\8e\9e\82É\95Â\82¶\82½\8fó\91Ô\82ð\95Û\8e\9d
-+\81E\95`\89æ\83\82\81[\83h\90Ø\91Ö\82¦\8e\9e\82É\8fÁ\82µ\83S\83\80\95\\8e¦
-+\81E\95Û\91¶\8e\9e\8aÔ\92Z\8fk
-+\81EView\83\82\81[\83h\82Ì\8b\93\93®\82ð\95Ï\8dX
-+\81E\83\81\83j\83\85\81[\82Ì\8c©\82½\96Ú\82ð\95Ï\8dX
-+*/
-+#include "fncanvas.h"
-+#include <stdio.h>
-+#include <qfile.h>
-+#include <qmessagebox.h>
-+#include <qtextstream.h>
-+#include <qpen.h>
-+#include <qcolor.h>
-+#include <qpoint.h>
-+#include <qthread.h>
-+#include <qimage.h>
-+#include <math.h>
-+#include <stdlib.h> // abs
-+#include "fnmessagebox.h"
-+#include "fmtengine.h"
-+
-+int snap(int v) {
-+ int tv = abs(v);
-+ tv = ((int)(tv + SNAP_SIZE / 2) / SNAP_SIZE) * SNAP_SIZE;
-+ if (0 > v) {
-+ return -tv;
-+ } else {
-+ return tv;
-+ }
-+}
-+
-+FNCanvas::FNCanvas(QWidget* parent, const char* name, WFlags f )
-+ :QWidget(parent, name, f),
-+ _pen(black, 1, SolidLine, RoundCap, RoundJoin),
-+ _asMode(AS_NONE),
-+ _drawMode(MODE_DRAW),
-+ _disp_offset(0),
-+ _eraser_l(50),
-+ _eraser_s(10),
-+ _h_step(100),
-+ _v_step(100),
-+ _margin(5),
-+ _scrollTiming(800),
-+ _viewMode(false),
-+ _isWaiting(false),
-+ _isDragging(false),
-+ _isHeadingEnables(false),
-+ _isShowGuide(false),
-+ _isUseAllQuadrant(false),
-+ _scale_x(1.0),
-+ _scale_y(1.0)
-+{
-+ _tracks.setAutoDelete(true);
-+ this->setBackgroundMode(NoBackground);
-+ _timer = new QTimer(this);
-+ connect(_timer, SIGNAL(timeout()), this, SLOT(autoScroll()));
-+}
-+
-+FNCanvas::~FNCanvas()
-+{
-+ _timer->stop();
-+ delete _timer;
-+
-+ _tracks.clear();
-+ clearList(_draws);
-+}
-+
-+void FNCanvas::setScrollTiming(int v)
-+{
-+ _scrollTiming = v;
-+}
-+
-+
-+void FNCanvas::setVStep(int v)
-+{
-+ _v_step = v;
-+}
-+
-+void FNCanvas::setHStep(int v)
-+{
-+ _h_step = v;
-+}
-+
-+void FNCanvas::setSEraser(int v)
-+{
-+ _eraser_s = v;
-+}
-+
-+void FNCanvas::setLEraser(int v)
-+{
-+ _eraser_l = v;
-+}
-+
-+
-+void FNCanvas::setMargin(int v)
-+{
-+ if (v < 3) {
-+ v = 3;
-+ }
-+ _margin = v;
-+}
-+
-+void FNCanvas::setScrollMode(int as)
-+{
-+ _asMode = as;
-+ redraw();
-+}
-+
-+void FNCanvas::autoScroll()
-+{
-+ if (AS_NONE == _asMode) {
-+ if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode || MODE_SMOOTH == _drawMode) {
-+ setOrigin(_origin.x(), _origin.y());
-+ }
-+ return;
-+ }
-+ bool tmp = _isHeadingEnables;
-+ int dx = 0;
-+ int dy = 0;
-+ if (AS_BOTH == _asMode || AS_HORIZONTAL == _asMode) {
-+ if (_last.x() > width() * (_margin - 1) / _margin) {
-+ dx = _h_step;
-+ } else if (_last.x() < width() / _margin) {
-+ dx = -_h_step;
-+ }
-+ }
-+ if (AS_BOTH == _asMode || AS_VERTICAL == _asMode) {
-+ if (_last.y() > height() * (_margin - 1) / _margin) {
-+ dy = _v_step;
-+ } else if (_last.y() < height() / _margin) {
-+ dy = -_v_step;
-+ }
-+ }
-+ setOrigin(_origin.x() + dx, _origin.y() + dy);
-+ _isHeadingEnables = tmp;
-+}
-+
-+void FNCanvas::mousePressEvent(QMouseEvent* evt)
-+{
-+ setFocus();
-+ _timer->stop();
-+ _tracks.clear();
-+ if (_viewMode) {
-+ _isWaiting = true;
-+ _viewMode = false;
-+ setOrigin((int)((evt->x()) / _scale_x) - width() / 2, (int)((evt->y()) / _scale_y) - height() / 2);
-+ redraw();
-+ emit resetViewMode();
-+ } else if (MODE_ERASE != _drawMode) {
-+ _last = evt->pos();
-+ _tracks.append(new QPoint(_last));
-+ } else {
-+ redraw();
-+ _last = evt->pos();
-+ _tracks.append(new QPoint(_last));
-+
-+ QPainter pbuf;
-+ QPainter pwin;
-+ pbuf.begin(&_buffer);
-+ pwin.begin(this);
-+
-+ int w = _eraser_s;
-+ if (PENWIDTH_MAX / 2 < _pen.width()) {
-+ w = _eraser_l;
-+ }
-+ pbuf.setRasterOp(XorROP);
-+ pbuf.setPen(QPen(white, 1));
-+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+
-+ pwin.setRasterOp(XorROP);
-+ pwin.setPen(QPen(white, 1));
-+ pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+
-+ pbuf.end();
-+ pwin.end();
-+ }
-+ _isDragging = true;
-+}
-+
-+void FNCanvas::mouseMoveEvent(QMouseEvent* evt)
-+{
-+ if (_isWaiting) {
-+ return;
-+ }
-+ if (MODE_ERASE != _drawMode) {
-+ QPainter pwin;
-+ QPainter pbuf;
-+
-+ pwin.begin(this);
-+ pbuf.begin(&_buffer);
-+
-+ pwin.setPen(_pen);
-+ pbuf.setPen(_pen);
-+
-+ pwin.drawLine(_last, evt->pos());
-+ pbuf.drawLine(_last, evt->pos());
-+
-+ pwin.end();
-+ pbuf.end();
-+ _last = evt->pos();
-+ _tracks.append(new QPoint(_last));
-+ } else {
-+ //redraw();
-+ if (_last.x() == -1) {
-+ return;
-+ }
-+ QPainter pbuf;
-+ QPainter pwin;
-+
-+ pbuf.begin(&_buffer);
-+ pwin.begin(this);
-+
-+ int w = _eraser_s;
-+ if (PENWIDTH_MAX / 2 < _pen.width()) {
-+ w = _eraser_l;
-+ }
-+ pbuf.setRasterOp(XorROP);
-+ pwin.setRasterOp(XorROP);
-+ pbuf.setPen(QPen(white, 1));
-+ pwin.setPen(QPen(white, 1));
-+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+ pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+
-+ _tracks.append(new QPoint(evt->pos()));
-+ _last = evt->pos();
-+
-+ pbuf.setRasterOp(CopyROP);
-+ pwin.setRasterOp(CopyROP);
-+ QRect r = QRect(0, 0, width(), height());
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ if (r.intersects(p->boundingRect())) {
-+ bool f = false;
-+ QRect selected(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+ for (uint j = 0; j < p->points().count(); ++j) {
-+ QPoint& pts = p->points().at(j);
-+ if (selected.contains(pts)) {
-+ f = true;
-+ break;
-+ }
-+ }
-+ if (f) {
-+ p->drawShape(pbuf, f);
-+ p->drawShape(pwin, f);
-+ }
-+ }
-+ }
-+ pbuf.setRasterOp(XorROP);
-+ pwin.setRasterOp(XorROP);
-+ pbuf.setPen(QPen(white, 1));
-+ pwin.setPen(QPen(white, 1));
-+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+ pwin.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+ pbuf.end();
-+ pwin.end();
-+ }
-+}
-+
-+void FNCanvas::mouseReleaseEvent(QMouseEvent* evt)
-+{
-+ _isDragging = false;
-+ if (_isWaiting) {
-+ _isWaiting = false;
-+ return;
-+ }
-+ _last = evt->pos();
-+ if (MODE_ERASE != _drawMode) {
-+ if (1 < _tracks.count()) {
-+ FNPolygon* p = NULL;
-+ if (MODE_FORMAT == _drawMode) {
-+ p = new FNPolygon(_pen);
-+ _tracks = AutoFormat(_tracks);
-+ } else if (MODE_CURVE == _drawMode) {
-+ QPoint sp = SnapPoint(*_tracks.at(0));
-+ QPoint ep = SnapPoint(*_tracks.at(_tracks.count()-1));
-+ _tracks = AutoCurve(_tracks);
-+ if (sp == ep) {
-+ p = new FNEllipse(_pen);
-+ } else if (2 < _tracks.count()) {
-+ p = new FNBezier(_pen);
-+ } else {
-+ p = new FNPolygon(_pen);
-+ }
-+ } else if (MODE_SMOOTH == _drawMode) {
-+ _tracks = Smoothing(_tracks);
-+ if (2 < _tracks.count()) {
-+ p = new FNBezier(_pen);
-+ } else {
-+ p = new FNPolygon(_pen);
-+ }
-+ } else {
-+ _tracks = Reduce(_tracks);
-+ p = new FNPolygon(_pen);
-+ }
-+ if (1 < _tracks.count()) {
-+ p->setPoints(_tracks);
-+ redobuf_flush();
-+ _draws.append(p);
-+ }
-+ }
-+ _tracks.clear();
-+ _isHeadingEnables = true;
-+ _timer->start(_scrollTiming, true);
-+ } else {
-+ _last = QPoint(-1, -1);
-+ _tracks.append(new QPoint(evt->pos()));
-+ redraw();
-+ }
-+}
-+
-+void FNCanvas::paintEvent(QPaintEvent* evt)
-+{
-+ bitBlt(this, 0, 0, &_buffer);
-+}
-+
-+void FNCanvas::resizeEvent(QResizeEvent* evt)
-+{
-+ QPixmap save(_buffer);
-+ _buffer.resize(evt->size());
-+ _buffer.fill(white);
-+ bitBlt(&_buffer, 0, 0, &save);
-+ redraw();
-+}
-+
-+void FNCanvas::setOrigin(QPoint& o)
-+{
-+ this->setOrigin(o.x(), o.y());
-+}
-+
-+QPoint FNCanvas::getTopLeft()
-+{
-+ if (0 == _draws.count() || !_isUseAllQuadrant) {
-+ return _origin;
-+ }
-+
-+ int dx = ((FNPolygon*)_draws.at(0))->boundingRect().x();
-+ int dy = ((FNPolygon*)_draws.at(0))->boundingRect().y();
-+ for (uint i = 1; i < _draws.count(); ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ if (dx > p->boundingRect().x()) {
-+ dx = p->boundingRect().x();
-+ }
-+ if (dy > p->boundingRect().y()) {
-+ dy = p->boundingRect().y();
-+ }
-+ }
-+ return QPoint(snap(dx), snap(dy));
-+}
-+
-+
-+void FNCanvas::rebuild()
-+{
-+ if (0 == _draws.count() || !_isUseAllQuadrant) {
-+ return;
-+ }
-+
-+ QPoint d = getTopLeft();
-+ for (uint i = 0; i < _draws.count(); ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ p->translate(-d.x(), -d.y());
-+ }
-+
-+ _origin = QPoint(0, 0);
-+}
-+
-+
-+void FNCanvas::setOrigin(int ox, int oy)
-+{
-+ ox = snap(ox);
-+ oy = snap(oy);
-+ _isHeadingEnables = false;
-+ _timer->stop();
-+
-+
-+ int dx = 0;
-+ int dy = 0;
-+ if (!_isUseAllQuadrant) {
-+ if (0 > ox) {
-+ ox = 0;
-+ }
-+ if (0 > oy) {
-+ oy = 0;
-+ }
-+ dx = _origin.x() - ox;
-+ dy = _origin.y() - oy;
-+ } else {
-+ dx = _origin.x() - ox;
-+ dy = _origin.y() - oy;
-+ if (0 > ox) {
-+ ox = 0;
-+ }
-+ if (0 > oy) {
-+ oy = 0;
-+ }
-+ }
-+ for (uint i = 0; i < _tracks.count(); ++i) {
-+ QPoint* p = _tracks.at(i);
-+ p->setX(p->x() + dx);
-+ p->setY(p->y() + dy);
-+ }
-+
-+ for (uint i = 0; i < _draws.count(); ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ p->translate(dx, dy);
-+ }
-+ _origin = QPoint(ox, oy);
-+ emit originChanged(ox, oy);
-+ redraw();
-+}
-+
-+void FNCanvas::redraw()
-+{
-+ if (!this->isVisible()) {
-+ return;
-+ }
-+ _buffer.fill(white);
-+ QPainter pbuf;
-+ QRect r = QRect(0, 0, width(), height());
-+ pbuf.begin(&_buffer);
-+ if (_viewMode) {
-+ float wx = 0;
-+ float wy = 0;
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ QRect r = p->boundingRect();
-+ if (wx < r.right()) {
-+ wx = r.right();
-+ }
-+ if (wy < r.bottom()) {
-+ wy = r.bottom();
-+ }
-+ }
-+ wx += SNAP_SIZE;
-+ wy += SNAP_SIZE;
-+ wx = snap((int)wx);
-+ wy = snap((int)wy);
-+ wx = wx + _origin.x();
-+ wy = wy + _origin.y();
-+ _scale_x = (float)width() / wx;
-+ _scale_y = (float)height() / wy;
-+ if (1.0f < _scale_x) {
-+ _scale_x = 1.0f;
-+ }
-+ if (1.0f < _scale_y) {
-+ _scale_y = 1.0f;
-+ }
-+ if (_scale_x > _scale_y) {
-+ _scale_x = _scale_y;
-+ } else if (_scale_x < _scale_y) {
-+ _scale_y = _scale_x;
-+ }
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ FNPolygon* t = NULL;
-+ if (p->type() == FN_BEZIER) {
-+ t = new FNBezier(*(FNBezier*)p);
-+ } else if (p->type() == FN_ELLIPSE) {
-+ t = new FNEllipse(*(FNEllipse*)p);
-+ } else {
-+ t = new FNPolygon(*p);
-+ }
-+ t->translate(-_origin.x(), -_origin.y());
-+ for (uint j = 0; j < t->points().count(); ++j) {
-+ QPoint& pts = t->points().at(j);
-+ int x = (int)(pts.x() * _scale_x);
-+ int y = (int)(pts.y() * _scale_y);
-+ pts.setX(x);
-+ pts.setY(y);
-+ }
-+ double pensize = t->pen().width();
-+ if (_scale_x > _scale_y) {
-+ pensize = pensize * _scale_y;
-+ } else {
-+ pensize = pensize * _scale_x;
-+ }
-+ if (0 >= pensize) {
-+ pensize = 1;
-+ }
-+ t->pen().setWidth(pensize);
-+ t->drawShape(pbuf);
-+ delete t;
-+ }
-+ } else if (MODE_ERASE != _drawMode) {
-+ if (MODE_FORMAT == _drawMode || MODE_CURVE == _drawMode) {
-+ QPen pen1(QColor(0, 240, 240), 1);
-+ QPen pen2(QColor(0, 0, 0), 1);
-+ pbuf.setPen(QPen(QColor(0, 240, 240), 1));
-+ pbuf.setPen(pen1);
-+ for (int x = 0; x < width() + SNAP_SIZE; x += SNAP_SIZE) {
-+ pbuf.drawLine(x - SNAP_SIZE / 2, 0, x - SNAP_SIZE / 2, height());
-+ for (int y = 0; y < height() + SNAP_SIZE; y += SNAP_SIZE) {
-+ pbuf.drawLine(0, y - SNAP_SIZE / 2, width(), y - SNAP_SIZE / 2);
-+ pbuf.drawRect(x-1,y-1,2,2);
-+ }
-+ }
-+ }
-+ if (_isShowGuide) {
-+ pbuf.setPen(QPen(cyan, 1, DashLine));
-+ if (AS_HORIZONTAL == _asMode || AS_BOTH == _asMode) {
-+ if (0 != _origin.x() || _isUseAllQuadrant) {
-+ pbuf.drawLine(width() / _margin, 0, width() / _margin, height());
-+ }
-+ pbuf.drawLine(width() * (_margin - 1) / _margin, 0, width() * (_margin - 1) / _margin, height());
-+ }
-+
-+ if (AS_VERTICAL == _asMode || AS_BOTH == _asMode) {
-+ if (0 != _origin.y() || _isUseAllQuadrant) {
-+ pbuf.drawLine(0, height() / _margin, width(), height() / _margin);
-+ }
-+ pbuf.drawLine(0, height() * (_margin - 1) / _margin, width(), height() * (_margin - 1) / _margin);
-+ }
-+ }
-+
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ if (r.intersects(p->boundingRect())) {
-+ p->drawShape(pbuf);
-+ }
-+ }
-+ } else {
-+ int w = _eraser_s;
-+ if (PENWIDTH_MAX / 2 < _pen.width()) {
-+ w = _eraser_l;
-+ }
-+ FNPointList removes;
-+ for (uint i = 0; i < _tracks.count(); ++i) {
-+ removes.append(_tracks.at(i));
-+ }
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ if (r.intersects(p->boundingRect())) {
-+ bool f = false;
-+ for (uint j = 0; j < _tracks.count(); ++j) {
-+ QPoint* pts = _tracks.at(j);
-+ QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w);
-+ for (uint k = 0; k < p->points().count(); ++k) {
-+ QPoint& pts2 = p->points().at(k);
-+ if (selected.contains(pts2)) {
-+ f = true;
-+ removes.remove(pts);
-+ break;
-+ }
-+ }
-+ if (f) {
-+ break;
-+ }
-+ }
-+ p->drawShape(pbuf, f);
-+ }
-+ }
-+ for (uint i = 0; i < removes.count(); ++i) {
-+ _tracks.remove(removes.at(i));
-+ }
-+ /*
-+ if (_isDragging) {
-+ pbuf.setPen(QPen(black, 1));
-+ pbuf.drawRect(_last.x() - w / 2, _last.y() - w / 2, w, w);
-+ }
-+ */
-+ }
-+ pbuf.end();
-+ repaint();
-+}
-+
-+void FNCanvas::changeColor(QRgb c)
-+{
-+ _pen.setColor(QColor(c));
-+}
-+
-+void FNCanvas::undo()
-+{
-+ if (MODE_ERASE != _drawMode) {
-+ ++_disp_offset;
-+ if (_disp_offset > _draws.count()) {
-+ _disp_offset = _draws.count();
-+ }
-+ } else {
-+ _draws = _undobuf;
-+ _marks.clear();
-+ }
-+ redraw();
-+}
-+
-+void FNCanvas::redo()
-+{
-+ if (MODE_ERASE != _drawMode) {
-+ if (0 < _disp_offset) {
-+ --_disp_offset;
-+ }
-+ }
-+ redraw();
-+}
-+
-+void FNCanvas::clearList(FNPolygonList& list)
-+{
-+ list.setAutoDelete(true);
-+ list.clear();
-+ list.setAutoDelete(false);
-+}
-+
-+void FNCanvas::clear()
-+{
-+ _disp_offset = 0;
-+ clearList(_draws);
-+ _undobuf.clear();
-+ setOrigin(0, 0);
-+ redraw();
-+}
-+
-+void FNCanvas::viewChanged(bool flg)
-+{
-+ _tracks.clear();
-+ _viewMode = flg;
-+ if (_viewMode) {
-+ if (_isUseAllQuadrant) {
-+ rebuild();
-+ }
-+ setOrigin(0, 0);
-+ }
-+ redraw();
-+}
-+
-+void FNCanvas::redobuf_flush()
-+{
-+ for (uint i = 0; i < _disp_offset; ++i) {
-+ FNPolygon* p = _draws.last();
-+ _draws.remove(p);
-+ delete p;
-+ }
-+ _disp_offset = 0;
-+}
-+
-+void FNCanvas::modeChanged(int mode)
-+{
-+ _tracks.clear();
-+ _drawMode = mode;
-+ redobuf_flush();
-+ if (MODE_ERASE == _drawMode) {
-+ _marks.clear();
-+ _undobuf = _draws;
-+ } else {
-+ if (_draws.count() != _undobuf.count()) {
-+ for (uint i = 0; i < _marks.count(); ++i) {
-+ FNPolygon* p = _marks.at(i);
-+ _draws.remove(p);
-+ }
-+ clearList(_marks);
-+ }
-+ }
-+ redraw();
-+}
-+
-+QRect FNCanvas::getMatrix(const QRect& r) const
-+{
-+ int ox = _origin.x();
-+ int oy = _origin.y();
-+ const int wide = 100;
-+
-+ int left = r.left() + ox;
-+ int top = r.top() + oy;
-+ int right = r.right() + ox;
-+ int bottom = r.bottom() + oy;
-+
-+ left = (int)(left / wide) * wide;
-+ top = (int)(top / wide) * wide;
-+ right = (right % wide == 0 && left != right) ? right : (int)((right + wide) / wide) * wide;
-+ bottom = (bottom % wide == 0 && top != bottom) ? bottom : (int)((bottom + wide) / wide) * wide;
-+
-+ return QRect(left - ox, top - oy, right - left, bottom - top);
-+}
-+
-+void FNCanvas::CR()
-+{
-+ if (MODE_ERASE == _drawMode) {
-+ return;
-+ }
-+ if (_isHeadingEnables) {
-+ //last\82©\82ç\81A\8d¶\95û\8cü\82É\8cü\82¯\82Ä\92T\8dõ\82·\82é\81B
-+ QRect r = getMatrix(_draws.last()->boundingRect());
-+ bool isSearching = true;
-+ r.moveBy(-100, 0);
-+ while (isSearching) {
-+ isSearching = false;
-+ for (uint i = 0; i < _draws.count(); ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ const QRect& r2 = p->boundingRect();
-+ if (r.intersects(r2)) {
-+ if (r.left() + 100 > r2.left()) {
-+ r = getMatrix(r2);
-+ r.moveBy(-100, 0);
-+ isSearching = true;
-+ break;
-+ }
-+ }
-+ }
-+ }
-+ r.moveBy(100, 0);
-+ //last\82ª\89æ\96Ê\82Ì4/5\88È\89º\82È\82ç\82Î\81A\83X\83N\83\8d\81[\83\8b\83A\83b\83v\82·\82é\81B
-+ //\82»\82¤\82Å\82È\82¯\82ê\82Î\81A\83w\83b\83f\83B\83\93\83O\82Ì\82Ý\81B
-+ if (_last.y() > height() * 4 / 5) {
-+ setOrigin(_origin.x() + r.x(), _origin.y() + 50);
-+ } else {
-+ setOrigin(_origin.x() + r.x(), _origin.y());
-+ }
-+ _isHeadingEnables = false;
-+ } else {
-+ //last\82Ì\8eü\88Í\82É\89½\82à\96³\82¢\8fê\8d\87\82Í\81A\8fc\82É\83X\83N\83\8d\81[\83\8b\82·\82é\81B
-+ setOrigin(_origin.x(), _origin.y() + 50);
-+ }
-+}
-+
-+void FNCanvas::erase()
-+{
-+ if (MODE_ERASE != _drawMode) {
-+ return;
-+ }
-+ FNPolygonList temp;
-+ int w = _eraser_s;
-+ if (PENWIDTH_MAX / 2 < _pen.width()) {
-+ w = _eraser_l;
-+ }
-+ QRect r = QRect(0, 0, width(), height());
-+ for (uint i = 0; i < _draws.count(); ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ bool f = false;
-+ if (r.intersects(p->boundingRect())) {
-+ for (uint j = 0; j < _tracks.count(); ++j) {
-+ QPoint* pts = _tracks.at(j);
-+ QRect selected(pts->x() - w / 2, pts->y() - w / 2, w, w);
-+ for (uint k = 0; k < p->points().count(); ++k) {
-+ QPoint& pts2 = p->points().at(k);
-+ if (selected.contains(pts2)) {
-+ temp.append(p);
-+ f = true;
-+ break;
-+ }
-+ }
-+ if (f) {
-+ break;
-+ }
-+ }
-+ }
-+ }
-+ for (uint i = 0; i < temp.count(); ++i) {
-+ _draws.remove(temp.at(i));
-+ _marks.append(temp.at(i));
-+ }
-+ _tracks.clear();
-+ redraw();
-+}
-+
-+void FNCanvas::setPensize(int sz)
-+{
-+ _pen.setWidth(sz);
-+}
-+
-+bool FNCanvas::exportPNG(const QFileInfo& info, QPixmap& buf)
-+{
-+ if (0 == info.fileName().length()) {
-+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-+ return false;
-+ }
-+ if (info.extension(false) != "png") {
-+ QMessageBox::warning(0,"FreeNoteQt", "extension '.png' expected.");
-+ return false;
-+ }
-+
-+ bool ret = buf.save(info.absFilePath(), "PNG");
-+ if (ret) {
-+ FNMessageBox::information(0,"FreeNoteQt", "export PNG complete.");
-+ } else {
-+ QMessageBox::warning(0,"FreeNoteQt", "could not export file.");
-+ }
-+ return ret;
-+}
-+
-+QString FNCanvas::mkPDFscript(FNPolygon* elm)
-+{
-+ QString s ="";
-+ char buf[1024];
-+
-+ float r = (float)elm->pen().color().red() / 255.0f;
-+ float g = (float)elm->pen().color().green() / 255.0f;
-+ float b = (float)elm->pen().color().blue() / 255.0f;
-+ s += "q\n";
-+ sprintf(buf, "%f %f %f RG\n", r, g, b);
-+ s += buf;
-+ QPointArray points = elm->points().copy();
-+ points.translate(_origin.x(), _origin.y());
-+ if (elm->type() == FN_BEZIER) {
-+ sprintf(buf, "%d %d m\n", points[0].x(), points[0].y());
-+ s += buf;
-+ for (uint j = 1; j < points.count(); j += 3) {
-+ sprintf(buf, "%d %d %d %d %d %d c\n",
-+ points[j].x(), points[j].y(),
-+ points[j + 1].x(), points[j + 1].y(),
-+ points[j + 2].x(), points[j + 2].y()
-+ );
-+ s += buf;
-+ }
-+ } else if (elm->type() == FN_ELLIPSE) {
-+ int x = points[0].x();
-+ int y = points[0].y();
-+ int ex = points[1].x();
-+ int ey = points[1].y();
-+ int w = ex - x;
-+ int h = ey - y;
-+ int cx = x + w/2;
-+ int cy = y;
-+ int x1 = x + 3*w/4;
-+ int y1 = y;
-+ int x2 = x + w;
-+ int y2 = y + h/4;
-+ int x3 = x + w;
-+ int y3 = y + h/2;
-+
-+ sprintf(buf, "%d %d m\n%d %d %d %d %d %d c\n", cx, cy, x1, y1, x2, y2, x3, y3);
-+ s += buf;
-+ x1 = x + w;
-+ y1 = y + 3 * h / 4;
-+ x2 = x + 3 * w / 4;
-+ y2 = y + h;
-+ x3 = x + w/2;
-+ y3 = y + h;
-+ sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3);
-+ s += buf;
-+
-+ x1 = x + w / 4;
-+ y1 = y + h;
-+ x2 = x;
-+ y2 = y + 3 * h / 4;
-+ x3 = x;
-+ y3 = y + h / 2;
-+ sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3);
-+ s += buf;
-+ x1 = x;
-+ y1 = y + h / 4;
-+ x2 = x + w / 4;
-+ y2 = y;
-+ x3 = x + w / 2;
-+ y3 = y;
-+ sprintf(buf, "%d %d %d %d %d %d c\n", x1, y1, x2, y2, x3, y3);
-+ s += buf;
-+ } else {
-+ sprintf(buf, "%d %d m\n", points[0].x(), points[0].y());
-+ s += buf;
-+ for (uint j = 1; j < points.count(); ++j) {
-+ sprintf(buf, "%d %d l\n", points[j].x(), points[j].y());
-+ s += buf;
-+ }
-+ }
-+ sprintf(buf, "%d w\n", elm->pen().width());
-+ s += buf;
-+ s += "S\n";
-+ s += "Q\n";
-+ return s;
-+}
-+
-+bool FNCanvas::exportPDF(const QFileInfo& info)
-+{
-+ if (0 == info.fileName().length()) {
-+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-+ return false;
-+ }
-+ if (info.extension(false) != "pdf") {
-+ QMessageBox::warning(0,"FreeNoteQt", "extension '.pdf' expected.");
-+ return false;
-+ }
-+
-+ FILE* fp = NULL;
-+ if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) {
-+ QMessageBox::warning(0,"FreeNoteQt", "could not export file.");
-+ return false;
-+ }
-+
-+ QPoint o = getTopLeft();
-+ rebuild();
-+ int wx = 595;
-+ int wy = 842;
-+ char buf[1024];
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon* p = _draws.at(i);
-+ QRect r = p->boundingRect();
-+ r.moveBy(_origin.x(), _origin.y());
-+ if (wx < r.right()) {
-+ wx =r.right();
-+ }
-+ if (wy < r.bottom()) {
-+ wy = r.bottom();
-+ }
-+ }
-+
-+ int len = 0;
-+
-+ sprintf(buf, "1 0 0 -1 0 %d cm\n", wy);
-+ QString cm = buf;
-+ len += cm.length();
-+
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ QString s = mkPDFscript(_draws.at(i));
-+ len += s.length();
-+ }
-+
-+ QString header = "";
-+ header += "%PDF-1.3\n";
-+ header += "1 0 obj\n";
-+ header += "<<\n";
-+ header += "/Type /Page\n";
-+ header += "/Parent 3 0 R\n";
-+ header += "/Resources\n";
-+ header += "<<\n";
-+ header += "/ProcSet [ /PDF ]\n";
-+ header += ">>\n";
-+ sprintf(buf, "/MediaBox [ 0 0 %010d %010d ]\n", wx, wy);
-+ header += buf;
-+ header += "/Contents 4 0 R\n";
-+ header += ">>\n";
-+ header += "endobj\n";
-+ header += "2 0 obj\n";
-+ header += "<<\n";
-+ header += "/Type /Catalog\n";
-+ header += "/Pages 3 0 R\n";
-+ header += "/PageLayout /OneColumn\n";
-+ header += "/OpenAction [1 0 R /XYZ null null 1 ]\n";
-+ header += ">>\n";
-+ header += "endobj\n";
-+ header += "3 0 obj\n";
-+ header += "<<\n";
-+ header += "/Type /Pages\n";
-+ header += "/Kids [ 1 0 R ]\n";
-+ header += "/Count 1\n";
-+ header += ">>\n";
-+ header += "endobj\n";
-+ header += "4 0 obj\n";
-+ sprintf(buf, "<< /Length %010d >>\n", len);
-+ header += buf;
-+ header += "stream\n";
-+
-+ QString footer = "";
-+ footer += "xref\n";
-+ footer += "0 5\n";
-+ footer += "0000000000 65535 f \n";
-+ footer += "0000000009 00000 n \n";
-+ footer += "0000000147 00000 n \n";
-+ footer += "0000000257 00000 n \n";
-+ footer += "0000000316 00000 n \n";
-+ footer += "trailer\n";
-+ footer += "<<\n";
-+ footer += "/Size 5\n";
-+ footer += "/Root 2 0 R\n";
-+ footer += ">>\n";
-+ footer += "startxref\n";
-+
-+ len = cm.length();
-+ len += header.length();
-+ fputs(header, fp);
-+ fputs(cm, fp);
-+
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ QString s = mkPDFscript(_draws.at(i));
-+ len += s.length();
-+ fputs(s, fp);
-+ }
-+ QString streamfooter = "endstream\nendobj\n";
-+ len += streamfooter.length();
-+ fputs(streamfooter, fp);
-+
-+ fputs(footer, fp);
-+ sprintf(buf, "%d\n", len);
-+ fputs(buf, fp);
-+ fputs("%%EOF\n", fp);
-+ fclose(fp);
-+ if (_isUseAllQuadrant) {
-+ setOrigin(-o.x(), -o.y());
-+ }
-+ FNMessageBox::information(0,"FreeNoteQt", "export PDF complete.");
-+ return true;
-+}
-+
-+bool FNCanvas::save(const QFileInfo& info)
-+{
-+ if (0 == info.fileName().length()) {
-+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-+ return false;
-+ }
-+ if (info.extension(false) != "free") {
-+ QMessageBox::warning(0,"FreeNoteQt", "extension '.free' expected.");
-+ return false;
-+ }
-+ FILE* fp = NULL;
-+ if (!(fp = fopen(info.absFilePath().utf8(), "wt"))) {
-+ QMessageBox::warning(0,"FreeNoteQt", "could not save file.");
-+ return false;
-+ }
-+ QPoint o = getTopLeft();
-+ rebuild();
-+ fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", fp);
-+ fputs("<freenote version=\"2.0\">\n", fp);
-+ char buf[1024];
-+ for (uint i = 0; i < _draws.count() - _disp_offset; ++i) {
-+ FNPolygon p(*_draws.at(i));
-+ p.translate(_origin.x(), _origin.y());
-+ if (p.type() == FN_BEZIER) {
-+ sprintf(buf, "\t<bz color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());
-+ } else if (p.type() == FN_ELLIPSE) {
-+ sprintf(buf, "\t<el color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());
-+ } else {
-+ sprintf(buf, "\t<po color=\"%x\" width=\"%d\">\n", (uint)p.pen().color().rgb(), p.pen().width());
-+ }
-+ fputs(buf, fp);
-+ QPointArray& points = p.points();
-+ for (uint j = 0; j < points.count(); ++j) {
-+ QPoint point = points.point(j);
-+ sprintf(buf, "\t\t<p x=\"%d\" y=\"%d\"/>\n", point.x(), point.y());
-+ fputs(buf, fp);
-+ }
-+ if (p.type() == FN_BEZIER) {
-+ fputs("\t</bz>\n", fp);
-+ } else if (p.type() == FN_ELLIPSE) {
-+ fputs("\t</el>\n", fp);
-+ } else {
-+ fputs("\t</po>\n", fp);
-+ }
-+ }
-+ fputs("</freenote>\n", fp);
-+ fclose(fp);
-+ if (_isUseAllQuadrant) {
-+ setOrigin(-o.x(), -o.y());
-+ }
-+ FNMessageBox::information(0, "FreeNoteQt", "save complete.");
-+ return true;
-+}
-+
-+bool FNCanvas::load(const QFileInfo& info)
-+{
-+ if (0 == info.fileName().length()) {
-+ QMessageBox::warning(0,"FreeNoteQt", "file name is empty.");
-+ return false;
-+ }
-+ if (!info.exists()) {
-+ QMessageBox::warning(0,"FreeNoteQt", "file not exists.");
-+ return false;
-+ }
-+ FILE* fp = NULL;
-+ if (!(fp = fopen(info.absFilePath().utf8(), "rt"))) {
-+ QMessageBox::warning(0,"FreeNoteQt", "could not open file.");
-+ return false;
-+ }
-+ clear();
-+
-+ QString line;
-+ FNPointList points;
-+ points.setAutoDelete(true);
-+ int c;
-+ int w;
-+ QPen pen(Qt::black, 1);
-+ FNPolygon* polygon;
-+
-+ char rdbuf[1024];
-+ char buf[1024];
-+ QString type = "";
-+ while (!feof(fp)) {
-+ fgets(rdbuf, sizeof(rdbuf), fp);
-+ line = rdbuf;
-+ if (-1 != line.find("<fnpolygon ") ||
-+ -1 != line.find("<po ") ||
-+ -1 != line.find("<bz ") ||
-+ -1 != line.find("<el ")
-+ ) {
-+ if (-1 != line.find("<el ")) {
-+ type = "Ellipse";
-+ } else if (-1 != line.find("<bz ")) {
-+ type = "Bezier";
-+ } else {
-+ type = "Polygon";
-+ }
-+ points.clear();
-+ int st = line.find("color") + 7;
-+ int ed = line.find("\"", st);
-+ strcpy(buf, line.mid(st, ed - st).utf8());
-+ sscanf(buf, "%x", &c);
-+ st = line.find("width") + 7;
-+ ed = line.find("\"", st);
-+ strcpy(buf, line.mid(st, ed - st).utf8());
-+ sscanf(buf, "%d", &w);
-+ } else if (-1 != line.find("<point ") ||
-+ -1 != line.find("<p ")
-+ ) {
-+ int st = line.find("x=") + 3;
-+ int ed = line.find("\"", st);
-+ strcpy(buf, line.mid(st, ed - st).utf8());
-+ int x;
-+ sscanf(buf, "%d", &x);
-+
-+ st = line.find("y=") + 3;
-+ ed = line.find("\"", st);
-+ strcpy(buf, line.mid(st, ed - st).utf8());
-+ int y;
-+ sscanf(buf, "%d", &y);
-+ points.append(createPts(x, y)); //\83o\83O\91Î\8dô
-+ } else if (-1 != line.find("</fnpolygon") ||
-+ -1 != line.find("</bz") ||
-+ -1 != line.find("</el") ||
-+ -1 != line.find("</po")) {
-+ pen.setColor((QRgb)c);
-+ pen.setWidth(w);
-+ if (type == "Bezier") {
-+ _draws.append(polygon = createBezier(pen)); //\83o\83O\91Î\8dô
-+ } else if (type == "Ellipse") {
-+ _draws.append(polygon = createEllipse(pen)); //\83o\83O\91Î\8dô
-+ } else {
-+ _draws.append(polygon = createPolygon(pen)); //\83o\83O\91Î\8dô
-+ }
-+ polygon->setPoints(points);
-+ points.clear();
-+ }
-+ }
-+ fclose(fp);
-+ int x = 0;
-+ int y = 0;
-+ for (uint i = 0; i < _draws.count(); ++i) {
-+ if (y > _draws.at(i)->boundingRect().top()) {
-+ y = _draws.at(i)->boundingRect().top();
-+ }
-+ if (x > _draws.at(i)->boundingRect().left()) {
-+ x = _draws.at(i)->boundingRect().left();
-+ }
-+ }
-+ for (uint i = 0; i < _draws.count(); ++i) {
-+ _draws.at(i)->translate(-x, -y);
-+ }
-+ redraw();
-+ FNMessageBox::information(0,"FreeNoteQt", "load complete.");
-+
-+ return true;
-+}
-+
-+FNPolygon* FNCanvas::createPolygon(QPen& pen)
-+{
-+ return new FNPolygon(pen);
-+}
-+
-+FNPolygon* FNCanvas::createBezier(QPen& pen)
-+{
-+ return new FNBezier(pen);
-+}
-+
-+
-+FNPolygon* FNCanvas::createEllipse(QPen& pen)
-+{
-+ return new FNEllipse(pen);
-+}
-+
-+QPoint* FNCanvas::createPts(int x, int y)
-+{
-+ return new QPoint(x, y);
-+}
-+
-+void FNCanvas::setGuide(bool f)
-+{
-+ _isShowGuide = f;
-+ redraw();
-+}
+++ /dev/null
-DESCRIPTION="Auto-Correction Paint Program for Opie/Qtopia"
-SECTION="base"
-PRIORITY="optional"
-LICENSE="GPL"
-
-SRC_URI = http://www.urban.ne.jp/home/kanemori/zaurus/FreeNote_${PV}_arm.tar.gz \
- file://${FILESDIR}/compile.patch;patch=1
-S = ${WORKDIR}/FreeNote_${PV}_arm
-
-inherit palmtop
-
-do_configure_prepend() {
- qmake -project -o ${PN}.pro
-}
-
-do_install() {
- install -d ${D}${palmtopdir}/{bin,apps/Applications,pics}
- install -D -m 755 freenoteeintu ${D}${palmtopdir}/bin/freenoteeintu
- install -D -m 644 ${FILESDIR}/freenoteeintu.desktop ${D}${palmtopdir}/apps/Applications/freenoteeintu.desktop
- install -d ${D}/${palmtopdir}/pics
- cp -pPR *.png ${D}${palmtopdir}/pics/
-}