add freenote, an error correcting paint program for Opie. patch based on work by...
authorMichael Lauer <mickey@vanille-media.de>
Sun, 21 May 2006 15:33:23 +0000 (15:33 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Sun, 21 May 2006 15:33:23 +0000 (15:33 +0000)
#1018

23 files changed:
packages/freenote/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/FNCanvas.cpp [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/FNFindDialog.cpp [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/FNMessageBox.cpp [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/FNTextDialog.cpp [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/FmtEngine.cpp [new file with mode: 0644]
packages/freenote/files/FreeNote/FreeNote/FrmMain.cpp [new file with mode: 0644]
packages/freenote/files/FreeNote/apps/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/apps/Applications/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/apps/Applications/FreeNote.desktop [new file with mode: 0644]
packages/freenote/files/FreeNote/apps/Settings/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/apps/Settings/FreeNoteSetup.desktop [new file with mode: 0644]
packages/freenote/files/FreeNote/pics/.mtn2git_empty [new file with mode: 0644]
packages/freenote/files/FreeNote/pics/fnsetup.png [new file with mode: 0644]
packages/freenote/files/FreeNote/pics/freenote.png [new file with mode: 0644]
packages/freenote/freenote_1.12.0.bb [new file with mode: 0644]
packages/nonworking/freenote/.mtn2git_empty [deleted file]
packages/nonworking/freenote/freenote-1.6.1/.mtn2git_empty [deleted file]
packages/nonworking/freenote/freenote-1.6.1/compile.patch [deleted file]
packages/nonworking/freenote/freenote_1.6.1.bb [deleted file]

diff --git a/packages/freenote/.mtn2git_empty b/packages/freenote/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/.mtn2git_empty b/packages/freenote/files/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/.mtn2git_empty b/packages/freenote/files/FreeNote/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/FreeNote/.mtn2git_empty b/packages/freenote/files/FreeNote/FreeNote/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/FreeNote/FNCanvas.cpp b/packages/freenote/files/FreeNote/FreeNote/FNCanvas.cpp
new file mode 100644 (file)
index 0000000..6e7f615
--- /dev/null
@@ -0,0 +1,2244 @@
+/*  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
diff --git a/packages/freenote/files/FreeNote/FreeNote/FNFindDialog.cpp b/packages/freenote/files/FreeNote/FreeNote/FNFindDialog.cpp
new file mode 100644 (file)
index 0000000..9d0998a
--- /dev/null
@@ -0,0 +1,143 @@
+/*  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()
+{
+}
diff --git a/packages/freenote/files/FreeNote/FreeNote/FNMessageBox.cpp b/packages/freenote/files/FreeNote/FreeNote/FNMessageBox.cpp
new file mode 100644 (file)
index 0000000..1518651
--- /dev/null
@@ -0,0 +1,243 @@
+/*  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
diff --git a/packages/freenote/files/FreeNote/FreeNote/FNTextDialog.cpp b/packages/freenote/files/FreeNote/FreeNote/FNTextDialog.cpp
new file mode 100644 (file)
index 0000000..b4eea54
--- /dev/null
@@ -0,0 +1,93 @@
+/*  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;
+}
diff --git a/packages/freenote/files/FreeNote/FreeNote/FmtEngine.cpp b/packages/freenote/files/FreeNote/FreeNote/FmtEngine.cpp
new file mode 100644 (file)
index 0000000..dae8a81
--- /dev/null
@@ -0,0 +1,512 @@
+/*  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
diff --git a/packages/freenote/files/FreeNote/FreeNote/FrmMain.cpp b/packages/freenote/files/FreeNote/FreeNote/FrmMain.cpp
new file mode 100644 (file)
index 0000000..1cb4407
--- /dev/null
@@ -0,0 +1,1442 @@
+/*  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);
+}
diff --git a/packages/freenote/files/FreeNote/apps/.mtn2git_empty b/packages/freenote/files/FreeNote/apps/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/apps/Applications/.mtn2git_empty b/packages/freenote/files/FreeNote/apps/Applications/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/apps/Applications/FreeNote.desktop b/packages/freenote/files/FreeNote/apps/Applications/FreeNote.desktop
new file mode 100644 (file)
index 0000000..46e24cd
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Comment=
+Exec=FreeNote
+Icon=freenote
+Type=Application
+Name=FreeNoteQt
+Display=640x480/144dpi,480x640/144dpi
+MimeType=application/freenote
+MimeTypeIcons=freenote
+CanFastload=1
diff --git a/packages/freenote/files/FreeNote/apps/Settings/.mtn2git_empty b/packages/freenote/files/FreeNote/apps/Settings/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/apps/Settings/FreeNoteSetup.desktop b/packages/freenote/files/FreeNote/apps/Settings/FreeNoteSetup.desktop
new file mode 100644 (file)
index 0000000..e621c90
--- /dev/null
@@ -0,0 +1,9 @@
+[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
diff --git a/packages/freenote/files/FreeNote/pics/.mtn2git_empty b/packages/freenote/files/FreeNote/pics/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/freenote/files/FreeNote/pics/fnsetup.png b/packages/freenote/files/FreeNote/pics/fnsetup.png
new file mode 100644 (file)
index 0000000..39028e3
Binary files /dev/null and b/packages/freenote/files/FreeNote/pics/fnsetup.png differ
diff --git a/packages/freenote/files/FreeNote/pics/freenote.png b/packages/freenote/files/FreeNote/pics/freenote.png
new file mode 100644 (file)
index 0000000..ebde776
Binary files /dev/null and b/packages/freenote/files/FreeNote/pics/freenote.png differ
diff --git a/packages/freenote/freenote_1.12.0.bb b/packages/freenote/freenote_1.12.0.bb
new file mode 100644 (file)
index 0000000..72610c3
--- /dev/null
@@ -0,0 +1,33 @@
+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
+}
diff --git a/packages/nonworking/freenote/.mtn2git_empty b/packages/nonworking/freenote/.mtn2git_empty
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/packages/nonworking/freenote/freenote-1.6.1/.mtn2git_empty b/packages/nonworking/freenote/freenote-1.6.1/.mtn2git_empty
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/packages/nonworking/freenote/freenote-1.6.1/compile.patch b/packages/nonworking/freenote/freenote-1.6.1/compile.patch
deleted file mode 100644 (file)
index de3e93a..0000000
+++ /dev/null
@@ -1,3285 +0,0 @@
-
-#
-# 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();
-+}
diff --git a/packages/nonworking/freenote/freenote_1.6.1.bb b/packages/nonworking/freenote/freenote_1.6.1.bb
deleted file mode 100644 (file)
index 3e4540a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-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/
-}