12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686 |
- /**
- * Copyright (c) 2006-2015, JGraph Ltd
- */
- /**
- * Registers shapes.
- */
- (function()
- {
- // Cube Shape, supports size style
- function CubeShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(CubeShape, mxCylinder);
- CubeShape.prototype.size = 20;
- CubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
- if (isForeground)
- {
- path.moveTo(s, h);
- path.lineTo(s, s);
- path.lineTo(0, 0);
- path.moveTo(s, s);
- path.lineTo(w, s);
- path.end();
- }
- else
- {
- path.moveTo(0, 0);
- path.lineTo(w - s, 0);
- path.lineTo(w, s);
- path.lineTo(w, h);
- path.lineTo(s, h);
- path.lineTo(0, h - s);
- path.lineTo(0, 0);
- path.close();
- path.end();
- }
- };
- mxCellRenderer.prototype.defaultShapes['cube'] = CubeShape;
-
- var tan30 = Math.tan(mxUtils.toRadians(30));
- var tan30Dx = (0.5 - tan30) / 2;
-
- // Cube Shape, supports size style
- function IsoRectangleShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(IsoRectangleShape, mxActor);
- IsoRectangleShape.prototype.size = 20;
- IsoRectangleShape.prototype.redrawPath = function(path, x, y, w, h)
- {
- var m = Math.min(w, h / tan30);
- path.translate((w - m) / 2, (h - m) / 2 + m / 4);
- path.moveTo(0, 0.25 * m);
- path.lineTo(0.5 * m, m * tan30Dx);
- path.lineTo(m, 0.25 * m);
- path.lineTo(0.5 * m, (0.5 - tan30Dx) * m);
- path.lineTo(0, 0.25 * m);
- path.close();
- path.end();
- };
- mxCellRenderer.prototype.defaultShapes['isoRectangle'] = IsoRectangleShape;
- // Cube Shape, supports size style
- function IsoCubeShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(IsoCubeShape, mxCylinder);
- IsoCubeShape.prototype.size = 20;
- IsoCubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var m = Math.min(w, h / (0.5 + tan30));
- if (isForeground)
- {
- path.moveTo(0, 0.25 * m);
- path.lineTo(0.5 * m, (0.5 - tan30Dx) * m);
- path.lineTo(m, 0.25 * m);
- path.moveTo(0.5 * m, (0.5 - tan30Dx) * m);
- path.lineTo(0.5 * m, (1 - tan30Dx) * m);
- path.end();
- }
- else
- {
- path.translate((w - m) / 2, (h - m) / 2);
- path.moveTo(0, 0.25 * m);
- path.lineTo(0.5 * m, m * tan30Dx);
- path.lineTo(m, 0.25 * m);
- path.lineTo(m, 0.75 * m);
- path.lineTo(0.5 * m, (1 - tan30Dx) * m);
- path.lineTo(0, 0.75 * m);
- path.close();
- path.end();
- }
- };
- mxCellRenderer.prototype.defaultShapes['isoCube'] = IsoCubeShape;
-
- // DataStore Shape, supports size style
- function DataStoreShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(DataStoreShape, mxCylinder);
- DataStoreShape.prototype.redrawPath = function(c, x, y, w, h, isForeground)
- {
- var dy = Math.min(h / 2, Math.round(h / 8) + this.strokewidth - 1);
-
- if ((isForeground && this.fill != null) || (!isForeground && this.fill == null))
- {
- c.moveTo(0, dy);
- c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
-
- // Needs separate shapes for correct hit-detection
- if (!isForeground)
- {
- c.stroke();
- c.begin();
- }
-
- c.translate(0, dy / 2);
- c.moveTo(0, dy);
- c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
-
- // Needs separate shapes for correct hit-detection
- if (!isForeground)
- {
- c.stroke();
- c.begin();
- }
-
- c.translate(0, dy / 2);
- c.moveTo(0, dy);
- c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
-
- // Needs separate shapes for correct hit-detection
- if (!isForeground)
- {
- c.stroke();
- c.begin();
- }
-
- c.translate(0, -dy);
- }
-
- if (!isForeground)
- {
- c.moveTo(0, dy);
- c.curveTo(0, -dy / 3, w, -dy / 3, w, dy);
- c.lineTo(w, h - dy);
- c.curveTo(w, h + dy / 3, 0, h + dy / 3, 0, h - dy);
- c.close();
- }
- };
- DataStoreShape.prototype.getLabelBounds = function(rect)
- {
- var dy = 2.5 * Math.min(rect.height / 2, Math.round(rect.height / 8) + this.strokewidth - 1);
- if ((!this.flipV && (this.direction == null || this.direction == mxConstants.DIRECTION_EAST) ||
- (this.flipV && this.direction == mxConstants.DIRECTION_WEST)))
- {
- rect.y += dy;
- rect.height -= dy;
- }
- else if ((!this.flipV && this.direction == mxConstants.DIRECTION_SOUTH) ||
- ((this.flipV && this.direction == mxConstants.DIRECTION_NORTH)))
- {
- rect.width -= dy;
- }
- else if ((!this.flipV && this.direction == mxConstants.DIRECTION_WEST) ||
- (this.flipV && (this.direction == null || this.direction == mxConstants.DIRECTION_EAST)))
- {
- rect.height -= dy;
- }
- else if ((!this.flipV && this.direction == mxConstants.DIRECTION_NORTH) ||
- (this.flipV && this.direction == mxConstants.DIRECTION_SOUTH))
- {
- rect.x += dy;
- rect.width -= dy;
- }
-
- return rect;
- };
- mxCellRenderer.prototype.defaultShapes['datastore'] = DataStoreShape;
- // Note Shape, supports size style
- function NoteShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(NoteShape, mxCylinder);
- NoteShape.prototype.size = 30;
- NoteShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
- if (isForeground)
- {
- path.moveTo(w - s, 0);
- path.lineTo(w - s, s);
- path.lineTo(w, s);
- path.end();
- }
- else
- {
- path.moveTo(0, 0);
- path.lineTo(w - s, 0);
- path.lineTo(w, s);
- path.lineTo(w, h);
- path.lineTo(0, h);
- path.lineTo(0, 0);
- path.close();
- path.end();
- }
- };
- mxCellRenderer.prototype.defaultShapes['note'] = NoteShape;
- // Note Shape, supports size style
- function SwitchShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(SwitchShape, mxActor);
- SwitchShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var curve = 0.5;
- c.moveTo(0, 0);
- c.quadTo(w / 2, h * curve, w, 0);
- c.quadTo(w * (1 - curve), h / 2, w, h);
- c.quadTo(w / 2, h * (1 - curve), 0, h);
- c.quadTo(w * curve, h / 2, 0, 0);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['switch'] = SwitchShape;
- // Folder Shape, supports tabWidth, tabHeight styles
- function FolderShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(FolderShape, mxCylinder);
- FolderShape.prototype.tabWidth = 60;
- FolderShape.prototype.tabHeight = 20;
- FolderShape.prototype.tabPosition = 'right';
- FolderShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight))));
- var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
- if (isForeground)
- {
- if (tp == 'left')
- {
- path.moveTo(0, dy);
- path.lineTo(dx, dy);
- }
- // Right is default
- else
- {
- path.moveTo(w - dx, dy);
- path.lineTo(w, dy);
- }
-
- path.end();
- }
- else
- {
- if (tp == 'left')
- {
- path.moveTo(0, 0);
- path.lineTo(dx, 0);
- path.lineTo(dx, dy);
- path.lineTo(w, dy);
- }
- // Right is default
- else
- {
- path.moveTo(0, dy);
- path.lineTo(w - dx, dy);
- path.lineTo(w - dx, 0);
- path.lineTo(w, 0);
- }
-
- path.lineTo(w, h);
- path.lineTo(0, h);
- path.lineTo(0, dy);
- path.close();
- path.end();
- }
- };
- mxCellRenderer.prototype.defaultShapes['folder'] = FolderShape;
- // Card shape
- function CardShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CardShape, mxActor);
- CardShape.prototype.size = 30;
- CardShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w, 0), new mxPoint(w, h), new mxPoint(0, h), new mxPoint(0, s)],
- this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['card'] = CardShape;
- // Tape shape
- function TapeShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(TapeShape, mxActor);
- TapeShape.prototype.size = 0.4;
- TapeShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var fy = 1.4;
-
- c.moveTo(0, dy / 2);
- c.quadTo(w / 4, dy * fy, w / 2, dy / 2);
- c.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
- c.lineTo(w, h - dy / 2);
- c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
- c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
- c.lineTo(0, dy / 2);
- c.close();
- c.end();
- };
-
- TapeShape.prototype.getLabelBounds = function(rect)
- {
- if (mxUtils.getValue(this.style, 'boundedLbl', false))
- {
- var size = mxUtils.getValue(this.style, 'size', this.size);
- var w = rect.width;
- var h = rect.height;
-
- if (this.direction == null ||
- this.direction == mxConstants.DIRECTION_EAST ||
- this.direction == mxConstants.DIRECTION_WEST)
- {
- var dy = h * size;
- return new mxRectangle(rect.x, rect.y + dy, w, h - 2 * dy);
- }
- else
- {
- var dx = w * size;
- return new mxRectangle(rect.x + dx, rect.y, w - 2 * dx, h);
- }
- }
-
- return rect;
- };
-
- mxCellRenderer.prototype.defaultShapes['tape'] = TapeShape;
- // Document shape
- function DocumentShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DocumentShape, mxActor);
- DocumentShape.prototype.size = 0.3;
- DocumentShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var fy = 1.4;
-
- c.moveTo(0, 0);
- c.lineTo(w, 0);
- c.lineTo(w, h - dy / 2);
- c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
- c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
- c.lineTo(0, dy / 2);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['document'] = DocumentShape;
- // Parallelogram shape
- function ParallelogramShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(ParallelogramShape, mxActor);
- ParallelogramShape.prototype.size = 0.2;
- ParallelogramShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w, 0), new mxPoint(w - dx, h)],
- this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['parallelogram'] = ParallelogramShape;
- // Trapezoid shape
- function TrapezoidShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(TrapezoidShape, mxActor);
- TrapezoidShape.prototype.size = 0.2;
- TrapezoidShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = w * Math.max(0, Math.min(0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w - dx, 0), new mxPoint(w, h)],
- this.isRounded, arcSize, true);
- };
- mxCellRenderer.prototype.defaultShapes['trapezoid'] = TrapezoidShape;
- // Curly Bracket shape
- function CurlyBracketShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CurlyBracketShape, mxActor);
- CurlyBracketShape.prototype.size = 0.5;
- CurlyBracketShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.setFillColor(null);
- var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(w, 0), new mxPoint(s, 0), new mxPoint(s, h / 2),
- new mxPoint(0, h / 2), new mxPoint(s, h / 2), new mxPoint(s, h),
- new mxPoint(w, h)], this.isRounded, arcSize, false);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['curlyBracket'] = CurlyBracketShape;
- // Parallel marker shape
- function ParallelMarkerShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(ParallelMarkerShape, mxActor);
- ParallelMarkerShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.setStrokeWidth(1);
- c.setFillColor(this.stroke);
- var w2 = w / 5;
- c.rect(0, 0, w2, h);
- c.fillAndStroke();
- c.rect(2 * w2, 0, w2, h);
- c.fillAndStroke();
- c.rect(4 * w2, 0, w2, h);
- c.fillAndStroke();
- };
- mxCellRenderer.prototype.defaultShapes['parallelMarker'] = ParallelMarkerShape;
- /**
- * Adds handJiggle style (jiggle=n sets jiggle)
- */
- function HandJiggle(canvas, defaultVariation)
- {
- this.canvas = canvas;
-
- // Avoids "spikes" in the output
- this.canvas.setLineJoin('round');
- this.canvas.setLineCap('round');
-
- this.defaultVariation = defaultVariation;
-
- this.originalLineTo = this.canvas.lineTo;
- this.canvas.lineTo = mxUtils.bind(this, HandJiggle.prototype.lineTo);
-
- this.originalMoveTo = this.canvas.moveTo;
- this.canvas.moveTo = mxUtils.bind(this, HandJiggle.prototype.moveTo);
-
- this.originalClose = this.canvas.close;
- this.canvas.close = mxUtils.bind(this, HandJiggle.prototype.close);
-
- this.originalQuadTo = this.canvas.quadTo;
- this.canvas.quadTo = mxUtils.bind(this, HandJiggle.prototype.quadTo);
-
- this.originalCurveTo = this.canvas.curveTo;
- this.canvas.curveTo = mxUtils.bind(this, HandJiggle.prototype.curveTo);
-
- this.originalArcTo = this.canvas.arcTo;
- this.canvas.arcTo = mxUtils.bind(this, HandJiggle.prototype.arcTo);
- };
-
- HandJiggle.prototype.moveTo = function(endX, endY)
- {
- this.originalMoveTo.apply(this.canvas, arguments);
- this.lastX = endX;
- this.lastY = endY;
- this.firstX = endX;
- this.firstY = endY;
- };
-
- HandJiggle.prototype.close = function()
- {
- if (this.firstX != null && this.firstY != null)
- {
- this.lineTo(this.firstX, this.firstY);
- this.originalClose.apply(this.canvas, arguments);
- }
-
- this.originalClose.apply(this.canvas, arguments);
- };
-
- HandJiggle.prototype.quadTo = function(x1, y1, x2, y2)
- {
- this.originalQuadTo.apply(this.canvas, arguments);
- this.lastX = x2;
- this.lastY = y2;
- };
-
- HandJiggle.prototype.curveTo = function(x1, y1, x2, y2, x3, y3)
- {
- this.originalCurveTo.apply(this.canvas, arguments);
- this.lastX = x3;
- this.lastY = y3;
- };
-
- HandJiggle.prototype.arcTo = function(rx, ry, angle, largeArcFlag, sweepFlag, x, y)
- {
- this.originalArcTo.apply(this.canvas, arguments);
- this.lastX = x;
- this.lastY = y;
- };
- HandJiggle.prototype.lineTo = function(endX, endY)
- {
- // LATER: Check why this.canvas.lastX cannot be used
- if (this.lastX != null && this.lastY != null)
- {
- var dx = Math.abs(endX - this.lastX);
- var dy = Math.abs(endY - this.lastY);
- var dist = Math.sqrt(dx * dx + dy * dy);
-
- if (dist < 2)
- {
- this.originalLineTo.apply(this.canvas, arguments);
- this.lastX = endX;
- this.lastY = endY;
-
- return;
- }
-
- var segs = Math.round(dist / 10);
- var variation = this.defaultVariation;
-
- if (segs < 5)
- {
- segs = 5;
- variation /= 3;
- }
-
- function sign(x)
- {
- return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
- }
-
- var stepX = sign(endX - this.lastX) * dx / segs;
- var stepY = sign(endY - this.lastY) * dy / segs;
-
- var fx = dx / dist;
- var fy = dy / dist;
-
- for (var s = 0; s < segs; s++)
- {
- var x = stepX * s + this.lastX;
- var y = stepY * s + this.lastY;
-
- var offset = (Math.random() - 0.5) * variation;
- this.originalLineTo.call(this.canvas, x - offset * fy, y - offset * fx);
- }
-
- this.originalLineTo.call(this.canvas, endX, endY);
- this.lastX = endX;
- this.lastY = endY;
- }
- else
- {
- this.originalLineTo.apply(this.canvas, arguments);
- this.lastX = endX;
- this.lastY = endY;
- }
- };
-
- HandJiggle.prototype.destroy = function()
- {
- this.canvas.lineTo = this.originalLineTo;
- this.canvas.moveTo = this.originalMoveTo;
- this.canvas.close = this.originalClose;
- this.canvas.quadTo = this.originalQuadTo;
- this.canvas.curveTo = this.originalCurveTo;
- this.canvas.arcTo = this.originalArcTo;
- };
-
- // Installs hand jiggle in all shapes
- var mxShapePaint0 = mxShape.prototype.paint;
- mxShape.prototype.defaultJiggle = 1.5;
- mxShape.prototype.paint = function(c)
- {
- // NOTE: getValue does not return a boolean value so !('0') would return true here and below
- if (this.style != null && mxUtils.getValue(this.style, 'comic', '0') != '0' && c.handHiggle == null)
- {
- c.handJiggle = new HandJiggle(c, mxUtils.getValue(this.style, 'jiggle', this.defaultJiggle));
- }
-
- mxShapePaint0.apply(this, arguments);
-
- if (c.handJiggle != null)
- {
- c.handJiggle.destroy();
- delete c.handJiggle;
- }
- };
-
- // Sets default jiggle for diamond
- mxRhombus.prototype.defaultJiggle = 2;
- /**
- * Overrides to avoid call to rect
- */
- var mxRectangleShapeIsHtmlAllowed0 = mxRectangleShape.prototype.isHtmlAllowed;
- mxRectangleShape.prototype.isHtmlAllowed = function()
- {
- return (this.style == null || mxUtils.getValue(this.style, 'comic', '0') == '0') &&
- mxRectangleShapeIsHtmlAllowed0.apply(this, arguments);
- };
-
- var mxRectangleShapePaintBackground0 = mxRectangleShape.prototype.paintBackground;
- mxRectangleShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- if (c.handJiggle == null)
- {
- mxRectangleShapePaintBackground0.apply(this, arguments);
- }
- else
- {
- var events = true;
-
- if (this.style != null)
- {
- events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';
- }
-
- if (events || (this.fill != null && this.fill != mxConstants.NONE) ||
- (this.stroke != null && this.stroke != mxConstants.NONE))
- {
- if (!events && (this.fill == null || this.fill == mxConstants.NONE))
- {
- c.pointerEvents = false;
- }
-
- c.begin();
-
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- var r = Math.min(w * f, h * f);
- c.moveTo(x + r, y);
- c.lineTo(x + w - r, y);
- c.quadTo(x + w, y, x + w, y + r);
- c.lineTo(x + w, y + h - r);
- c.quadTo(x + w, y + h, x + w - r, y + h);
- c.lineTo(x + r, y + h);
- c.quadTo(x, y + h, x, y + h - r);
- c.lineTo(x, y + r);
- c.quadTo(x, y, x + r, y);
- }
- else
- {
-
- c.moveTo(x, y);
- c.lineTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.lineTo(x, y + h);
- c.lineTo(x, y);
- }
-
- // LATER: Check if close is needed here
- c.close();
- c.end();
-
- c.fillAndStroke();
- }
- }
- };
- /**
- * Disables glass effect with hand jiggle.
- */
- var mxRectangleShapePaintForeground0 = mxRectangleShape.prototype.paintForeground;
- mxRectangleShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- if (c.handJiggle == null)
- {
- mxRectangleShapePaintForeground0.apply(this, arguments);
- }
- };
- // End of hand jiggle integration
-
- // Process Shape
- function ProcessShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(ProcessShape, mxRectangleShape);
- ProcessShape.prototype.size = 0.1;
- ProcessShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- ProcessShape.prototype.getLabelBounds = function(rect)
- {
- if (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true) ==
- (this.direction == null ||
- this.direction == mxConstants.DIRECTION_EAST ||
- this.direction == mxConstants.DIRECTION_WEST))
- {
- var w = rect.width;
- var h = rect.height;
- var r = new mxRectangle(rect.x, rect.y, w, h);
-
- var inset = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
-
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- inset = Math.max(inset, Math.min(w * f, h * f));
- }
-
- r.x += inset;
- r.width -= 2 * inset;
-
- return r;
- }
-
- return rect;
- };
- ProcessShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- var inset = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- inset = Math.max(inset, Math.min(w * f, h * f));
- }
-
- c.begin();
- c.moveTo(x + inset, y);
- c.lineTo(x + inset, y + h);
- c.moveTo(x + w - inset, y);
- c.lineTo(x + w - inset, y + h);
- c.end();
- c.stroke();
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
- mxCellRenderer.prototype.defaultShapes['process'] = ProcessShape;
- // Step shape
- function StepShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(StepShape, mxActor);
- StepShape.prototype.size = 0.2;
- StepShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w - s, 0), new mxPoint(w, h / 2), new mxPoint(w - s, h),
- new mxPoint(0, h), new mxPoint(s, h / 2)], this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['step'] = StepShape;
- // Hexagon shape
- function HexagonShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(HexagonShape, mxHexagon);
- HexagonShape.prototype.size = 0.25;
- HexagonShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, 0.5 * h), new mxPoint(w - s, h),
- new mxPoint(s, h), new mxPoint(0, 0.5 * h)], this.isRounded, arcSize, true);
- };
- mxCellRenderer.prototype.defaultShapes['hexagon'] = HexagonShape;
- // Plus Shape
- function PlusShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(PlusShape, mxRectangleShape);
- PlusShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- PlusShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- var border = Math.min(w / 5, h / 5) + 1;
-
- c.begin();
- c.moveTo(x + w / 2, y + border);
- c.lineTo(x + w / 2, y + h - border);
- c.moveTo(x + border, y + h / 2);
- c.lineTo(x + w - border, y + h / 2);
- c.end();
- c.stroke();
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
- mxCellRenderer.prototype.defaultShapes['plus'] = PlusShape;
-
- // Overrides painting of rhombus shape to allow for double style
- var mxRhombusPaintVertexShape = mxRhombus.prototype.paintVertexShape;
- mxRhombus.prototype.getLabelBounds = function(rect)
- {
- if (this.style['double'] == 1)
- {
- var margin = (Math.max(2, this.strokewidth + 1) * 2 + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale;
-
- return new mxRectangle(rect.x + margin, rect.y + margin, rect.width - 2 * margin, rect.height - 2 * margin);
- }
-
- return rect;
- };
- mxRhombus.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxRhombusPaintVertexShape.apply(this, arguments);
- if (!this.outline && this.style['double'] == 1)
- {
- var margin = Math.max(2, this.strokewidth + 1) * 2 + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0);
- x += margin;
- y += margin;
- w -= 2 * margin;
- h -= 2 * margin;
-
- if (w > 0 && h > 0)
- {
- c.setShadow(false);
-
- // Workaround for closure compiler bug where the lines with x and y above
- // are removed if arguments is used as second argument in call below.
- mxRhombusPaintVertexShape.apply(this, [c, x, y, w, h]);
- }
- }
- };
- // CompositeShape
- function ExtendedShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(ExtendedShape, mxRectangleShape);
- ExtendedShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- ExtendedShape.prototype.getLabelBounds = function(rect)
- {
- if (this.style['double'] == 1)
- {
- var margin = (Math.max(2, this.strokewidth + 1) + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale;
-
- return new mxRectangle(rect.x + margin, rect.y + margin, rect.width - 2 * margin, rect.height - 2 * margin);
- }
-
- return rect;
- };
-
- ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- if (this.style != null)
- {
- if (!this.outline && this.style['double'] == 1)
- {
- var margin = Math.max(2, this.strokewidth + 1) + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0);
- x += margin;
- y += margin;
- w -= 2 * margin;
- h -= 2 * margin;
-
- if (w > 0 && h > 0)
- {
- mxRectangleShape.prototype.paintBackground.apply(this, arguments);
- }
- }
-
- c.setDashed(false);
-
- // Draws the symbols defined in the style. The symbols are
- // numbered from 1...n. Possible postfixes are align,
- // verticalAlign, spacing, arcSpacing, width, height
- var counter = 0;
- var shape = null;
-
- do
- {
- shape = mxCellRenderer.prototype.defaultShapes[this.style['symbol' + counter]];
-
- if (shape != null)
- {
- var align = this.style['symbol' + counter + 'Align'];
- var valign = this.style['symbol' + counter + 'VerticalAlign'];
- var width = this.style['symbol' + counter + 'Width'];
- var height = this.style['symbol' + counter + 'Height'];
- var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
- var vspacing = this.style['symbol' + counter + 'VSpacing'] || spacing;
- var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
-
- if (arcspacing != null)
- {
- var arcSize = this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
- spacing += arcSize;
- vspacing += arcSize;
- }
-
- var x2 = x;
- var y2 = y;
-
- if (align == mxConstants.ALIGN_CENTER)
- {
- x2 += (w - width) / 2;
- }
- else if (align == mxConstants.ALIGN_RIGHT)
- {
- x2 += w - width - spacing;
- }
- else
- {
- x2 += spacing;
- }
-
- if (valign == mxConstants.ALIGN_MIDDLE)
- {
- y2 += (h - height) / 2;
- }
- else if (valign == mxConstants.ALIGN_BOTTOM)
- {
- y2 += h - height - vspacing;
- }
- else
- {
- y2 += vspacing;
- }
-
- c.save();
-
- // Small hack to pass style along into subshape
- var tmp = new shape();
- // TODO: Clone style and override settings (eg. strokewidth)
- tmp.style = this.style;
- shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
- c.restore();
- }
-
- counter++;
- }
- while (shape != null);
- }
-
- // Paints glass effect
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- };
- mxCellRenderer.prototype.defaultShapes['ext'] = ExtendedShape;
-
- // Tape Shape, supports size style
- function MessageShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(MessageShape, mxCylinder);
- MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- if (isForeground)
- {
- path.moveTo(0, 0);
- path.lineTo(w / 2, h / 2);
- path.lineTo(w, 0);
- path.end();
- }
- else
- {
- path.moveTo(0, 0);
- path.lineTo(w, 0);
- path.lineTo(w, h);
- path.lineTo(0, h);
- path.close();
- }
- };
- mxCellRenderer.prototype.defaultShapes['message'] = MessageShape;
-
- // UML Actor Shape
- function UmlActorShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlActorShape, mxShape);
- UmlActorShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
- // Head
- c.ellipse(w / 4, 0, w / 2, h / 4);
- c.fillAndStroke();
- c.begin();
- c.moveTo(w / 2, h / 4);
- c.lineTo(w / 2, 2 * h / 3);
-
- // Arms
- c.moveTo(w / 2, h / 3);
- c.lineTo(0, h / 3);
- c.moveTo(w / 2, h / 3);
- c.lineTo(w, h / 3);
-
- // Legs
- c.moveTo(w / 2, 2 * h / 3);
- c.lineTo(0, h);
- c.moveTo(w / 2, 2 * h / 3);
- c.lineTo(w, h);
- c.end();
-
- c.stroke();
- };
- // Replaces existing actor shape
- mxCellRenderer.prototype.defaultShapes['umlActor'] = UmlActorShape;
-
- // UML Boundary Shape
- function UmlBoundaryShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlBoundaryShape, mxShape);
- UmlBoundaryShape.prototype.getLabelBounds = function(rect)
- {
- return new mxRectangle(rect.x + rect.width / 6, rect.y, rect.width * 5 / 6, rect.height);
- };
- UmlBoundaryShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
-
- // Base line
- c.begin();
- c.moveTo(0, h / 4);
- c.lineTo(0, h * 3 / 4);
- c.end();
- c.stroke();
-
- // Horizontal line
- c.begin();
- c.moveTo(0, h / 2);
- c.lineTo(w / 6, h / 2);
- c.end();
- c.stroke();
-
- // Circle
- c.ellipse(w / 6, 0, w * 5 / 6, h);
- c.fillAndStroke();
- };
- // Replaces existing actor shape
- mxCellRenderer.prototype.defaultShapes['umlBoundary'] = UmlBoundaryShape;
- // UML Entity Shape
- function UmlEntityShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(UmlEntityShape, mxEllipse);
- UmlEntityShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.begin();
- c.moveTo(x + w / 8, y + h);
- c.lineTo(x + w * 7 / 8, y + h);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['umlEntity'] = UmlEntityShape;
- // UML Destroy Shape
- function UmlDestroyShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlDestroyShape, mxShape);
- UmlDestroyShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- c.translate(x, y);
- c.begin();
- c.moveTo(w, 0);
- c.lineTo(0, h);
- c.moveTo(0, 0);
- c.lineTo(w, h);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['umlDestroy'] = UmlDestroyShape;
-
- // UML Control Shape
- function UmlControlShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlControlShape, mxShape);
- UmlControlShape.prototype.getLabelBounds = function(rect)
- {
- return new mxRectangle(rect.x, rect.y + rect.height / 8, rect.width, rect.height * 7 / 8);
- };
- UmlControlShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- c.translate(x, y);
- // Upper line
- c.begin();
- c.moveTo(w * 3 / 8, h / 8 * 1.1);
- c.lineTo(w * 5 / 8, 0);
- c.end();
- c.stroke();
-
- // Circle
- c.ellipse(0, h / 8, w, h * 7 / 8);
- c.fillAndStroke();
- };
- UmlControlShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- // Lower line
- c.begin();
- c.moveTo(w * 3 / 8, h / 8 * 1.1);
- c.lineTo(w * 5 / 8, h / 4);
- c.end();
- c.stroke();
- };
- // Replaces existing actor shape
- mxCellRenderer.prototype.defaultShapes['umlControl'] = UmlControlShape;
- // UML Lifeline Shape
- function UmlLifeline()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(UmlLifeline, mxRectangleShape);
- UmlLifeline.prototype.size = 40;
- UmlLifeline.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- UmlLifeline.prototype.getLabelBounds = function(rect)
- {
- var size = Math.max(0, Math.min(rect.height, parseFloat(mxUtils.getValue(this.style, 'size', this.size)) * this.scale));
-
- return new mxRectangle(rect.x, rect.y, rect.width, size);
- };
- UmlLifeline.prototype.paintBackground = function(c, x, y, w, h)
- {
- var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var participant = mxUtils.getValue(this.style, 'participant');
-
- if (participant == null || this.state == null)
- {
- mxRectangleShape.prototype.paintBackground.call(this, c, x, y, w, size);
- }
- else
- {
- var ctor = this.state.view.graph.cellRenderer.getShape(participant);
-
- if (ctor != null && ctor != UmlLifeline)
- {
- var shape = new ctor();
- shape.apply(this.state);
- c.save();
- shape.paintVertexShape(c, x, y, w, size);
- c.restore();
- }
- }
-
- if (size < h)
- {
- c.setDashed(true);
- c.begin();
- c.moveTo(x + w / 2, y + size);
- c.lineTo(x + w / 2, y + h);
- c.end();
- c.stroke();
- }
- };
- UmlLifeline.prototype.paintForeground = function(c, x, y, w, h)
- {
- var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- mxRectangleShape.prototype.paintForeground.call(this, c, x, y, w, Math.min(h, size));
- };
- mxCellRenderer.prototype.defaultShapes['umlLifeline'] = UmlLifeline;
-
- // UML Frame Shape
- function UmlFrame()
- {
- mxShape.call(this);
- };
- mxUtils.extend(UmlFrame, mxShape);
- UmlFrame.prototype.width = 60;
- UmlFrame.prototype.height = 30;
- UmlFrame.prototype.corner = 10;
- UmlFrame.prototype.getLabelBounds = function(rect)
- {
- var w = Math.max(0, Math.min(rect.width, parseFloat(mxUtils.getValue(this.style, 'width', this.width)) * this.scale));
- var h = Math.max(0, Math.min(rect.height, parseFloat(mxUtils.getValue(this.style, 'height', this.height)) * this.scale));
-
- return new mxRectangle(rect.x, rect.y, w, h);
- };
- UmlFrame.prototype.paintBackground = function(c, x, y, w, h)
- {
- var co = this.corner;
- var w0 = Math.min(w, Math.max(co, parseFloat(mxUtils.getValue(this.style, 'width', this.width))));
- var h0 = Math.min(h, Math.max(co * 1.5, parseFloat(mxUtils.getValue(this.style, 'height', this.height))));
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x + w0, y);
- c.lineTo(x + w0, y + Math.max(0, h0 - co * 1.5));
- c.lineTo(x + Math.max(0, w0 - co), y + h0);
- c.lineTo(x, y + h0);
- c.close();
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(x + w0, y);
- c.lineTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.lineTo(x, y + h);
- c.lineTo(x, y + h0);
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['umlFrame'] = UmlFrame;
-
- mxPerimeter.LifelinePerimeter = function (bounds, vertex, next, orthogonal)
- {
- var size = UmlLifeline.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size) * vertex.view.scale;
- }
-
- var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1;
- if (next.x < bounds.getCenterX())
- {
- sw += 1;
- sw *= -1;
- }
-
- return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height,
- Math.max(bounds.y + size, next.y)));
- };
-
- mxStyleRegistry.putValue('lifelinePerimeter', mxPerimeter.LifelinePerimeter);
-
- mxPerimeter.OrthogonalPerimeter = function (bounds, vertex, next, orthogonal)
- {
- orthogonal = true;
-
- return mxPerimeter.RectanglePerimeter.apply(this, arguments);
- };
-
- mxStyleRegistry.putValue('orthogonalPerimeter', mxPerimeter.OrthogonalPerimeter);
- mxPerimeter.BackbonePerimeter = function (bounds, vertex, next, orthogonal)
- {
- var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1;
-
- if (vertex.style['backboneSize'] != null)
- {
- sw += (parseFloat(vertex.style['backboneSize']) * vertex.view.scale / 2) - 1;
- }
-
- if (vertex.style[mxConstants.STYLE_DIRECTION] == 'south' ||
- vertex.style[mxConstants.STYLE_DIRECTION] == 'north')
- {
- if (next.x < bounds.getCenterX())
- {
- sw += 1;
- sw *= -1;
- }
-
- return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height,
- Math.max(bounds.y, next.y)));
- }
- else
- {
- if (next.y < bounds.getCenterY())
- {
- sw += 1;
- sw *= -1;
- }
-
- return new mxPoint(Math.min(bounds.x + bounds.width, Math.max(bounds.x, next.x)),
- bounds.getCenterY() + sw);
- }
- };
-
- mxStyleRegistry.putValue('backbonePerimeter', mxPerimeter.BackbonePerimeter);
-
- mxPerimeter.lineIntersection = function (line1Start, line1End, line2Start, line2End)
- {
- // if the lines intersect, the result contains the the
- // intersection point if both line segment 1 and line segment 2 contain the point
- // null otherwise
- var denominator = ((line2End.y - line2Start.y) * (line1End.x - line1Start.x))
- - ((line2End.x - line2Start.x) * (line1End.y - line1Start.y));
-
- if (denominator == 0) //parallel?
- {
- return null;
- }
- else
- {
- var a = line1Start.y - line2Start.y;
- var b = line1Start.x - line2Start.x;
- var numerator1 = ((line2End.x - line2Start.x) * a) - ((line2End.y - line2Start.y) * b);
- var numerator2 = ((line1End.x - line1Start.x) * a) - ((line1End.y - line1Start.y) * b);
- a = numerator1 / denominator;
- b = numerator2 / denominator;
- // if we cast these lines infinitely in both directions, they intersect here:
- var x = line1Start.x + (a * (line1End.x - line1Start.x));
- var y = line1Start.y + (a * (line1End.y - line1Start.y));
- if (a >= 0 && a <= 1)// on line1?
- {
- var dx = line2End.x - x;
- var dy = line2End.y - y;
- var d = Math.sqrt(dy * dy + dx * dx); //distance from end of line 2 (next) to intersection point
- return {dist: d, p: new mxPoint(x, y)};
- }
- else
- {
- return null;
- }
- }
- };
- mxPerimeter.getPerimeterPoint = function (points, center, point)
- {
- var min = false;
-
- for (var i = 0; i < points.length - 1; i++)
- {
- var ip = mxPerimeter.lineIntersection(points[i], points[i + 1], center, point);
-
- if (ip != null && (!min || min.dist > ip.dist))
- {
- min = ip;
- }
- }
-
- return min.p;
- };
- //Parallelogram Perimeter
- mxPerimeter.ParallelogramPerimeter = function (bounds, vertex, next, orthogonal)
- {
- var size = ParallelogramShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
- var vertical = direction == mxConstants.DIRECTION_NORTH
- || direction == mxConstants.DIRECTION_SOUTH;
-
- var points;
-
- if (vertical)
- {
- var dy = h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w, y + dy),
- new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y)];
- }
- else
- {
- var dx = w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w, y),
- new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)];
- }
-
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- p1.y = next.y;
- else
- p1.x = next.x;
- }
-
- return mxPerimeter.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('parallelogramPerimeter', mxPerimeter.ParallelogramPerimeter);
-
- //Trapezoid Perimeter
- mxPerimeter.TrapezoidPerimeter = function (bounds, vertex, next, orthogonal)
- {
- var size = TrapezoidShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
-
- var points;
-
- if (direction == mxConstants.DIRECTION_EAST)
- {
- var dx = w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y),
- new mxPoint(x + w, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)];
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- var dx = w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w, y),
- new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h), new mxPoint(x, y)];
- }
- else if (direction == mxConstants.DIRECTION_NORTH)
- {
- var dy = h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y + dy), new mxPoint(x + w, y),
- new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y + dy)];
- }
- else
- {
- var dy = h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w, y + dy),
- new mxPoint(x + w, y + h - dy), new mxPoint(x, y + h), new mxPoint(x, y)];
- }
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- p1.y = next.y;
- else
- p1.x = next.x;
- }
- return mxPerimeter.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('trapezoidPerimeter', mxPerimeter.TrapezoidPerimeter);
-
- //Step Perimeter
- mxPerimeter.StepPerimeter = function (bounds, vertex, next, orthogonal)
- {
- var size = StepShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
-
- var points;
-
- if (direction == mxConstants.DIRECTION_EAST)
- {
- var dx = w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy),
- new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h),
- new mxPoint(x + dx, cy), new mxPoint(x, y)];
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- var dx = w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w, y), new mxPoint(x + w - dx, cy),
- new mxPoint(x + w, y + h), new mxPoint(x + dx, y + h),
- new mxPoint(x, cy), new mxPoint(x + dx, y)];
- }
- else if (direction == mxConstants.DIRECTION_NORTH)
- {
- var dy = h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y + dy), new mxPoint(cx, y), new mxPoint(x + w, y + dy),
- new mxPoint(x + w, y + h), new mxPoint(cx, y + h - dy),
- new mxPoint(x, y + h), new mxPoint(x, y + dy)];
- }
- else
- {
- var dy = h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x, y), new mxPoint(cx, y + dy), new mxPoint(x + w, y),
- new mxPoint(x + w, y + h - dy), new mxPoint(cx, y + h),
- new mxPoint(x, y + h - dy), new mxPoint(x, y)];
- }
-
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- p1.y = next.y;
- else
- p1.x = next.x;
- }
-
- return mxPerimeter.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('stepPerimeter', mxPerimeter.StepPerimeter);
-
- //Hexagon Perimeter (keep existing one)
- mxPerimeter.HexagonPerimeter2 = function (bounds, vertex, next, orthogonal)
- {
- var size = HexagonShape.prototype.size;
-
- if (vertex != null)
- {
- size = mxUtils.getValue(vertex.style, 'size', size);
- }
-
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var cx = bounds.getCenterX();
- var cy = bounds.getCenterY();
-
- var direction = (vertex != null) ? mxUtils.getValue(
- vertex.style, mxConstants.STYLE_DIRECTION,
- mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
- var vertical = direction == mxConstants.DIRECTION_NORTH
- || direction == mxConstants.DIRECTION_SOUTH;
-
- var points;
-
- if (vertical)
- {
- var dy = h * Math.max(0, Math.min(1, size));
- points = [new mxPoint(cx, y), new mxPoint(x + w, y + dy), new mxPoint(x + w, y + h - dy),
- new mxPoint(cx, y + h), new mxPoint(x, y + h - dy),
- new mxPoint(x, y + dy), new mxPoint(cx, y)];
- }
- else
- {
- var dx = w * Math.max(0, Math.min(1, size));
- points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy),
- new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h),
- new mxPoint(x, cy), new mxPoint(x + dx, y)];
- }
- var p1 = new mxPoint(cx, cy);
-
- if (orthogonal)
- {
- if (next.x < x || next.x > x + w)
- p1.y = next.y;
- else
- p1.x = next.x;
- }
-
- return mxPerimeter.getPerimeterPoint(points, p1, next);
- };
-
- mxStyleRegistry.putValue('hexagonPerimeter2', mxPerimeter.HexagonPerimeter2);
-
- // Lollipop Shape
- function LollipopShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(LollipopShape, mxShape);
- LollipopShape.prototype.size = 10;
- LollipopShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
- c.translate(x, y);
-
- c.ellipse((w - sz) / 2, 0, sz, sz);
- c.fillAndStroke();
- c.begin();
- c.moveTo(w / 2, sz);
- c.lineTo(w / 2, h);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['lollipop'] = LollipopShape;
- // Lollipop Shape
- function RequiresShape()
- {
- mxShape.call(this);
- };
- mxUtils.extend(RequiresShape, mxShape);
- RequiresShape.prototype.size = 10;
- RequiresShape.prototype.inset = 2;
- RequiresShape.prototype.paintBackground = function(c, x, y, w, h)
- {
- var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
- var inset = parseFloat(mxUtils.getValue(this.style, 'inset', this.inset)) + this.strokewidth;
- c.translate(x, y);
- c.begin();
- c.moveTo(w / 2, sz + inset);
- c.lineTo(w / 2, h);
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo((w - sz) / 2 - inset, sz / 2);
- c.quadTo((w - sz) / 2 - inset, sz + inset, w / 2, sz + inset);
- c.quadTo((w + sz) / 2 + inset, sz + inset, (w + sz) / 2 + inset, sz / 2);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['requires'] = RequiresShape;
-
- // Component shape
- function ComponentShape()
- {
- mxCylinder.call(this);
- };
- mxUtils.extend(ComponentShape, mxCylinder);
- ComponentShape.prototype.jettyWidth = 32;
- ComponentShape.prototype.jettyHeight = 12;
- ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
- {
- var dx = parseFloat(mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth));
- var dy = parseFloat(mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight));
- var x0 = dx / 2;
- var x1 = x0 + dx / 2;
- var y0 = 0.3 * h - dy / 2;
- var y1 = 0.7 * h - dy / 2;
- if (isForeground)
- {
- path.moveTo(x0, y0);
- path.lineTo(x1, y0);
- path.lineTo(x1, y0 + dy);
- path.lineTo(x0, y0 + dy);
- path.moveTo(x0, y1);
- path.lineTo(x1, y1);
- path.lineTo(x1, y1 + dy);
- path.lineTo(x0, y1 + dy);
- path.end();
- }
- else
- {
- path.moveTo(x0, 0);
- path.lineTo(w, 0);
- path.lineTo(w, h);
- path.lineTo(x0, h);
- path.lineTo(x0, y1 + dy);
- path.lineTo(0, y1 + dy);
- path.lineTo(0, y1);
- path.lineTo(x0, y1);
- path.lineTo(x0, y0 + dy);
- path.lineTo(0, y0 + dy);
- path.lineTo(0, y0);
- path.lineTo(x0, y0);
- path.close();
- path.end();
- }
- };
- mxCellRenderer.prototype.defaultShapes['component'] = ComponentShape;
-
- // State Shapes derives from double ellipse
- function StateShape()
- {
- mxDoubleEllipse.call(this);
- };
- mxUtils.extend(StateShape, mxDoubleEllipse);
- StateShape.prototype.outerStroke = true;
- StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- var inset = Math.min(4, Math.min(w / 5, h / 5));
-
- if (w > 0 && h > 0)
- {
- c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
- c.fillAndStroke();
- }
-
- c.setShadow(false);
- if (this.outerStroke)
- {
- c.ellipse(x, y, w, h);
- c.stroke();
- }
- };
- mxCellRenderer.prototype.defaultShapes['endState'] = StateShape;
- function StartStateShape()
- {
- StateShape.call(this);
- };
- mxUtils.extend(StartStateShape, StateShape);
- StartStateShape.prototype.outerStroke = false;
-
- mxCellRenderer.prototype.defaultShapes['startState'] = StartStateShape;
- // Link shape
- function LinkShape()
- {
- mxArrowConnector.call(this);
- this.spacing = 0;
- };
- mxUtils.extend(LinkShape, mxArrowConnector);
- LinkShape.prototype.defaultWidth = 4;
-
- LinkShape.prototype.isOpenEnded = function()
- {
- return true;
- };
- LinkShape.prototype.getEdgeWidth = function()
- {
- return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1);
- };
-
- LinkShape.prototype.isArrowRounded = function()
- {
- return this.isRounded;
- };
- // Registers the link shape
- mxCellRenderer.prototype.defaultShapes['link'] = LinkShape;
- // Generic arrow
- function FlexArrowShape()
- {
- mxArrowConnector.call(this);
- this.spacing = 0;
- };
- mxUtils.extend(FlexArrowShape, mxArrowConnector);
- FlexArrowShape.prototype.defaultWidth = 10;
- FlexArrowShape.prototype.defaultArrowWidth = 20;
- FlexArrowShape.prototype.getStartArrowWidth = function()
- {
- return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'startWidth', this.defaultArrowWidth);
- };
- FlexArrowShape.prototype.getEndArrowWidth = function()
- {
- return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'endWidth', this.defaultArrowWidth);;
- };
- FlexArrowShape.prototype.getEdgeWidth = function()
- {
- return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1);
- };
-
- // Registers the link shape
- mxCellRenderer.prototype.defaultShapes['flexArrow'] = FlexArrowShape;
-
- // Manual Input shape
- function ManualInputShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(ManualInputShape, mxActor);
- ManualInputShape.prototype.size = 30;
- ManualInputShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h), new mxPoint(0, s), new mxPoint(w, 0), new mxPoint(w, h)],
- this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['manualInput'] = ManualInputShape;
- // Internal storage
- function InternalStorageShape()
- {
- mxRectangleShape.call(this);
- };
- mxUtils.extend(InternalStorageShape, mxRectangleShape);
- InternalStorageShape.prototype.dx = 20;
- InternalStorageShape.prototype.dy = 20;
- InternalStorageShape.prototype.isHtmlAllowed = function()
- {
- return false;
- };
- InternalStorageShape.prototype.paintForeground = function(c, x, y, w, h)
- {
- mxRectangleShape.prototype.paintForeground.apply(this, arguments);
- var inset = 0;
-
- if (this.isRounded)
- {
- var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
- mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- inset = Math.max(inset, Math.min(w * f, h * f));
- }
-
- var dx = Math.max(inset, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(inset, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
-
- c.begin();
- c.moveTo(x, y + dy);
- c.lineTo(x + w, y + dy);
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo(x + dx, y);
- c.lineTo(x + dx, y + h);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['internalStorage'] = InternalStorageShape;
- // Internal storage
- function CornerShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CornerShape, mxActor);
- CornerShape.prototype.dx = 20;
- CornerShape.prototype.dy = 20;
-
- // Corner
- CornerShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
-
- var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint(dx, dy),
- new mxPoint(dx, h), new mxPoint(0, h)], this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['corner'] = CornerShape;
- // Crossbar shape
- function CrossbarShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CrossbarShape, mxActor);
-
- CrossbarShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.moveTo(0, 0);
- c.lineTo(0, h);
- c.end();
-
- c.moveTo(w, 0);
- c.lineTo(w, h);
- c.end();
-
- c.moveTo(0, h / 2);
- c.lineTo(w, h / 2);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['crossbar'] = CrossbarShape;
- // Internal storage
- function TeeShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(TeeShape, mxActor);
- TeeShape.prototype.dx = 20;
- TeeShape.prototype.dy = 20;
-
- // Corner
- TeeShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
- var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
- var w2 = Math.abs(w - dx) / 2;
-
- var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint((w + dx) / 2, dy),
- new mxPoint((w + dx) / 2, h), new mxPoint((w - dx) / 2, h), new mxPoint((w - dx) / 2, dy),
- new mxPoint(0, dy)], this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['tee'] = TeeShape;
- // Arrow
- function SingleArrowShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(SingleArrowShape, mxActor);
- SingleArrowShape.prototype.arrowWidth = 0.3;
- SingleArrowShape.prototype.arrowSize = 0.2;
- SingleArrowShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', this.arrowWidth))));
- var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', this.arrowSize))));
- var at = (h - aw) / 2;
- var ab = at + aw;
-
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, at), new mxPoint(w - as, at), new mxPoint(w - as, 0), new mxPoint(w, h / 2),
- new mxPoint(w - as, h), new mxPoint(w - as, ab), new mxPoint(0, ab)],
- this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['singleArrow'] = SingleArrowShape;
- // Arrow
- function DoubleArrowShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DoubleArrowShape, mxActor);
- DoubleArrowShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth))));
- var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', SingleArrowShape.prototype.arrowSize))));
- var at = (h - aw) / 2;
- var ab = at + aw;
-
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, h / 2), new mxPoint(as, 0), new mxPoint(as, at), new mxPoint(w - as, at),
- new mxPoint(w - as, 0), new mxPoint(w, h / 2), new mxPoint(w - as, h),
- new mxPoint(w - as, ab), new mxPoint(as, ab), new mxPoint(as, h)],
- this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['doubleArrow'] = DoubleArrowShape;
- // Data storage
- function DataStorageShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DataStorageShape, mxActor);
- DataStorageShape.prototype.size = 0.1;
- DataStorageShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- c.moveTo(s, 0);
- c.lineTo(w, 0);
- c.quadTo(w - s * 2, h / 2, w, h);
- c.lineTo(s, h);
- c.quadTo(s - s * 2, h / 2, s, 0);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['dataStorage'] = DataStorageShape;
- // Or
- function OrShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(OrShape, mxActor);
- OrShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.moveTo(0, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, 0, h);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['or'] = OrShape;
- // Xor
- function XorShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(XorShape, mxActor);
- XorShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- c.moveTo(0, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, 0, h);
- c.quadTo(w / 2, h / 2, 0, 0);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['xor'] = XorShape;
- // Loop limit
- function LoopLimitShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(LoopLimitShape, mxActor);
- LoopLimitShape.prototype.size = 20;
- LoopLimitShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, s * 0.8), new mxPoint(w, h),
- new mxPoint(0, h), new mxPoint(0, s * 0.8)], this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['loopLimit'] = LoopLimitShape;
- // Off page connector
- function OffPageConnectorShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(OffPageConnectorShape, mxActor);
- OffPageConnectorShape.prototype.size = 3 / 8;
- OffPageConnectorShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var s = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
- this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s), new mxPoint(w / 2, h),
- new mxPoint(0, h - s)], this.isRounded, arcSize, true);
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['offPageConnector'] = OffPageConnectorShape;
- // Internal storage
- function TapeDataShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(TapeDataShape, mxEllipse);
- TapeDataShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.begin();
- c.moveTo(x + w / 2, y + h);
- c.lineTo(x + w, y + h);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['tapeData'] = TapeDataShape;
- // OrEllipseShape
- function OrEllipseShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(OrEllipseShape, mxEllipse);
- OrEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.setShadow(false);
- c.begin();
- c.moveTo(x, y + h / 2);
- c.lineTo(x + w, y + h / 2);
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo(x + w / 2, y);
- c.lineTo(x + w / 2, y + h);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['orEllipse'] = OrEllipseShape;
- // SumEllipseShape
- function SumEllipseShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(SumEllipseShape, mxEllipse);
- SumEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
- var s2 = 0.145;
-
- c.setShadow(false);
- c.begin();
- c.moveTo(x + w * s2, y + h * s2);
- c.lineTo(x + w * (1 - s2), y + h * (1 - s2));
- c.end();
- c.stroke();
-
- c.begin();
- c.moveTo(x + w * (1 - s2), y + h * s2);
- c.lineTo(x + w * s2, y + h * (1 - s2));
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['sumEllipse'] = SumEllipseShape;
- // SortShape
- function SortShape()
- {
- mxRhombus.call(this);
- };
- mxUtils.extend(SortShape, mxRhombus);
- SortShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxRhombus.prototype.paintVertexShape.apply(this, arguments);
-
- c.setShadow(false);
- c.begin();
- c.moveTo(x, y + h / 2);
- c.lineTo(x + w, y + h / 2);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['sortShape'] = SortShape;
- // CollateShape
- function CollateShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(CollateShape, mxEllipse);
- CollateShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x + w, y);
- c.lineTo(x + w / 2, y + h / 2);
- c.close();
- c.fillAndStroke();
-
- c.begin();
- c.moveTo(x, y + h);
- c.lineTo(x + w, y + h);
- c.lineTo(x + w / 2, y + h / 2);
- c.close();
- c.fillAndStroke();
- };
- mxCellRenderer.prototype.defaultShapes['collate'] = CollateShape;
- // DimensionShape
- function DimensionShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(DimensionShape, mxEllipse);
- DimensionShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- // Arrow size
- var al = 10;
- var cy = y + h - al / 2;
-
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x, y + h);
- c.moveTo(x, cy);
- c.lineTo(x + al, cy - al / 2);
- c.moveTo(x, cy);
- c.lineTo(x + al, cy + al / 2);
- c.moveTo(x, cy);
- c.lineTo(x + w, cy);
- // Opposite side
- c.moveTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.moveTo(x + w, cy);
- c.lineTo(x + w - al, cy - al / 2);
- c.moveTo(x + w, cy);
- c.lineTo(x + w - al, cy + al / 2);
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['dimension'] = DimensionShape;
- // PartialRectangleShape
- function PartialRectangleShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(PartialRectangleShape, mxEllipse);
- PartialRectangleShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- if (!this.outline)
- {
- c.setStrokeColor(null);
- }
- mxRectangleShape.prototype.paintBackground.apply(this, arguments);
-
- if (this.style != null)
- {
- c.setStrokeColor(this.stroke);
- c.rect(x, y, w, h);
- c.fill();
-
- if (mxUtils.getValue(this.style, 'top', '1') == '1')
- {
- c.begin();
- c.moveTo(x, y);
- c.lineTo(x + w, y);
- c.end();
- c.stroke();
- }
-
- if (mxUtils.getValue(this.style, 'right', '1') == '1')
- {
- c.begin();
- c.moveTo(x + w, y);
- c.lineTo(x + w, y + h);
- c.end();
- c.stroke();
- }
-
- if (mxUtils.getValue(this.style, 'bottom', '1') == '1')
- {
- c.begin();
- c.moveTo(x + w, y + h);
- c.lineTo(x, y + h);
- c.end();
- c.stroke();
- }
-
- if (mxUtils.getValue(this.style, 'left', '1') == '1')
- {
- c.begin();
- c.moveTo(x, y + h);
- c.lineTo(x, y);
- c.end();
- c.stroke();
- }
- }
- };
- mxCellRenderer.prototype.defaultShapes['partialRectangle'] = PartialRectangleShape;
- // LineEllipseShape
- function LineEllipseShape()
- {
- mxEllipse.call(this);
- };
- mxUtils.extend(LineEllipseShape, mxEllipse);
- LineEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
- {
- mxEllipse.prototype.paintVertexShape.apply(this, arguments);
-
- c.setShadow(false);
- c.begin();
-
- if (mxUtils.getValue(this.style, 'line') == 'vertical')
- {
- c.moveTo(x + w / 2, y);
- c.lineTo(x + w / 2, y + h);
- }
- else
- {
- c.moveTo(x, y + h / 2);
- c.lineTo(x + w, y + h / 2);
- }
- c.end();
- c.stroke();
- };
- mxCellRenderer.prototype.defaultShapes['lineEllipse'] = LineEllipseShape;
- // Delay
- function DelayShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DelayShape, mxActor);
- DelayShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.min(w, h / 2);
- c.moveTo(0, 0);
- c.lineTo(w - dx, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, w - dx, h);
- c.lineTo(0, h);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['delay'] = DelayShape;
- // Cross Shape
- function CrossShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(CrossShape, mxActor);
- CrossShape.prototype.size = 0.2;
- CrossShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var m = Math.min(h, w);
- var size = Math.max(0, Math.min(m, m * parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
- var t = (h - size) / 2;
- var b = t + size;
- var l = (w - size) / 2;
- var r = l + size;
-
- c.moveTo(0, t);
- c.lineTo(l, t);
- c.lineTo(l, 0);
- c.lineTo(r, 0);
- c.lineTo(r, t);
- c.lineTo(w, t);
- c.lineTo(w, b);
- c.lineTo(r, b);
- c.lineTo(r, h);
- c.lineTo(l, h);
- c.lineTo(l, b);
- c.lineTo(0, b);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['cross'] = CrossShape;
- // Display
- function DisplayShape()
- {
- mxActor.call(this);
- };
- mxUtils.extend(DisplayShape, mxActor);
- DisplayShape.prototype.size = 0.25;
- DisplayShape.prototype.redrawPath = function(c, x, y, w, h)
- {
- var dx = Math.min(w, h / 2);
- var s = Math.min(w - dx, Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size))) * w);
-
- c.moveTo(0, h / 2);
- c.lineTo(s, 0);
- c.lineTo(w - dx, 0);
- c.quadTo(w, 0, w, h / 2);
- c.quadTo(w, h, w - dx, h);
- c.lineTo(s, h);
- c.close();
- c.end();
- };
- mxCellRenderer.prototype.defaultShapes['display'] = DisplayShape;
-
- // FilledEdge shape
- function FilledEdge()
- {
- mxConnector.call(this);
- };
- mxUtils.extend(FilledEdge, mxConnector);
-
- FilledEdge.prototype.origPaintEdgeShape = FilledEdge.prototype.paintEdgeShape;
- FilledEdge.prototype.paintEdgeShape = function(c, pts, rounded)
- {
- //paintEdgeShape reset dashed to false
- var dashed = c.state.dashed;
- var fixDash = c.state.fixDash;
-
- FilledEdge.prototype.origPaintEdgeShape.apply(this, arguments);
- if (c.state.strokeWidth >= 3)
- {
- var fillClr = mxUtils.getValue(this.style, 'fillColor', null);
-
- if (fillClr != null)
- {
- c.setStrokeColor(fillClr);
- c.setStrokeWidth(c.state.strokeWidth - 2);
- c.setDashed(dashed, fixDash);
-
- FilledEdge.prototype.origPaintEdgeShape.apply(this, arguments);
- }
- }
- };
- // Registers the link shape
- mxCellRenderer.prototype.defaultShapes['filledEdge'] = FilledEdge;
-
- // Registers and defines the custom marker
- mxMarker.addMarker('dash', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var nx = unitX * (size + sw + 1);
- var ny = unitY * (size + sw + 1);
- return function()
- {
- c.begin();
- c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
- c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
- c.stroke();
- };
- });
- // Registers and defines the custom marker
- mxMarker.addMarker('cross', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var nx = unitX * (size + sw + 1);
- var ny = unitY * (size + sw + 1);
- return function()
- {
- c.begin();
- c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
- c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
- c.moveTo(pe.x - nx / 2 + ny / 2, pe.y - ny / 2 - nx / 2);
- c.lineTo(pe.x - ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 + nx / 2);
- c.stroke();
- };
- });
-
- function circleMarker(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var a = size / 2;
- var size = size + sw;
- var pt = pe.clone();
-
- pe.x -= unitX * (2 * size + sw);
- pe.y -= unitY * (2 * size + sw);
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
- return function()
- {
- c.ellipse(pt.x - unitX - size, pt.y - unitY - size, 2 * size, 2 * size);
-
- if (filled)
- {
- c.fillAndStroke();
- }
- else
- {
- c.stroke();
- }
- };
- };
-
- mxMarker.addMarker('circle', circleMarker);
- mxMarker.addMarker('circlePlus', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- var pt = pe.clone();
- var fn = circleMarker.apply(this, arguments);
- var nx = unitX * (size + 2 * sw); // (size + sw + 1);
- var ny = unitY * (size + 2 * sw); //(size + sw + 1);
- return function()
- {
- fn.apply(this, arguments);
- c.begin();
- c.moveTo(pt.x - unitX * (sw), pt.y - unitY * (sw));
- c.lineTo(pt.x - 2 * nx + unitX * (sw), pt.y - 2 * ny + unitY * (sw));
- c.moveTo(pt.x - nx - ny + unitY * sw, pt.y - ny + nx - unitX * sw);
- c.lineTo(pt.x + ny - nx - unitY * sw, pt.y - ny - nx + unitX * sw);
- c.stroke();
- };
- });
-
- mxMarker.addMarker('async', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
- // only half the strokewidth is processed ).
- var endOffsetX = unitX * sw * 1.118;
- var endOffsetY = unitY * sw * 1.118;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
- var pt = pe.clone();
- pt.x -= endOffsetX;
- pt.y -= endOffsetY;
-
- var f = 1;
- pe.x += -unitX * f - endOffsetX;
- pe.y += -unitY * f - endOffsetY;
-
- return function()
- {
- c.begin();
- c.moveTo(pt.x, pt.y);
-
- if (source)
- {
- c.lineTo(pt.x - unitX - unitY / 2, pt.y - unitY + unitX / 2);
- }
- else
- {
- c.lineTo(pt.x + unitY / 2 - unitX, pt.y - unitY - unitX / 2);
- }
-
- c.lineTo(pt.x - unitX, pt.y - unitY);
- c.close();
- if (filled)
- {
- c.fillAndStroke();
- }
- else
- {
- c.stroke();
- }
- };
- });
-
- function createOpenAsyncArrow(widthFactor)
- {
- widthFactor = (widthFactor != null) ? widthFactor : 2;
-
- return function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- var pt = pe.clone();
- return function()
- {
- c.begin();
- c.moveTo(pt.x, pt.y);
-
- if (source)
- {
- c.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor);
- }
- else
- {
- c.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor);
- }
-
- c.stroke();
- };
- }
- };
-
- mxMarker.addMarker('openAsync', createOpenAsyncArrow(2));
-
- function arrow(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
- // only half the strokewidth is processed ).
- var endOffsetX = unitX * sw * 1.118;
- var endOffsetY = unitY * sw * 1.118;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
- var pt = pe.clone();
- pt.x -= endOffsetX;
- pt.y -= endOffsetY;
-
- var f = (type != mxConstants.ARROW_CLASSIC && type != mxConstants.ARROW_CLASSIC_THIN) ? 1 : 3 / 4;
- pe.x += -unitX * f - endOffsetX;
- pe.y += -unitY * f - endOffsetY;
-
- return function()
- {
- canvas.begin();
- canvas.moveTo(pt.x, pt.y);
- canvas.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor);
-
- if (type == mxConstants.ARROW_CLASSIC || type == mxConstants.ARROW_CLASSIC_THIN)
- {
- canvas.lineTo(pt.x - unitX * 3 / 4, pt.y - unitY * 3 / 4);
- }
-
- canvas.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor);
- canvas.close();
- if (filled)
- {
- canvas.fillAndStroke();
- }
- else
- {
- canvas.stroke();
- }
- };
- }
-
- // Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
- if (typeof mxVertexHandler !== 'undefined')
- {
- function createHandle(state, keys, getPositionFn, setPositionFn, ignoreGrid, redrawEdges)
- {
- var handle = new mxHandle(state, null, mxVertexHandler.prototype.secondaryHandleImage);
-
- handle.execute = function()
- {
- for (var i = 0; i < keys.length; i++)
- {
- this.copyStyle(keys[i]);
- }
- };
-
- handle.getPosition = getPositionFn;
- handle.setPosition = setPositionFn;
- handle.ignoreGrid = (ignoreGrid != null) ? ignoreGrid : true;
-
- // Overridden to update connected edges
- if (redrawEdges)
- {
- var positionChanged = handle.positionChanged;
-
- handle.positionChanged = function()
- {
- positionChanged.apply(this, arguments);
-
- // Redraws connected edges TODO: Include child edges
- state.view.invalidate(this.state.cell);
- state.view.validate();
- };
- }
-
- return handle;
- };
-
- function createArcHandle(state, yOffset)
- {
- return createHandle(state, [mxConstants.STYLE_ARCSIZE], function(bounds)
- {
- var arcSize = Math.max(0, parseFloat(mxUtils.getValue(state.style,
- mxConstants.STYLE_ARCSIZE, mxConstants.RECTANGLE_ROUNDING_FACTOR * 100))) / 100;
- var tmp = (yOffset != null) ? yOffset : bounds.height / 8;
-
- return new mxPoint(bounds.x + bounds.width - Math.min(Math.max(bounds.width / 2, bounds.height / 2),
- Math.min(bounds.width, bounds.height) * arcSize), bounds.y + tmp);
- }, function(bounds, pt, me)
- {
- var f = Math.min(50, Math.max(0, (bounds.width - pt.x + bounds.x) * 100 /
- Math.min(bounds.width, bounds.height)));
- this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(f);
- });
- }
- function createArcHandleFunction()
- {
- return function(state)
- {
- var handles = [];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createTrapezoidHandleFunction(max)
- {
- return function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(max, parseFloat(mxUtils.getValue(this.state.style, 'size', TrapezoidShape.prototype.size))));
-
- return new mxPoint(bounds.x + size * bounds.width * 0.75, bounds.y + bounds.height / 4);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(max, (pt.x - bounds.x) / (bounds.width * 0.75)));
- }, null, true)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createDisplayHandleFunction(defaultValue, allowArcHandle, max, redrawEdges)
- {
- max = (max != null) ? max : 1;
-
- return function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = parseFloat(mxUtils.getValue(this.state.style, 'size', defaultValue));
-
- return new mxPoint(bounds.x + size * bounds.width, bounds.getCenterY());
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(max, (pt.x - bounds.x) / bounds.width));
- }, null, redrawEdges)];
-
- if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createCubeHandleFunction(factor, defaultValue, allowArcHandle)
- {
- return function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
- mxUtils.getValue(this.state.style, 'size', defaultValue))))) * factor;
-
- return new mxPoint(bounds.x + size, bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, pt.x - bounds.x),
- Math.min(bounds.height, pt.y - bounds.y))) / factor);
- })];
-
- if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- };
- };
-
- function createArrowHandleFunction(maxSize)
- {
- return function(state)
- {
- return [createHandle(state, ['arrowWidth', 'arrowSize'], function(bounds)
- {
- var aw = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth)));
- var as = Math.max(0, Math.min(maxSize, mxUtils.getValue(this.state.style, 'arrowSize', SingleArrowShape.prototype.arrowSize)));
-
- return new mxPoint(bounds.x + (1 - as) * bounds.width, bounds.y + (1 - aw) * bounds.height / 2);
- }, function(bounds, pt)
- {
- this.state.style['arrowWidth'] = Math.max(0, Math.min(1, Math.abs(bounds.y + bounds.height / 2 - pt.y) / bounds.height * 2));
- this.state.style['arrowSize'] = Math.max(0, Math.min(maxSize, (bounds.x + bounds.width - pt.x) / (bounds.width)));
- })];
- };
- };
-
- function createEdgeHandle(state, keys, start, getPosition, setPosition)
- {
- var pts = state.absolutePoints;
- var n = pts.length - 1;
-
- var tr = state.view.translate;
- var s = state.view.scale;
-
- var p0 = (start) ? pts[0] : pts[n];
- var p1 = (start) ? pts[1] : pts[n - 1];
- var dx = (start) ? p1.x - p0.x : p1.x - p0.x;
- var dy = (start) ? p1.y - p0.y : p1.y - p0.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
-
- return createHandle(state, keys, function(bounds)
- {
- var pt = getPosition.call(this, dist, dx / dist, dy / dist, p0, p1);
-
- return new mxPoint(pt.x / s - tr.x, pt.y / s - tr.y);
- }, function(bounds, pt, me)
- {
- var dist = Math.sqrt(dx * dx + dy * dy);
- pt.x = (pt.x + tr.x) * s;
- pt.y = (pt.y + tr.y) * s;
- setPosition.call(this, dist, dx / dist, dy / dist, p0, p1, pt, me);
- });
- };
-
- function createEdgeWidthHandle(state, start, spacing)
- {
- return createEdgeHandle(state, ['width'], start, function(dist, nx, ny, p0, p1)
- {
- var w = state.shape.getEdgeWidth() * state.view.scale + spacing;
- return new mxPoint(p0.x + nx * dist / 4 + ny * w / 2, p0.y + ny * dist / 4 - nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- state.style['width'] = Math.round(w * 2) / state.view.scale - spacing;
- });
- };
-
- function ptLineDistance(x1, y1, x2, y2, x0, y0)
- {
- return Math.abs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1) / Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
- }
- var handleFactory = {
- 'link': function(state)
- {
- var spacing = 10;
- return [createEdgeWidthHandle(state, true, spacing), createEdgeWidthHandle(state, false, spacing)];
- },
- 'flexArrow': function(state)
- {
- // Do not use state.shape.startSize/endSize since it is cached
- var tol = state.view.graph.gridSize / state.view.scale;
- var handles = [];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE)
- {
- handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['width'] = Math.round(w * 2) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- }
- // Snaps to end geometry
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- }
- }
- }));
-
- handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getStartArrowWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['startWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- state.style['endWidth'] = state.style['startWidth'];
- }
-
- // Snaps to endWidth
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- }
-
- if (Math.abs(parseFloat(state.style['startWidth']) - parseFloat(state.style['endWidth'])) < tol)
- {
- state.style['startWidth'] = state.style['endWidth'];
- }
- }
- }));
- }
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE)
- {
- handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['width'] = Math.round(w * 2) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- }
-
- // Snaps to start geometry
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- }
- }
- }));
-
- handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1)
- {
- var w = (state.shape.getEndArrowWidth() - state.shape.strokewidth) * state.view.scale;
- var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
-
- return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2,
- p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2);
- }, function(dist, nx, ny, p0, p1, pt, me)
- {
- var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
- var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
-
- state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
- state.style['endWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
-
- // Applies to opposite side
- if (mxEvent.isControlDown(me.getEvent()))
- {
- state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
- state.style['startWidth'] = state.style['endWidth'];
- }
-
- // Snaps to start geometry
- if (!mxEvent.isAltDown(me.getEvent()))
- {
- if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6)
- {
- state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
- }
-
- if (Math.abs(parseFloat(state.style['endWidth']) - parseFloat(state.style['startWidth'])) < tol)
- {
- state.style['endWidth'] = state.style['startWidth'];
- }
- }
- }));
- }
-
- return handles;
- },
- 'swimlane': function(state)
- {
- var handles = [createHandle(state, [mxConstants.STYLE_STARTSIZE], function(bounds)
- {
- var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1)
- {
- return new mxPoint(bounds.getCenterX(), bounds.y + Math.max(0, Math.min(bounds.height, size)));
- }
- else
- {
- return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width, size)), bounds.getCenterY());
- }
- }, function(bounds, pt)
- {
- state.style[mxConstants.STYLE_STARTSIZE] =
- (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1) ?
- Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))) :
- Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
- })];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED))
- {
- var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
- handles.push(createArcHandle(state, size / 2));
- }
-
- return handles;
- },
- 'label': createArcHandleFunction(),
- 'ext': createArcHandleFunction(),
- 'rectangle': createArcHandleFunction(),
- 'triangle': createArcHandleFunction(),
- 'rhombus': createArcHandleFunction(),
- 'umlLifeline': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(this.state.style, 'size', UmlLifeline.prototype.size))));
-
- return new mxPoint(bounds.getCenterX(), bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
- },
- 'umlFrame': function(state)
- {
- var handles = [createHandle(state, ['width', 'height'], function(bounds)
- {
- var w0 = Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'width', UmlFrame.prototype.width)));
- var h0 = Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'height', UmlFrame.prototype.height)));
- return new mxPoint(bounds.x + w0, bounds.y + h0);
- }, function(bounds, pt)
- {
- this.state.style['width'] = Math.round(Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, pt.x - bounds.x)));
- this.state.style['height'] = Math.round(Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, pt.y - bounds.y)));
- }, false)];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'process': function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(0.5, parseFloat(mxUtils.getValue(this.state.style, 'size', ProcessShape.prototype.size))));
- return new mxPoint(bounds.x + bounds.width * size, bounds.y + bounds.height / 4);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(0.5, (pt.x - bounds.x) / bounds.width));
- })];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'cross': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var m = Math.min(bounds.width, bounds.height);
- var size = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'size', CrossShape.prototype.size))) * m / 2;
- return new mxPoint(bounds.getCenterX() - size, bounds.getCenterY() - size);
- }, function(bounds, pt)
- {
- var m = Math.min(bounds.width, bounds.height);
- this.state.style['size'] = Math.max(0, Math.min(1, Math.min((Math.max(0, bounds.getCenterY() - pt.y) / m) * 2,
- (Math.max(0, bounds.getCenterX() - pt.x) / m) * 2)));
- })];
- },
- 'note': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
- mxUtils.getValue(this.state.style, 'size', NoteShape.prototype.size)))));
-
- return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, bounds.x + bounds.width - pt.x),
- Math.min(bounds.height, pt.y - bounds.y))));
- })];
- },
- 'manualInput': function(state)
- {
- var handles = [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', ManualInputShape.prototype.size)));
-
- return new mxPoint(bounds.x + bounds.width / 4, bounds.y + size * 3 / 4);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, (pt.y - bounds.y) * 4 / 3)));
- })];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'dataStorage': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', DataStorageShape.prototype.size))));
- return new mxPoint(bounds.x + (1 - size) * bounds.width, bounds.getCenterY());
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, (bounds.x + bounds.width - pt.x) / bounds.width));
- })];
- },
- 'internalStorage': function(state)
- {
- var handles = [createHandle(state, ['dx', 'dy'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', InternalStorageShape.prototype.dx)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', InternalStorageShape.prototype.dy)));
- return new mxPoint(bounds.x + dx, bounds.y + dy);
- }, function(bounds, pt)
- {
- this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
- this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- })];
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- handles.push(createArcHandle(state));
- }
-
- return handles;
- },
- 'corner': function(state)
- {
- return [createHandle(state, ['dx', 'dy'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', CornerShape.prototype.dx)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', CornerShape.prototype.dy)));
- return new mxPoint(bounds.x + dx, bounds.y + dy);
- }, function(bounds, pt)
- {
- this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
- this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- })];
- },
- 'tee': function(state)
- {
- return [createHandle(state, ['dx', 'dy'], function(bounds)
- {
- var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', TeeShape.prototype.dx)));
- var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', TeeShape.prototype.dy)));
- return new mxPoint(bounds.x + (bounds.width + dx) / 2, bounds.y + dy);
- }, function(bounds, pt)
- {
- this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width / 2, (pt.x - bounds.x - bounds.width / 2)) * 2));
- this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- })];
- },
- 'singleArrow': createArrowHandleFunction(1),
- 'doubleArrow': createArrowHandleFunction(0.5),
- 'folder': function(state)
- {
- return [createHandle(state, ['tabWidth', 'tabHeight'], function(bounds)
- {
- var tw = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', FolderShape.prototype.tabWidth)));
- var th = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', FolderShape.prototype.tabHeight)));
-
- if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT)
- {
- tw = bounds.width - tw;
- }
-
- return new mxPoint(bounds.x + tw, bounds.y + th);
- }, function(bounds, pt)
- {
- var tw = Math.max(0, Math.min(bounds.width, pt.x - bounds.x));
-
- if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT)
- {
- tw = bounds.width - tw;
- }
-
- this.state.style['tabWidth'] = Math.round(tw);
- this.state.style['tabHeight'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
- })];
- },
- 'document': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', DocumentShape.prototype.size))));
- return new mxPoint(bounds.x + 3 * bounds.width / 4, bounds.y + (1 - size) * bounds.height);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height));
- })];
- },
- 'tape': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', TapeShape.prototype.size))));
- return new mxPoint(bounds.getCenterX(), bounds.y + size * bounds.height / 2);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
- })];
- },
- 'offPageConnector': function(state)
- {
- return [createHandle(state, ['size'], function(bounds)
- {
- var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', OffPageConnectorShape.prototype.size))));
- return new mxPoint(bounds.getCenterX(), bounds.y + (1 - size) * bounds.height);
- }, function(bounds, pt)
- {
- this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height));
- })];
- },
- 'step': createDisplayHandleFunction(StepShape.prototype.size, true, null, true),
- 'hexagon': createDisplayHandleFunction(HexagonShape.prototype.size, true, 0.5, true),
- 'curlyBracket': createDisplayHandleFunction(CurlyBracketShape.prototype.size, false),
- 'display': createDisplayHandleFunction(DisplayShape.prototype.size, false),
- 'cube': createCubeHandleFunction(1, CubeShape.prototype.size, false),
- 'card': createCubeHandleFunction(0.5, CardShape.prototype.size, true),
- 'loopLimit': createCubeHandleFunction(0.5, LoopLimitShape.prototype.size, true),
- 'trapezoid': createTrapezoidHandleFunction(0.5),
- 'parallelogram': createTrapezoidHandleFunction(1)
- };
-
- // Exposes custom handles
- Graph.createHandle = createHandle;
- Graph.handleFactory = handleFactory;
- mxVertexHandler.prototype.createCustomHandles = function()
- {
- // Not rotatable means locked
- if (this.state.view.graph.getSelectionCount() == 1)
- {
- if (this.graph.isCellRotatable(this.state.cell))
- // LATER: Make locked state independent of rotatable flag, fix toggle if default is false
- //if (this.graph.isCellResizable(this.state.cell) || this.graph.isCellMovable(this.state.cell))
- {
- var name = this.state.style['shape'];
- if (this.state.view.graph.cellRenderer.defaultShapes[name] == null &&
- mxStencilRegistry.getStencil(name) == null)
- {
- name = mxConstants.SHAPE_RECTANGLE;
- }
-
- var fn = handleFactory[name];
-
- if (fn != null)
- {
- return fn(this.state);
- }
- }
- }
-
- return null;
- };
-
- mxEdgeHandler.prototype.createCustomHandles = function()
- {
- if (this.state.view.graph.getSelectionCount() == 1)
- {
- var name = this.state.style['shape'];
-
- if (this.state.view.graph.cellRenderer.defaultShapes[name] == null &&
- mxStencilRegistry.getStencil(name) == null)
- {
- name = mxConstants.SHAPE_CONNECTOR;
- }
-
- var fn = handleFactory[name];
-
- if (fn != null)
- {
- return fn(this.state);
- }
- }
-
- return null;
- }
- }
- else
- {
- // Dummy entries to avoid NPE in embed mode
- Graph.createHandle = function() {};
- Graph.handleFactory = {};
- }
-
- var isoHVector = new mxPoint(1, 0);
- var isoVVector = new mxPoint(1, 0);
-
- var alpha1 = mxUtils.toRadians(-30);
-
- var cos1 = Math.cos(alpha1);
- var sin1 = Math.sin(alpha1);
- isoHVector = mxUtils.getRotatedPoint(isoHVector, cos1, sin1);
- var alpha2 = mxUtils.toRadians(-150);
-
- var cos2 = Math.cos(alpha2);
- var sin2 = Math.sin(alpha2);
- isoVVector = mxUtils.getRotatedPoint(isoVVector, cos2, sin2);
-
- mxEdgeStyle.IsometricConnector = function (state, source, target, points, result)
- {
- var view = state.view;
- var pt = (points != null && points.length > 0) ? points[0] : null;
- var pts = state.absolutePoints;
- var p0 = pts[0];
- var pe = pts[pts.length-1];
-
- if (pt != null)
- {
- pt = view.transformControlPoint(state, pt);
- }
-
- if (p0 == null)
- {
- if (source != null)
- {
- p0 = new mxPoint(source.getCenterX(), source.getCenterY());
- }
- }
-
- if (pe == null)
- {
- if (target != null)
- {
- pe = new mxPoint(target.getCenterX(), target.getCenterY());
- }
- }
-
- var a1 = isoHVector.x;
- var a2 = isoHVector.y;
-
- var b1 = isoVVector.x;
- var b2 = isoVVector.y;
-
- var elbow = mxUtils.getValue(state.style, 'elbow', 'horizontal') == 'horizontal';
-
- if (pe != null && p0 != null)
- {
- var last = p0;
-
- function isoLineTo(x, y, ignoreFirst)
- {
- var c1 = x - last.x;
- var c2 = y - last.y;
- // Solves for isometric base vectors
- var h = (b2 * c1 - b1 * c2) / (a1 * b2 - a2 * b1);
- var v = (a2 * c1 - a1 * c2) / (a2 * b1 - a1 * b2);
-
- if (elbow)
- {
- if (ignoreFirst)
- {
- last = new mxPoint(last.x + a1 * h, last.y + a2 * h);
- result.push(last);
- }
-
- last = new mxPoint(last.x + b1 * v, last.y + b2 * v);
- result.push(last);
- }
- else
- {
- if (ignoreFirst)
- {
- last = new mxPoint(last.x + b1 * v, last.y + b2 * v);
- result.push(last);
- }
- last = new mxPoint(last.x + a1 * h, last.y + a2 * h);
- result.push(last);
- }
- };
- if (pt == null)
- {
- pt = new mxPoint(p0.x + (pe.x - p0.x) / 2, p0.y + (pe.y - p0.y) / 2);
- }
-
- isoLineTo(pt.x, pt.y, true);
- isoLineTo(pe.x, pe.y, false);
- }
- };
- mxStyleRegistry.putValue('isometricEdgeStyle', mxEdgeStyle.IsometricConnector);
-
- var graphCreateEdgeHandler = Graph.prototype.createEdgeHandler;
- Graph.prototype.createEdgeHandler = function(state, edgeStyle)
- {
- if (edgeStyle == mxEdgeStyle.IsometricConnector)
- {
- var handler = new mxElbowEdgeHandler(state);
- handler.snapToTerminals = false;
-
- return handler;
- }
-
- return graphCreateEdgeHandler.apply(this, arguments);
- };
- // Defines connection points for all shapes
- IsoRectangleShape.prototype.constraints = [];
- IsoCubeShape.prototype.constraints = [];
- mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
- mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
- mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
- PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- NoteShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- CardShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- CubeShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- FolderShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- InternalStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DataStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- TapeDataShape.prototype.constraints = mxEllipse.prototype.constraints;
- OrEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
- SumEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
- LineEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
- ManualInputShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DelayShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DisplayShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- LoopLimitShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- OffPageConnectorShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
- new mxConnectionConstraint(new mxPoint(0, 0.3), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.7), true),
- new mxConnectionConstraint(new mxPoint(1, 0.3), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.7), true),
- new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
- UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0, 1/3), false),
- new mxConnectionConstraint(new mxPoint(0, 1), false),
- new mxConnectionConstraint(new mxPoint(1, 1/3), false),
- new mxConnectionConstraint(new mxPoint(1, 1), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
- ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.3), true),
- new mxConnectionConstraint(new mxPoint(0, 0.7), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
- mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
- new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
- SwitchShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.25), false),
- new mxConnectionConstraint(new mxPoint(1, 0), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 1), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.75), false),
- new mxConnectionConstraint(new mxPoint(1, 1), false)];
- TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
- new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 0.65), false),
- new mxConnectionConstraint(new mxPoint(1, 0.35), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.65), false),
- new mxConnectionConstraint(new mxPoint(0.25, 1), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
- StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0.25, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.75, 1), true),
- new mxConnectionConstraint(new mxPoint(0.1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0.2, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0.1, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.9, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0.9, 0.75), true)];
- mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
- LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
- new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
- mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
- mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
- mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
- mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.625, 0), true),
- new mxConnectionConstraint(new mxPoint(0.125, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0.125, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.875, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0.875, 0.75), true),
- new mxConnectionConstraint(new mxPoint(0.375, 1), true),
- new mxConnectionConstraint(new mxPoint(0.5, 1), true),
- new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
- mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
- new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
- new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
- new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
- new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
- new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
- new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
- new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
- new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
- ParallelogramShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- TrapezoidShape.prototype.constraints = mxRectangleShape.prototype.constraints;
- DocumentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
- new mxConnectionConstraint(new mxPoint(0.5, 0), true),
- new mxConnectionConstraint(new mxPoint(0.75, 0), true),
- new mxConnectionConstraint(new mxPoint(0, 0.25), true),
- new mxConnectionConstraint(new mxPoint(0, 0.5), true),
- new mxConnectionConstraint(new mxPoint(0, 0.75), true),
- new mxConnectionConstraint(new mxPoint(1, 0.25), true),
- new mxConnectionConstraint(new mxPoint(1, 0.5), true),
- new mxConnectionConstraint(new mxPoint(1, 0.75), true)];
- mxArrow.prototype.constraints = null;
- TeeShape.prototype.constraints = null;
- CornerShape.prototype.constraints = null;
- CrossbarShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false),
- new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 1), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 1), false)];
- SingleArrowShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
- DoubleArrowShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
- CrossShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.5, 0), false),
- new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
- UmlLifeline.prototype.constraints = null;
- OrShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0, 0.75), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)];
- XorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.175, 0.25), false),
- new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.175, 0.75), false),
- new mxConnectionConstraint(new mxPoint(1, 0.5), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.1), false),
- new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)];
- })();
|