Draw beautiful diagram effortlessly on ipad. Click here to know more..

Sunday, April 1, 2012

How to implement UndoManager (with example in Java on Android)

Undo-redo is a must-to-have feature in editing programs. This blog post describes how to implement undo-redo in your program. The example taken here is in Java but the concept is very simple and can be implemented easily in any language. 
Here is idea to implement the undo-redo. First of all you need these: UndoManager - a class that implements undo-redo features. UserAction - an abstract base class for all user actions.
The operations in the UndoManager are: undo, redo, canUndo, canRedo, addAction And the operations in UserAction are: perform, undo
As said above, the UserAction abstracts user actions which user can undo. For example in text editing program, inserting a character at a particular cursor location is an action which user can undo. So you need to implement this abstract class for all type of user's undo-able actions. 
Lets start with some real code. The code here is taken from an Android app "Scratchpad" 
This is a simple drawing program using touch. User can draw on the screen using touch dragging on Android tablet screen. So the user action,in this case, is draw a stroke on canvas. A stroke is defined as the drawing done between users actions of starting touch drag and stopping touch drag. Here is UndoManager class:
import java.util.*;
public class UndoManager {
 private UndoManager(){
  undoActions = new Stack();
  redoActions = new Stack();
 }
 public boolean canUndo(){
  return undoActions.size() > 0;
 }
 public boolean canRedo(){
  return redoActions.size() > 0;
 }
 public void undo(){
  if(canUndo()){
   UserAction act = this.undoActions.pop();
   act.undo();
   redoActions.push(act);
  }
 }
 public void redo(){
  if(canRedo()){
   UserAction act = this.redoActions.pop();
   act.perform();
   undoActions.add(act);
  }
 }
 public void add(UserAction action){
  this.undoActions.push(action);
  this.redoActions.clear();
 }
 private Stack undoActions;
 private Stack redoActions;
}

The code for UserAction
public abstract class UserAction {
 public abstract void perform();
 public abstract void undo();
}
Here is code for StrokeAction
public class StrokeAction extends UserAction{
 public StrokeAction(DrawingStroke ds){
  this.stroke = ds;
 }
 @Override
 public void perform(){
  ObjectStore.instance.addObject(stroke);
 }
 @Override
 public void undo(){
  ObjectStore.instance.removeObject(stroke);
 }
 private DrawingStroke stroke;
}

Whenever the user completes a drawing stroke in Scratchpad, an object of DrawingAction is created. The ObjectManager in the code above contains the all stroke objects. Whenever user performs a drawing, we add the stroke to object manager. The drawing of all available objects are managed ObjectManager. And when user wants to undo, we simply remove the stroke from object manager. For simplicity and readability, I am not adding the code of ObjectManager here. 

The code of UndoManager and UserAction is very generic and can be used any application. UserActions has to be implemented for for each undo-able user action type. This implementation will be application dependent.

208 comments:


  1. Hi, This is Jamuna from Chennai. I have read your blog and I got some knowledgeable information through this blog. Really useful blog. Keep update your blog.

    Regards...
    Java Training Chennai

    ReplyDelete
  2. Thank You for sharing your article. I like it. It is great information about Java. We provides TIBCO Online Training in Hyderabad.

    ReplyDelete
  3. I have completely read your post and the content is crisp and clear.Thank you for posting such an informative article, I have decided to follow your blog so that I can myself updated.
    Java Training in Chennai

    ReplyDelete
  4. I completely read your blog.It is very useful to me .I have imporve my coading knowledge. Thanks for sharing. Keep sharing more blogs.


    Software Testing Training in chennai

    ReplyDelete
  5. I found your blog while searching for the updates in Selenium WebDriver,I am happy to be here. Very useful content and also easily understandable providing.. Believe me I did wrote an post about selenium tutorials for beginners with reference of your blog.

    ReplyDelete
  6. I used to write critical essays about these platforms using useful info about writing critical analysis essays and I must say that I was surprised that these system have such high security level.

    ReplyDelete
  7. Thanks for sharing wonderful information which helps all audience

    devOps Training | devOps supports

    ReplyDelete
  8. Extraordinary occupation for distributed such a gainful site. Your web log isn't just helpful however it is furthermore truly innovative as well. There have a tendency to be relatively few individuals who can surely compose not all that straightforward posts that imaginatively. Proceed with the decent written work Tax Enquiry Accounts

    ReplyDelete
  9. Much obliged to you again for all the information you distribute,Good post. I was exceptionally keen on the article, it's entirely rousing I ought to concede. I like going to you site since I generally run over fascinating articles like this one.Great Job, I incredibly acknowledge that.Do Keep sharing! Respects, HMRC Tax Investigation Accountants

    ReplyDelete
  10. I"ve been surfing online over three hours today, yet I never discovered any fascinating article like yours. It"s really sufficiently worth for me. As I would like to think, if all website admins and bloggers made great substance as you did, the web will be significantly more valuable than any other time in recent memory. Tax Enquiry

    ReplyDelete
  11. On the off chance that more individuals that compose articles truly fretted about composing incredible substance like you, more perusers would be occupied with their works. Much obliged to you for thinking about your substance. Let Campaign Tax Enquiry

    ReplyDelete
  12. i do a lot of article submissions in a week or two and i hire some writers from india and other countries to do my stuf,. Tax Investigation Self Employed

    ReplyDelete
  13. Extraordinary occupation for distributed such a gainful site. Your web log isn't just helpful however it is furthermore truly innovative as well. There have a tendency to be relatively few individuals who can surely compose not all that straightforward posts that imaginatively. Proceed with the decent written work Let Campaign Tax Enquiry Accountants

    ReplyDelete
  14. Hey! A debt of gratitude is in order for the colossal data you havr gave! You have touched on crucuial focuses! Let Property Campaign

    ReplyDelete
  15. I am upbeat to discover this post exceptionally helpful for me, as it contains part of data. I generally want to peruse the quality substance and this thing I found in you post. A debt of gratitude is in order for sharing. Let Property Campaign Accountants

    ReplyDelete
  16. Thanks for sharing this post.Keep sharing more like this.

    dgreatwallofchina
    Education

    ReplyDelete
  17. Thanks for the information, Get the best Java Training in Chennai from hope tutors.

    ReplyDelete
  18. Amazing information,thank you for your ideas.after along time i have studied
    an interesting information's.we need more updates in your blog.
    Selenium Training in Amjikarai
    Selenium Training Institutes in Vadapalani
    Selenium training near me
    Selenium Training in Chennai

    ReplyDelete
  19. This is the kind of data I've long been attempting to discover. Much obliged to you for composing this data. Buy to Let Property Tax Advisors

    ReplyDelete
  20. I am happy you take pride in what you compose. This makes you stand way out from numerous different authors that push ineffectively composed substance. high DA backlinks

    ReplyDelete
  21. Thanks for sharing this unique information with us. Your post is really awesome. Your blog is really helpful for me..
    organic oil
    organic oil in jaipur
    organic cold pressed oils
    ayurvedic oil store in jaipur

    ReplyDelete
  22. Is it alright to post some portion of this on my site essentially present a hyperlink on this page? high DA backlinks

    ReplyDelete
  23. Incredible post I might want to thank you for the endeavors you have made in composing this fascinating and learned article. Buy to Let Tax Advisor

    ReplyDelete
  24. plz any one can help with the code how to add undo redo function using bitmap

    ReplyDelete
  25. Much obliged to you for some other educational web journal. Where else would I be able to understand that sort of data written in such a perfect means? I have a mission that I'm a little while ago chipping away at, and I have been at the post for such data. Buy to Let Property Tax Advice London

    ReplyDelete
  26. Your site is truly cool and this is an awesome rousing article. Much obliged to you to such an extent. Property Tax Accountant

    ReplyDelete
  27. This is really the sort of data I have been attempting to discover. Much thanks to you for composing this data. Property Tax Advice

    ReplyDelete
  28. A debt of gratitude is in order For sharing this Superb article.I utilize this Article to demonstrate my task in college.it is helpful For me Great Work. Property Tax Advisors

    ReplyDelete
  29. I cherish the way you compose and share your corner! Exceptionally intriguing and distinctive! Keep it coming! Tax on Buy to Let Property

    ReplyDelete
  30. I adore this online journal!! The glimmer up the top is wonderful!! Tax Investigation Accountants

    ReplyDelete
  31. Fantastic article. Exceptionally fascinating to peruse. I truly love to peruse such a decent article. Much obliged! continue shaking. Tax Investigation Advisors

    ReplyDelete
  32. I am glad to discover this post Very valuable for me, as it contains part of data. I Always like to peruse The Quality and happy I discovered this thing in you post. Much appreciated Tax Investigation Self Assessment

    ReplyDelete
  33. Goodness, cool post. I"d like to compose like this as well – requiring significant investment and genuine diligent work to make an incredible article… yet I put things off an excessive amount of and never appear to begin. Much obliged however. Tax Investigation Specialists

    ReplyDelete
  34. A debt of gratitude is in order for your post. I've been contemplating composing an exceptionally equivalent post in the course of the last couple of weeks, I'll most likely keep it quick and painless and connection to this rather if thats cool. Much obliged. www.smartphones-pliable.fr

    ReplyDelete
  35. Incredible learning, do anybody mind only reference back to it Tax Investigation Accountants

    ReplyDelete
  36. i read a great deal of stuff and i found that the method for composing to clearifing that precisely need to say was great so i am awed and ilike to come back again in future.. Tax Investigation Advisors

    ReplyDelete
  37. Much obliged to you again for all the information you distribute,Good post. I was exceptionally keen on the article, it's very motivating I ought to concede. I like going to you site since I generally go over intriguing articles like this one.Great Job, I incredibly acknowledge that.Do Keep sharing! Respects, Tax Investigation Specialists

    ReplyDelete
  38. If you don't mind proceed with this extraordinary work and I anticipate a greater amount of your marvelous blog entries. Tax Investigation Self Assessment

    ReplyDelete
  39. I'm happy to see the considerable point of interest here!. Tax Investigation Self Employed

    ReplyDelete
  40. Your site is truly cool and this is an awesome motivating article. Much obliged to you to such an extent. Revenue Tax Investigation

    ReplyDelete
  41. This was a truly awesome challenge and ideally I can go to the following one. It was alot of fun and I truly had a ball.. Tax Investigation Accountants

    ReplyDelete
  42. The Project Management Institute (PMI)is a nonprofit membership association and certification body, best known for its Project Management Professional (PMP) credential and the Project Management Body of Knowledge (PMBOK), a collection of best practices and standards for project management.
    Good job and thanks for sharing such a good blog You’re doing a great job. Keep it up !!

    PMP Certification Fees | Best PMP training in chennai |
    pmp certification cost in chennai | PMP Certification Training Institutes in Velachery |
    pmp certification courses and books | pmp certification requirements |
    pmp training centers in chennai | pmp certification requirements

    ReplyDelete
  43. I am unquestionably making the most of your site. You unquestionably have some extraordinary knowledge and awesome stories. Tax Investigation Self Assessment

    ReplyDelete
  44. A debt of gratitude is in order for the post and awesome tips..even I additionally imagine that diligent work is the most imperative part of getting achievement.. Profile backlinks

    ReplyDelete
  45. I respect this article for the all around scrutinized substance and phenomenal wording. I got so included in this material that I couldn"t quit perusing. I am inspired with your work and ability. Much obliged to you to such an extent. Tax Investigation Specialists

    ReplyDelete
  46. Positive site, where did u think of the data on this posting? I'm satisfied I found it however, sick be inquiring soon to figure out what extra posts you incorporate. atlanta luxury chauffeur service

    ReplyDelete
  47. Much obliged to you for setting aside an ideal opportunity to distribute this data extremely valuable! Tax Investigation Accountants

    ReplyDelete
  48. Incredible Article it its truly useful and imaginative update us as often as possible with new upgrades. its was truly profitable. much appreciated. Tax Investigation Advisors

    ReplyDelete
  49. Kindly fill me in as to whether you're searching for an article essayist for your site. You have some truly extraordinary posts and I feel I would be a decent resource. On the off chance that you ever need to take a percentage of the heap off, I'd totally love to compose some material for your web journal in return for a connection back to mine. It would be ideal if you send me an email if intrigued. Much obliged to you! Tax Investigation Self Assessment

    ReplyDelete
  50. Extremely fascinating online journal. Alot of online journals I see nowadays don't generally give anything that I'm keen on, however I'm most definately intrigued by this one. Recently felt that I would post and let you know. Tax Investigation Specialists
    Extremely fascinating online journal. Alot of online journals I see nowadays don't generally give anything that I'm keen on, however I'm most definately intrigued by this one. Recently felt that I would post and let you know. Tax Investigation Specialists

    ReplyDelete
  51. البعوض عبارة عن أجنحة للحشرات ، صغيرة الحجم ، وتسبب العديد من الأمراض مثل الملاريا والسالمونيلا وغيرها من الأمراض الخطيرة التي قد تؤدي إلى الوفاة ، وليس فقط تغذية البعوض على دم الإنسان قد يتغذى على دم الحيوانات والطيور. افضل شركة مكافحة حشرات
    شركة مكافحة النمل الابيض بالجبيل
    شركة مكافحة حشرات بالجبيل
    شركة رش مبيدات بالجبيل

    ReplyDelete
  52. פוסט נחמד. חייב לשתף עם העוקבים שלי.
    קבוצת גבאי נדלן

    ReplyDelete
  53. This comment has been removed by the author.

    ReplyDelete
  54. רציתי רק לשאול, אפשר לשתף את הפוסט בבלוג שלי?
    תכשיטי אפולו

    ReplyDelete
  55. כתיבה מעולה, אהבתי. אשתף עם העוקבים שלי.
    רהיטים לסלון

    ReplyDelete
  56. סגנון כתיבה מרענן, תודה על השיתוף.
    פינות אוכל נפתחות

    ReplyDelete
  57. הדעות שלי קצת חלוקות בעניין הזה אבל ללא ספק כתבת מעניין מאוד.
    עיניים שקועות

    ReplyDelete
  58. מעולה. תודה על הכתיבה היצירתית.
    בייביזמול

    ReplyDelete
  59. אין ספק שהפוסט הזה דורש שיתוף. תודה.
    השקעה בנדלן בחול

    ReplyDelete
  60. Good writeup, I am normal visitor of ones blog, maintain up the excellent operate, and It's going to be a regular visitor for a lengthy time.123Movies

    ReplyDelete
  61. "I am actually glad to glance at this website posts which carries lots of helpful data,
    thanks for providing these data.
    SolarMovies
    "

    ReplyDelete
  62. Nice blog, it's so knowledgeable, informative, and good-looking site. myassignmenthelpau is a great platform that has been performing astonishingly well.FMovies

    ReplyDelete
  63. Excellent information Providing by your Article. Thanks
    gemcreature

    ReplyDelete
  64. Your blog is very good to see & thanks for sharing &keep sharing
    devops training in Hyderabad

    ReplyDelete
  65. הדעות שלי קצת חלוקות בעניין הזה אבל ללא ספק כתבת מעניין מאוד.
    פרסום דיגיטלי לעסקים

    ReplyDelete
  66. סופסוף מישהו שתואם לדעותיי בנושא. תודה.
    חברת פיתוח תוכנה

    ReplyDelete
  67. Well I really liked reading it. This tip procured by you is very helpful for accurate planning.Well I really liked reading it. This tip procured by you is very helpful for accurate planning. lgbt là gì

    ReplyDelete
  68. "KUBET - Nhà cái cá cược bóng đá, lô đề, xóc đĩa uy tín nhất năm 2020 - Đăng ký KU BET - KUCASINO - KU CASINO nhận ngay 128K tại KUBET.IO.
    #ku, #kubet, #kucasino, #ku777, #ku888, #ku999, #casino, #kubetio, #keonhacai, #xoso, #lode, #xocdia, #nhacai.
    Social KUBET: https://kubet-ku-casino.webflow.io/
    https://infogram.com/dang-ky-kubet-cach-tao-lap-tai-khoan-ku-bet-don-gian-1h8j4xglr0od6mv<
    https://www.youtube.com/channel/UCyPQbqZIZKV60Q7njSmKe3A
    http://trello.com/kubet"

    ReplyDelete
  69. 188BET - Link vào 188BET mới nhất không bị chặn bởi nhà mạng 2020 tại 188BET.IO. Đăng ký 188BET ngay hôm nay để nhận ngay quà tặng cực khủng. #188bet, #188betio, #bet188, #casino . https://trello.com/188betio/t

    ReplyDelete
  70. I really enjoy reading and also appreciate your work.Keto pills

    ReplyDelete
  71. great inspiring article.pretty much pleased with your good work.very helpful information...
    prescription discount card cvs

    ReplyDelete
  72. Thank you for your post.this post give me lots of advise it is very useful for me.
    Hair salon Brooklyn

    ReplyDelete
  73. I will be interested in more similar topics. i i will be always checking your blog thanks
    wireless backup cameras for cars

    ReplyDelete
  74. הייתי חייבת לפרגן, תודה על השיתוף.
    הדפסת תמונות על קנבס

    ReplyDelete
  75. 123movies. r Completely doesn't have any ads or increase-ons that are damaging to buyers. So you're able to c

    ReplyDelete
  76. """TOPSoiCau - Chuyên trang SOI CẦU MB, MT, MN VIP 24h tốt nhất Việt Nam 247 cho anh em tham khảo, lấy số đẹp. Dự đoán kết quả xổ số 3 miền Bắc, Trung, Nam nhanh nhất hàng ngày.
    https://stocktwits.com/topsoicau""
    Xem thêm: #topsoicau, #soicau, #soicauxsmb, #soicauxsmt, #soicauxsmn, #dudoanxsmb, #dudoanxsmt, #dudoanxsmn, #soicaurongbachkim, #soicauviet, #soicaulotto, #soicaulovip, #soicau3mien, #soicau7777, #soicau247, #soicau555, #soicau366, #soicauwap, #soicau568, #soicau24h, #soicau888, #soicau666, #soicauwin2888, #soicaukubet, #soicaukhongtu
    sdsdsd
    Website: TOPSoiCau.com
    """

    ReplyDelete
  77. "Taxitaithanhhung.vn- Website chuyên cung cấp dịch vụ chuyển nhà trọn gói tại Hải Phòng - chuyển nhà tại Hải Phòng - chuyển nhà Hải Phòng giá rẻ.
    https://www.ko-fi.com/post/Dich-vu-chuyen-nha-tai-Hai-Phong--0915-388-666-J3J81TFJP https://sketchfab.com/chuyennhahaiphong
    Website chuyển nhà Thành Hưng:Taxitaithanhhung.vn

    Từ khóa chuyển nhà: #chuyennhasgthanhhung
    #chuyennhahaiphong
    #chuyennhatrongoihaiphong
    #chuyennhataihaiphong
    #chuyennhahaiphonggiare
    #dichvuchuyennhahaiphong
    #vanchuyennhahaiphong
    #chuyennhahaiphonguytin
    #dichvuchuyennhatrongoihaiphong
    "dffdfd

    ReplyDelete
  78. Locally owned and operated roofing business, we are dedicated to quality craftsmanship and outstanding customer service. Our integrity and thoroughness will make your roofing experience a rewarding one.
    Titan Roofing

    ReplyDelete
  79. Radioboss Crack-
    A lot of people failed at what you accomplished, simply because they were busy finding problems while you were busy finding solutions.

    ReplyDelete
  80. Ableton Live Cracked
    Opportunity comes to those who quit Waiting and start Looking. Success comes to those who quit Thinking and start Doing. Congratulations for Looking and Doing.

    ReplyDelete
  81. Windows 8 Activator Key
    Your work speaks volumes of the kind of man you are – efficient, organized and result-oriented.

    ReplyDelete
  82. Nessus Crack With Keygen
    Even the smallest of jobs well done will take you one step closer towards the success that you have always dreamed about. Keep it up.

    ReplyDelete
  83. 3utools CrackYour hard work and effort have paid off! A success well deserved, an occasion worth celebrating! Congratulations!

    ReplyDelete
  84. Macbooster Torrent
    Doing a good job is not always about impressive innovation. Sometimes it is only about doing something with plain dedication.

    ReplyDelete
  85. Smadav Pro Crack
    alent means nothing, while experience, acquired in humility and with hard work, means everything.

    ReplyDelete
  86. Drivermax Pro Crack
    Not a single effort of yours will go in vain. You will be rewarded for your pain. Your hard work will bring you a lot of gain.

    ReplyDelete
  87. Windows 10 Activator
    The highest reward for man’s toil is not what he gets for it, but what he becomes by it.

    ReplyDelete
  88. Smadav Pro Crack
    The highest reward for man’s toil is not what he gets for it, but what he becomes by it.

    ReplyDelete
  89. Microsoft Toolkit Final Activator
    If Oscars were given for a job well done, I’d nominate you! Congratulations for your fantastic achievement

    ReplyDelete
  90. chuyển nhà trọn gói Thành Hưng

    taxitaithanhhung042020@gmail.com

    https://vnexpress.net/20-nam-taxi-tai-thanh-hung-phuc-vu-khach-hang-4075831.html

    "Taxi tải Thành Hưng - xe tải Thành Hưng - Vận tải Thành Hưng dịch vụ vận tải số 1 Việt Nam.
    Taxitaithanhhung.vn - công ty cung cấp giải pháp chuyển nhà - chuyển văn phòng trọn gói tại Hà Nội.
    #taxitaithanhhungvn #taxitaithanhhung #vantaithanhhung #xetaithanhhung #taxitaihanoi #taithanhhung #taxithanhhung #xeThanhhung #chuyennhathanhhung #thanhhung
    Link social :
    https://vnexpress.net/20-nam-taxi-tai-thanh-hung-phuc-vu-khach-hang-4075831.html"

    ReplyDelete
  91. "Taxi tải Thành Hưng - xe tải Thành Hưng - Vận tải Thành Hưng dịch vụ vận tải số 1 Việt Nam.
    Taxitaithanhhung.vn - công ty cung cấp giải pháp chuyển nhà - chuyển văn phòng trọn gói tại Hà Nội.
    #taxitaithanhhungvn #taxitaithanhhung #vantaithanhhung #xetaithanhhung #taxitaihanoi #taithanhhung #taxithanhhung #xeThanhhung #chuyennhathanhhung #thanhhung
    Link social :ddddddddddddddd
    https://vnexpress.net/20-nam-taxi-tai-thanh-hung-phuc-vu-khach-hang-4075831.html"

    ReplyDelete
  92. 123Movies is the most popular website for film streaming recently. 123Movies A Famous And Popular Website to Watch Movies Like, movies123, 123 movies. In this post, let’s find out some crucial information about this trending site. ☑️ Watch Free Movies: Putlockerc.to

    ReplyDelete
  93. 123Movies is the most popular website for film streaming recently. 123Movies A Famous And Popular Website to Watch Movies Like, movies123, 123 movies. In this post, let’s find out some crucial information about this trending site. ☑️ Watch Free Movies: Putlockerc.to

    ReplyDelete
  94. 123Movies is the most popular website for film streaming recently. 123Movies A Famous And Popular Website to Watch Movies Like, movies123, 123 movies. In this post, let’s find out some crucial information about this trending site. ☑️ Watch Free Movies: Putlockerc.to

    ReplyDelete
  95. 123Movies is the most popular website for film streaming recently. 123Movies A Famous And Popular Website to Watch Movies Like, movies123, 123 movies. In this post, let’s find out some crucial information about this trending site. ☑️ Watch Free Movies: Putlockerc.to ddsadasdsadsa

    ReplyDelete
  96. FMovies - Wacth Free Movies Online - FMoviesF.co. Free Full Movies HD Online just on FMoviesF.co without Register or Sign In . FMoviesF is new site FMovies

    ReplyDelete
  97. Some time we never feel what we have done but for other that is big achievement


    investorsdiurnal.com

    ReplyDelete

  98. ELY WEDDING là công ty cung cấp dịch vụ chụp ảnh cưới Hà Nội giá rẻ hàng đầu việt nam với nhiều mẫu ảnh cưới độc và lạ.
    Với nhiều năm kinh nghiệm trong lĩnh vực Media chúng tôi sẽ mang đến cho các bạn những bộ sưu tập ảnh cưới vô cùng độc và lạ
    Tên Thương hiệu: Ely Wedding
    Địa chỉ : 26 Đường Láng, Ngã Tư Sở, Quận Đống Đa, Hà Nội
    Email: weddingely@gmail.com
    SĐT: 02435642564
    ID: /m/08rqq5
    Hệ thống social ely wedding - dịch vụ chụp ảnh cưới tại Hà Nội:
    https://sites.google.com/view/ely-wedding
    https://elywedding.business.site/
    https://ely-wedding.jimdosite.com/
    https://elywedding.tumblr.com/
    https://www.pearltrees.com/elywedding
    Từ khóa tìm kiếm:
    #ely #elywedding #anhvienaocuoiely #aocuoiely #chupanhcuoiely #aocuoi #anhvienaocuoi #dichvuchupanhcuoi #dichvuchupanhcuoidep #dichvuchupanhcuoihanoi #dichvuchupanhcuoitrongnha #dichvuchupanhcuoigiare #dichvuchupanhdamcuoi #dichvuchupanhcuoitieccuoi #dichvuchupanhcuoingaycuoi #dichvuchupanhcuoichuyennghiep

    Website: ely.com.vn

    ReplyDelete
  99. Great article it was such an interesting and informative article.


    Garage Door Repair Chestermere

    ReplyDelete
  100. אם כי אני לא מסכים עם כל מה שנכתב, מאמר מעניין
    אינפיניטי qx70

    ReplyDelete
  101. חשבתי שאתקל בסתם עוד מאמר שטחי. טעיתי.
    כלב קטן

    ReplyDelete
  102. wow beautiful! so cute and great pics, lovely memories for future to remember past.


    Garage door pitt

    ReplyDelete
  103. The blog article very surprised to me! Your writing is good. In this I learned a lot! Thank you!


    The blog article very surprised to me! Your writing is good. In this I learned a lot! Thank you!

    ReplyDelete
  104. Great Article… I love to read your articles because your writing style is too good, its is very helpful for all of us and I never get bored while reading your article because, they are becomes a more and more interesting from the starting lines until the end.

    Spring Boot and Micro services Training in Gurgaon
    Java Training in Gurgaon
    Java Framawork Training in Gurgaon
    Android Training in Gurgaon

    ReplyDelete
  105. Thanks for sharing valuable information.

    ReplyDelete
  106. Subsequently, after spending many hours on the internet at last We've uncovered an individual that definitely does know what they are discussing many thanks a great deal wonderful post.


    GDR Tech Los Angeles

    ReplyDelete
  107. Xem video hướng dẫn cài đặt hack kubet - hack xóc đĩa - hack game tài xỉu tại kênh youtube chính thức của tool hack kubet Hacku

    https://www.youtube.com/watch?v=vVG7Ho8wNMA&t

    #hacku, #hacktaixiu,#hackxocdia, #toolhackkubet, #hackkucasino, #hackgamexocdia, #xocdiabip, #hacktaixiu,#hackxocdia /m/033_l8

    ReplyDelete
  108. It’s really great post, nice blog..I would like to appreciate your work and would like to tell to my friends.


    Garage Door Installation Pittsburgh

    ReplyDelete
  109. NIce article this article has been my favorite, interesting and informative article.


    garage door repair company

    ReplyDelete
  110. You made some good quality points there. I did a search on the topic and found many people will agree with your blog.


    garage door repair Markham 

    ReplyDelete
  111. Spot on with this article, I really think this website needs more attention. I'll probably be back to read more, thanks for the info.

    dryer vent cleaning pittsburgh 

    ReplyDelete
  112. I wanted to thank you for this great read. Your blog is one of the finest blog . Thanks for posting this informative article.
    San Jose Garage Door Doctor

    ReplyDelete
  113. Customer experience management software

    Experience management software allows businesses to measure customer impressions through feedback, seeing how that feedback relates to the business metrics, and analyzing them as one.

    ReplyDelete
  114. Patient case management software

    Unlike electronic medical records (EMRs) and electronic health records (EHRs), patient management systems help clinicians provide value-based care by improving patient engagement and nurturing patient-provider relationships.

    ReplyDelete
  115. מרתק כמה שלא הבנתי כלום עד שקראתי את המאמר הנפלא הזה
    אפיון חווית משתמש

    ReplyDelete
  116. Excellent information on your blog, thank you for taking the time to share with us. This code is very useful..

    Hickory Towing
    Towing Mount Pleasant SC
    Towing Jacksonville NC

    ReplyDelete
  117. Win365 là nhà cái chuyên về casino, bóng đá và Slot game uy tín hàng đầu việt nam năm 2021. Win365vip.org cung cấp link vào nhà cái Win365 nhận ngay 50.000 VNĐ khuyến mãi nhà cái và 3.5 tr VNĐ chơi cá cược bóng đá!
    Tại website Win365.football bạn dễ dàng có thể tìm thấy những link vào Win365 mới nhất được cập nhật thường xuyên. Ngoài ra chúng tôi cũng cung cấp những thông tin hữu ích, mẹo cược và soi kèo bóng đá những trận đấu hấp dẫn và đỉnh cao giúp người chơi tại Win365 dễ dàng nhận định và chiến thắng.
    Link truy cập chính thức mới nhất không die: https://win365vip.org/
    Hashtag: #win365, #nhacaiwin365, #dailywin365, #win365vip, #win365viporg

    ReplyDelete
  118. This is truly the web service provider I was looking for!
    door replacement

    ReplyDelete
  119. There are certainly a lot of details like that to take into consideration.


    garage door cable repair

    ReplyDelete
  120. A very awesome blog post. We are really grateful for your blog post. You will find a lot of approaches after visiting your post.
    Austin Garage Doors

    ReplyDelete
  121. I wanted to thank you for this great read. Your blog is one of the finest blog . Thanks for posting this informative article.


    central air conditioning

    ReplyDelete
  122. I wanted to thank you for this great read. Your blog is one of the finest blog . Thanks for posting this informative article.


    kitchen renovation houston

    ReplyDelete
  123. Wow! Thank you! I always wanted to write in my site something like that. Can I take part of your post to my blog?


    report a scam

    ReplyDelete
  124. I wanted to thank you for this great read. Your blog is one of the finest blog . Thanks for posting this informative article.


    name reputation management

    ReplyDelete
  125. Wow! Thank you! I always wanted to write in my site something like that. Can I take part of your post to my blog?


    Commercial Appliance Repair

    ReplyDelete
  126. Wow! Thank you! I always wanted to write in my site something like that. Can I take part of your post to my blog?


    report a scam

    ReplyDelete
  127. Great blog, keeping me from working. All the Best


    Gutter Installation

    ReplyDelete
  128. Hello, U write some extraordinarily attractive blogs. I always check back here frequently to see if you have updated


    car lockout service

    ReplyDelete
  129. I like this post, And I figure that they have a great time to peruse this post, they might take a decent site to make an information, thanks for sharing it with me.
    Clear Water

    ReplyDelete
  130. מאמר מצוין נהניתי מכל רגע של קריאה

    עיצוב גבות

    ReplyDelete
  131. Hello, U write some extraordinarily attractive blogs. I always check back here frequently to see if you have updated


    Rolling Steel Doors

    ReplyDelete
  132. This is a wonderful article, Given so much info in it, These type of articles keeps the user's interest in the website.
    mobile locksmith

    ReplyDelete
  133. Cool blog you got here and thank you for the valuable info.


    car key replacement

    ReplyDelete
  134. You made some good quality points there. I did a search on the topic and found many people will agree with your blog.


    global asset management scam

    ReplyDelete
  135. So lucky to come across your excellent blog. Your blog brings me a great deal of fun. Good luck with the site. Commercial Locksmith in Markham

    ReplyDelete
  136. Hello, U write some extraordinarily attractive blogs. I always check back here frequently to see if you have updated


    car locksmith

    ReplyDelete
  137. Very Nice Blog…Thanks for sharing this information with us. Here am sharing some information about training institute.
    devops training in hyderabad


    ReplyDelete
  138. Baccarat - Best Tips & Tricks | Play Online for Free
    Baccarat 바카라사이트 is a simple game that involves a wide variety of rules. Players choose five numbers and then they are dealt two to three on 제왕카지노 a 더킹카지노 row. Baccarat is a

    ReplyDelete
  139. Really Good Work Done By You...However, stopping by with great quality writing, it's hard to see any good blog today.
    fullzversionpro.org
    cracksoftwarefreedownload.com
    Anni Crack
    WinISO CRACK

    ReplyDelete
  140. Really Good Work Done By You...However, stopping by with great quality writing, it's hard to see any good blog today.
    PRCrack
    Bplan Data Recovery Software CRACK

    ReplyDelete