notelab.docx
《notelab.docx》由会员分享,可在线阅读,更多相关《notelab.docx(23页珍藏版)》请在冰豆网上搜索。
notelab
/*
*NoteLab:
Anadvancednotetakingapplicationforpen-enabledplatforms
*
*Copyright(C)2006,DominicKramer
*
*Thisprogramisfreesoftware;youcanredistributeitand/ormodify
*itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby
*theFreeSoftwareFoundation;eitherversion2oftheLicense,or
*(atyouroption)anylaterversion.
*
*Thisprogramisdistributedinthehopethatitwillbeuseful,
*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe
*GNUGeneralPublicLicenseformoredetails.
*
*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicensealong
*withthisprogram;ifnot,writetotheFreeSoftwareFoundation,Inc.,
*51FranklinStreet,FifthFloor,Boston,MA02110-1301USA.
*
*Foranyquestionsorcommentspleasecontact:
*DominicKramer
*kramerd@iastate.edu
*/
packagenoteLab.model.binder;
importjava.awt.Graphics;
importjava.awt.geom.Rectangle2D;
importjava.awt.print.PageFormat;
importjava.awt.print.Pageable;
importjava.awt.print.Printable;
importjava.awt.print.PrinterException;
importjava.util.Iterator;
importjava.util.LinkedList;
importjava.util.Vector;
importnoteLab.gui.listener.RepaintBroadcastCenter;
importnoteLab.gui.listener.RepaintListener;
importnoteLab.model.Page;
importnoteLab.model.Paper.PaperType;
importnoteLab.model.geom.FloatPoint2D;
importnoteLab.util.CopyReady;
importnoteLab.util.UnitScaleDependent;
importnoteLab.util.geom.Bounded;
importnoteLab.util.geom.RectangleUnioner;
importnoteLab.util.geom.Transformable;
importnoteLab.util.geom.unit.Unit;
importnoteLab.util.mod.ModBroadcaster;
importnoteLab.util.mod.ModListener;
importnoteLab.util.mod.ModType;
importnoteLab.util.render.PrinterRenderer2D;
importnoteLab.util.render.Renderable;
importnoteLab.util.render.Renderer2D;
importnoteLab.util.settings.SettingsUtilities;
/**
*AbinderrepresentsacollectionofPages
.Thisclassstorestheinformation
*neededbyanyrepresentationofabinder.However,subclasseshandlehowPages
*arearrangedinthebinder.
*
*ThisclassisusedinthataCompositeCanvas
usesaBinder
to
*holdallofitsPages
.
*
*@authorDominicKramer
*/
publicabstractclassBinderimplementsRenderable,Bounded,
RepaintBroadcastCenter,
ModBroadcaster,
ModListener,
Iterable,
Transformable,
Printable,
Pageable,
CopyReady,
UnitScaleDependent
{
/**
*Theformatinwhichthisbinder'spagesarein.Thisfield
*isusedwhenprintingthisbinder.
*/
privatestaticPageFormatLETTER_SIZE_FORMAT=newPageFormat();
/**Theindexofthisbinder'scurrentpage.*/
privateintcurPage;
/**Thelistofpagesthatthisbindercontains.*/
privateLinkedListpageList;
/**Thevectoroflistenersthatshouldbeinformedwhenrepaintsoccur.*/
privateVectorrepaintListeners;
/**
*Thevectoroflistenersthatshouldbeinformedwhenapagehasbeenadded
*orremovedfromthisbinderorwhenthisbinder'scurrentpagehasbeen
*modified.
*/
privateVectorbinderListeners;
/**Thelevel,alongthex-axis,atwhichthisbinderiscurrentlyscaled.*/
protectedfloatxScaleLevel;
/**Thelevel,alongthey-axis,atwhichthisbinderiscurrentlyscaled.*/
protectedfloatyScaleLevel;
/**
*Thevectoroflistenersthatshouldbeinformedwhenthisbinderhasbeen
*modified.
*/
privateVectormodListenerVec;
publicBinder(floatxScaleLevel,floatyScaleLevel,Page...pages)
{
if(pages==null)
thrownewNullPointerException();
if(pages.length==0)
pages=newPage[]{newPage(SettingsUtilities.getPaperType(),
xScaleLevel,yScaleLevel,
Unit.getScreenResolution(),
SettingsUtilities.getUnitScaleFactor())};
this.modListenerVec=newVector();
this.xScaleLevel=xScaleLevel;
this.yScaleLevel=yScaleLevel;
this.repaintListeners=newVector();
this.binderListeners=newVector();
this.pageList=newLinkedList();
for(Pagep:
pages)
addPage(p);
this.curPage=-1;
setCurrentPage(0);
}
//----------------=[Methodsusedformodifyingthepages]=------------------//
/**
*Implementedsoanobjectofthisclasscanbeusedina
*foreach
loop.
*/
publicIteratoriterator()
{
returnthis.pageList.iterator();
}
/**Addsadeepcopyofthecurrentpagetotheendofthebinder.*/
publicvoidcopyPage()
{
addPage(getCurrentPage().getCopy());
}
/**Addsanewpagetotheendofthebinder.*/
publicvoidaddNewPage()
{
addPage(newPage(getCurrentPage()));
}
publicvoidaddNewPageAfterCurrent()
{
PagecurPage=getCurrentPage();
addPageAfter(curPage,newPage(curPage));
}
publicvoidaddNewPageBeforeCurrent()
{
PagecurPage=getCurrentPage();
addPageBefore(curPage,newPage(curPage));
}
/**
*Addsthegivenpagetotheedgeofthebinder.
*
*@parampageThepagetoaddtotheendofthebinder.
*/
publicvoidaddPage(Pagepage)
{
if(page==null)
thrownewNullPointerException();
this.pageList.add(page);
page.addModListener(this);
setCurrentPage(getNumberOfPages()-1);
doLayout();
notifyModListeners(ModType.Other);
for(BinderListenerlistener:
this.binderListeners)
listener.pageAdded(this,page);
}
privatevoidaddPage(Pagepage,intindex)
{
if(page==null)
thrownewNullPointerException();
this.pageList.add(index,page);
page.addModListener(this);
setCurrentPage(this.pageList.indexOf(page));
doLayout();
notifyModListeners(ModType.Other);
for(BinderListenerlistener:
this.binderListeners)
listener.pageAdded(this,page);
}
publicvoidaddPageBefore(PagebasePage,PagenewPage)
{
intindex=this.pageList.indexOf(basePage);
if(index==-1)
{
addPage(newPage);
return;
}
addPage(newPage,index);
}
publicvoidaddPageAfter(PagebasePage,PagenewPage)
{
intindex=this.pageList.indexOf(basePage);
if(index==-1)
{
addPage(newPage);
return;
}
index++;
if(index>=this.pageList.size())
{
addPage(newPage);
return;
}
addPage(newPage,index);
}
/**
*Removesthecurrentpagefromthebinder.Ifthepageisthelastpageinthebinder
*anewpageisaddedtothebindersothatthebinderisnotempty.
*/
publicvoidremoveCurrentPage()
{
removePage(getCurrentPage());
}
/**
*Removesthegivenpagefromthebinderifitisactuallyapageinthebinder.Ifthe
*pageisthelastpageinthebinderanewpageisaddedtothebindersothatthebinder
*isnotempty.
*
*@parampageThepagetoremovefromthebinder.
*/
publicvoidremovePage(Pagepage)
{
if(page==null)
thrownewNullPointerException();
if(getNumberOfPages()<2)
return;
PagecurPage=getCurrentPage();
curPage.setSelected(false);
intnewIndex=this.pageList.indexOf(page);
if(newIndex>0)
newIndex--;
page.removeModListener(this);
this.pageList.remove(page);
this.curPage=newIndex;
getCurrentPage().setSelected(true);
redraw();
doLayout();
notifyModListeners(ModType.Other);
for(BinderListenerlistener:
this.binderListeners)
{
listener.pageRemoved(this,page);
listener.currentPageChanged(this);
}
}
/**
*Usedtogetthepageatthespecifiedindex.Indicesstartwith0
and
*not1
.
*
*@paramindexTheindexofthepagetoretrieve.
*
*@returnThepageatthegivenindexornull
iftheindexisinvalid.
*/
privatePagegetPageAt(intindex)
{
if(index<0||index>=getNumberOfPages())
returnnull;
returnthis.pageList.get(index);
}
publicPagegetPageAt(FloatPoint2Dpoint)
{
if(point==null)
thrownewNullPointerException();
for(Pagepage:
this)
{
if(page.contains(point))
returnpage;
}
returnnull;
}
/**
*Usedtogetthebinder'scurrentpage.
*
*@returnThebinder'scurrentpage.
*/
publicPagegetCurrentPage()
{
returngetPageAt(curPage);
}
/**
*Usedtosetthebinder'scurrentpagetothepagewiththespecifiedindex.
*
*@paramindexTheindexofthenewcurrentpage.Iftheindexisinvalidnothing
*isdone.
*/
publicvoidsetCurrentPage(finalintindex)
{
if(index<0||index>=getNumberOfPages())
thrownewArrayIndexOutOfBoundsException();
if(this.curPage==index)
return;
this.curPage=index;
notifyModListeners(ModType.Other);
for(BinderListenerlistener:
this.binderListeners)
listener.currentPageChanged(this);
}
/**
*Setsthebinder'scurrentpagetothepagewhichcontainsthegivenpoint.Thepointis
*relativetotheCompositeCanvas
whichcontainsthisBinder
.
*
*@parampointThepointintheCompositeCanvas
whichholdsthisbinder.
*
*@returntrue
ifthepointisvalidandthecurrentpagehasbeensetor
*false
otherwise.
*/
publicbooleansetCurrentPage(FloatPoint2Dpoint)
{
for(inti=0;i{
if(getPageAt(i).contains(point))
{
booleanchanged=(i!
=this.curPage);
setCurrentPage(i);
returnchanged;
}
}
returnfalse;
}
publicbooleancanFlipForward()
{
return(this.curPage+1)}
publicvoidflipForward()
{
if(canFlipForward())
setCurrentPage(this.curPage+1);
}
publicbooleancanFlip