<?xml version="1.0"?>
<News hasArchived="true" page="7925" pageCount="10841" pageSize="10" timestamp="Wed, 30 Sep 2026 10:22:39 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=7925&amp;range=30">
<NewsItem contentIssues="false" id="40921" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40921">
<Title>MCS Faculty Office Hours- Spring 2014</Title>
<Body>
<![CDATA[
    <div class="html-content"><span>See the attachment for a listing of spring 2014 MCS faculty office hours.</span></div>
]]>
</Body>
<Summary>See the attachment for a listing of spring 2014 MCS faculty office hours.</Summary>
<AttachmentKind>Flyer</AttachmentKind>
<AttachmentUrl>https://assets2-my.umbc.edu/system/shared/attachments/703e3adece85f6d57b13d396bab7e71b/6abd1b2f/news/000/040/921/5c9b5c47258cf1499c2dc64b7072e735/Faculty Info Sp 2014- Office  Hours.pdf?1391440520</AttachmentUrl>
<Attachments>
<Attachment kind="Flyer" url="https://my3.my.umbc.edu/posts/40921/attachments/12429"></Attachment>
</Attachments>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40921/guest@my.umbc.edu/422771bc6c5300880e513586c7d0ab67/api/pixel</TrackingUrl>
<Group token="mcs">Media &amp;amp; Communication Studies</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/mcs</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xsmall.png?1639004057</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/original.png?1639004057</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xxlarge.png?1639004057</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xlarge.png?1639004057</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/large.png?1639004057</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/medium.png?1639004057</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/small.png?1639004057</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xsmall.png?1639004057</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/491/e2e495edc31bdc4fe9517af2ddcb3202/xxsmall.png?1639004057</AvatarUrl>
<Sponsor>Media &amp; Communication Studies</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 10:15:20 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40919" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40919">
<Title>CFP: Georgetown English GSA Conference</Title>
<Body>
<![CDATA[
    <div class="html-content">Please consider the upcoming interdisciplinary humanities conference hosted by the 
    Georgetown English Graduate Student Association. The attached flyer contains all necessary information.<br>
    <br>This year's conference, "Revisions and Amendments," is on <span><span><span>February 22, 2014</span></span></span>,
     and will showcase graduate presenters from across the country. 
    Professor Kathryn Temple, JD, PhD, will be giving the Keynote Address, 
    and Alex Myers will be reading from his new novel, <em>Revolutionary</em> (you can read the <em>New York</em> <em>Times</em> review <a href="http://www.nytimes.com/2014/01/13/books/in-revolutionary-by-alex-myers-a-woman-fights-as-a-man.html?_r=0" rel="nofollow external" class="bo">here</a>). 
    <div><br></div>People with questions can contact Kate Zavack at <a href="mailto:kz86@georgetown.edu" rel="nofollow external" class="bo">kz86@georgetown.edu</a>.<br>
    </div>
]]>
</Body>
<Summary>Please consider the upcoming interdisciplinary humanities conference hosted by the  Georgetown English Graduate Student Association. The attached flyer contains all necessary information.   This...</Summary>
<AttachmentKind>Flyer</AttachmentKind>
<AttachmentUrl>https://assets4-my.umbc.edu/system/shared/attachments/5defad03535e602a33482056016cf066/6abd1b2f/news/000/040/919/cb9c528565c30d49b548831022bc9b32/EGSAconference.pdf?1391439110</AttachmentUrl>
<Attachments>
<Attachment kind="Flyer" url="https://my3.my.umbc.edu/posts/40919/attachments/12425"></Attachment>
</Attachments>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40919/guest@my.umbc.edu/ec8c1c70f4a3e096705bc8f45c7ef537/api/pixel</TrackingUrl>
<Group token="llc">Language, Literacy and Culture Doctoral Program</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/llc</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/original.jpg?1375383725</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/large.png?1375383725</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/medium.png?1375383725</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/small.png?1375383725</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxsmall.png?1375383725</AvatarUrl>
<Sponsor>Language, Literacy and Culture Doctoral Program</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:52:03 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40918" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40918">
<Title>CFP: Applied Linguistics and Professional Practice (ALAPP 20</Title>
<Tagline>Deadline EXTENDED</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <span>In response to a number of requests for extensions, the abstract submission deadline has been extended until Sunday,<span> </span><strong>16 February 2014<br></strong></span><strong><span><br>4th International conference Applied Linguistics and Professional Practice (ALAPP 2014)</span></strong><div><div>
    <p><strong><span>LEARNING THROUGH AND FOR PROFESSIONAL PRACTICE</span></strong></p>
    <p><strong><span>University of Geneva, Switzerland, 10-13 September 2014</span></strong></p>
    <div><span>After
     Cardiff in 2011, Sydney in 2012 and Kuala Lumpur in 2013, the 
    University of Geneva will host the 4th International conference on 
    Applied Linguistics and Professional Practice.<br><br></span></div>
    <div><span>The
     conference aims to bring together scholars from different disciplinary 
    backgrounds, especially language and communication research, and 
    professional specialities (e.g., healthcare, social care, therapy, law, 
    mediation, management, business, journalism, education). It encourages 
    research and reflection developing interdisciplinarity, methodological 
    diversity, inter-professional collaboration and explores the relations 
    between language use and social practices taking place in institutional 
    and organisational contexts. A special emphasis will be on 
    cross-boundary collaboration and translation of research findings to 
    ensure impact. For this 2014 ALAPP conference, a special attention will 
    be dedicated to the topic of <strong>Learning through and for professional practice</strong>.</span></div>
    <div><span><br></span></div>
    <div><span>Individual papers, posters and thematic symposia can be submitted in English and French through the conference website (<span><a href="http://www.unige.ch/alapp2014" rel="nofollow external" class="bo"><span>http://www.unige.ch/alapp2014</span></a></span>)</span></div>
    <p><span> </span></p>
    <div>
    <strong><span>Submission opening</span></strong><span> : 1st November 2013</span>
    </div>
    <p><span> </span></p>
    <div>
    <strong><span>Submission deadline</span></strong><span> : 16th February 2014</span>
    </div>
    <p><span> </span></p>
    <div>
    <strong><span>Email address</span></strong><span> :  <span><a href="mailto:alapp2014@unige.ch" rel="nofollow external" class="bo"><span>alapp2014@unige.ch</span></a></span></span>
    </div>
    </div></div>
    </div>
]]>
</Body>
<Summary>In response to a number of requests for extensions, the abstract submission deadline has been extended until Sunday, 16 February 2014  4th International conference Applied Linguistics and...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40918/guest@my.umbc.edu/829a38e21bc3bf58a2bec03391eca514/api/pixel</TrackingUrl>
<Group token="llc">Language, Literacy and Culture Doctoral Program</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/llc</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/original.jpg?1375383725</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/large.png?1375383725</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/medium.png?1375383725</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/small.png?1375383725</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxsmall.png?1375383725</AvatarUrl>
<Sponsor>Language, Literacy and Culture Doctoral Program</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:46:46 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40915" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40915">
<Title>Change from Where You'd Least Expect It</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <h5>by Lee Boot</h5>
    <div>When you think about efforts to alleviate poverty, reduce crime, improve education and others aimed at making a real difference in the world, what kinds of strategies do you imagine? Laws that are more just? New technologies? Innovative medical treatments? Increasing the allocation of resources? Or perhaps you believe it’s about people simply rolling up their sleeves and pitching in to help.</div>
    <div><br></div>
    <div>All seem essential. But I’ll bet your short list of realistic solutions does not include the arts. If true, you are not alone—but that could be changing... (<a href="http://umbcbreakingground.wordpress.com/2014/02/03/change-from-where-youd-least-expect-it/" rel="nofollow external" class="bo">continue reading</a>)</div>
    </div>
]]>
</Body>
<Summary>by Lee Boot  When you think about efforts to alleviate poverty, reduce crime, improve education and others aimed at making a real difference in the world, what kinds of strategies do you imagine?...</Summary>
<Website>http://umbcbreakingground.wordpress.com/2014/02/03/change-from-where-youd-least-expect-it/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40915/guest@my.umbc.edu/3c9bccfe1cc3d5dbcf987097583dcc21/api/pixel</TrackingUrl>
<Group token="bg">UMBC BreakingGround</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/bg</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/xsmall.png?1360169927</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/original.png?1360169927</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/xxlarge.png?1360169927</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/xlarge.png?1360169927</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/large.png?1360169927</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/medium.png?1360169927</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/small.png?1360169927</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/xsmall.png?1360169927</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/493/e0dc61eceffa1a7dff9d396b4b7c5011/xxsmall.png?1360169927</AvatarUrl>
<Sponsor>UMBC BreakingGround</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/xxlarge.jpg?1391438738</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/xlarge.jpg?1391438738</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/large.jpg?1391438738</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/medium.jpg?1391438738</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/small.jpg?1391438738</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/xsmall.jpg?1391438738</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/040/915/bd94b4b8b5969ad9545f2b889b61271a/xxsmall.jpg?1391438738</ThumbnailUrl>
<PawCount>2</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:46:19 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40914" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40914">
<Title>Language Issues SIG Dissertation Award 2014</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>
    <span>The Comparative International Education Society (CIES) Language Issues (LI)
     Special Interest Group (SIG) is pleased to announce its 2014 
    Dissertation Award!  The award is open to dissertations that focus on 
    educational language issues, broadly defined, in comparative and 
    international education.  Dissertations will be reviewed based on the 
    following criteria:</span></p>
    <div>
    <span> </span><br>
    </div>
    <p>
    <span>1.</span> <span>The dissertation’s relevance to current thinking in the field</span></p>
    <p><span>2.</span> <span>The degree of sophistication or innovation of the methodology used</span></p>
    <p><span>3.</span> <span>The soundness of data collection and analysis</span></p>
    <p><span>4.</span> <span>The dissertation’s social utility and/or its implication for policy</span></p>
    <p><span>5.</span> <span>The degree to which the dissertation incorporates a comparative perspective</span></p>
    <div>
    <span> </span><br>
    </div>
    <p>
    <span>Eligible
     dissertations must have been filed within an 18-month period prior to 
    the LI SIG award’s extended submission deadline of <span><span>February 15, 2014</span></span> (e.g., from <span><span>August 15, 2012 to February 15, 2014</span></span>).  
     Students in Ed.D. or Ph.D. programs are eligible and the applicant 
    and/or the Dissertation Chair must be a current member of CIES.  The 
    winning dissertation will receive $100.</span></p>
    <p><strong><span>Applicants should submit the following four documents to be considered for the award:</span></strong></p>
    <div>
    <span> </span><br>
    </div>
    <p>
    <span>1.</span> <span>A
     detailed abstract of no more than five pages along with a 
    self-assessment indicating how the dissertation meets the above five 
    criteria; both should be doubled-spaced with no author identification 
    (for blind review)</span></p>
    <p><span>2.</span> <span>A
     title page (not counted within the page limit) with author’s name, 
    address, institutional affiliation, telephone, e-mail address, and names
     of dissertation committee chair(s) and members</span></p>
    <p><span>3.</span> <span>A reference page (not counted within the page limit) with only the references cited in the abstract, and</span></p>
    <p><span>4.</span> <span>One
     letter from the Dissertation Chair recommending the dissertation for 
    this award (this letter may be sent directly to the Committee at the 
    e-mail address below).</span><br></p>
    <p><span>After
     the initial round of consideration, the two highest rated candidates 
    will be asked to send the Committee a file with their entire 
    dissertation. Awardees will be recognized formally at the LI SIG 
    business meeting at the CIES Conference in Toronto, Canada, <span><span>March 10-14, 2014</span></span>.</span></p>
    <div>
    <span> </span><br>
    </div>
    <p>
    <span>Submission Information</span></p>
    <p><span>Please,
     submit the above documents electronically (as attachments in Word 
    compatible files) with the key word “Dissertation Award Submission” in 
    the subject line to:  </span><span><a href="mailto:cieslangsig@gmail.com" rel="nofollow external" class="bo">cieslangsig@gmail.com</a></span><span> </span><span>by <span><span>February 15, 2014</span></span>.  If you have any questions, please do not hesitate to contact Awards Committee at the above e-mail address.</span></p>
    </div>
]]>
</Body>
<Summary>The Comparative International Education Society (CIES) Language Issues (LI)  Special Interest Group (SIG) is pleased to announce its 2014  Dissertation Award!  The award is open to dissertations...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40914/guest@my.umbc.edu/3d7b547cbd2959e66b92d461e5c5d634/api/pixel</TrackingUrl>
<Group token="llc">Language, Literacy and Culture Doctoral Program</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/llc</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/original.jpg?1375383725</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xlarge.png?1375383725</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/large.png?1375383725</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/medium.png?1375383725</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/small.png?1375383725</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xsmall.png?1375383725</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/537/e594b22cf15b445f7476775aa508e9c3/xxsmall.png?1375383725</AvatarUrl>
<Sponsor>Language, Literacy and Culture Doctoral Program</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:43:54 -0500</PostedAt>
<EditAt>Mon, 03 Feb 2014 09:44:32 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="40916" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40916">
<Title>Standards for Web Applications on Mobile: current state and roadmap</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="http://www.w3.org/2013/02/mobile-web-app-state/" rel="nofollow external" class="bo"><img src="http://www.w3.org/2011/05/webapp-sm.png" alt="Thumbnail of application platform diagram that appears in the report" style="max-width: 100%; height: auto;"></a>W3C has published the January 2014 edition of <a href="http://www.w3.org/2014/01/mobile-web-app-state/" rel="nofollow external" class="bo">Standards for Web Applications on Mobile</a>, an overview of the various technologies developed in W3C that increase the capabilities of Web applications, and how they apply more specifically to the mobile context.</p>
    <p>A deliverable of the <a href="http://html5apps-project.eu/" rel="nofollow external" class="bo">HTML5Apps</a> project, this edition of the document includes changes and additions since September 2013, including 6 documents reaching Recommendation status (a record), which shows increased maturity of the platform; 4 <abbr>FPWD</abbr> and 4 new editors drafts illustrate it is still growing up nicely; and a lot of the changes are linked to performance, off-line support and packaging.</p>
    <p>Learn more about the <a href="http://www.w3.org/Mobile/IG/" rel="nofollow external" class="bo">Web and Mobile Interest Group</a>.</p>
    </div>
]]>
</Body>
<Summary>W3C has published the January 2014 edition of Standards for Web Applications on Mobile, an overview of the various technologies developed in W3C that increase the capabilities of Web applications,...</Summary>
<Website>http://www.w3.org/blog/news/archives/3623</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40916/guest@my.umbc.edu/8f377e73453c2730ecdeff0b2cb9e087/api/pixel</TrackingUrl>
<Tag>browsers-and-authoring-tools</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>home-page-stories</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>sql</Tag>
<Tag>w3</Tag>
<Tag>web</Tag>
<Tag>web-design-and-applications</Tag>
<Tag>web-of-devices</Tag>
<Tag>web-of-services</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:30:13 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40917" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40917">
<Title>UPDATE: Daytime classes at our Columbia location are now cancelled. Sonography c...</Title>
<Body>
<![CDATA[
    <div class="html-content">UPDATE: Daytime classes at our Columbia location are now cancelled. Sonography classes are running as scheduled.</div>
]]>
</Body>
<Summary>UPDATE: Daytime classes at our Columbia location are now cancelled. Sonography classes are running as scheduled.</Summary>
<Website>http://www.facebook.com/umbctraining/posts/10151839859816076</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40917/guest@my.umbc.edu/9ad22fc4580e494383af750f0bc89ba2/api/pixel</TrackingUrl>
<Tag>ccna</Tag>
<Tag>ceh</Tag>
<Tag>centers</Tag>
<Tag>cisco</Tag>
<Tag>cyber</Tag>
<Tag>cybersecurity</Tag>
<Tag>information</Tag>
<Tag>it</Tag>
<Tag>leadership</Tag>
<Tag>management</Tag>
<Tag>microsoft</Tag>
<Tag>project</Tag>
<Tag>security</Tag>
<Tag>technology</Tag>
<Tag>training</Tag>
<Tag>umbc</Tag>
<Group token="retired-575">UMBC Training Centers</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-575</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xsmall.png?1361981335</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/original.jpg?1361981335</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xxlarge.png?1361981335</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xlarge.png?1361981335</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/large.png?1361981335</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/medium.png?1361981335</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/small.png?1361981335</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xsmall.png?1361981335</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/575/83756b985266168d0d29c6c9a146db50/xxsmall.png?1361981335</AvatarUrl>
<Sponsor>UMBC Training Centers</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:22:46 -0500</PostedAt>
<EditAt>Mon, 03 Feb 2014 09:22:46 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="40912" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40912">
<Title>Grants to Students for Creative Work, Scholarship, Research</Title>
<Tagline>TODAY. All Majors</Tagline>
<Body>
<![CDATA[
    <div class="html-content">Do you have an idea for independent creative work, scholarship, or research? You can apply NOW for up to $1,500 to fund your work.<br><br>Learn how to create a strong proposal for an<br>Undergraduate Research Award (URA)<br><strong>TODAY, Monday, February 3, at 12:00 in Sherman 108</strong><br><br>Come to find out whether this is for you. Hear about <br><ul>
    <li>Defining the project/research question</li>
    <li>Writing a budget</li>
    <li>Working with a faculty mentor</li>
    </ul>
    <p>Application deadline SOON.<br></p>
    <p>If you think you will be applying for a URA, e-mail <a href="mailto:mcglynn@umbc.edu">mcglynn@umbc.edu</a> to be included on the list of interested students. <br></p>
    <p><br></p>
    </div>
]]>
</Body>
<Summary>Do you have an idea for independent creative work, scholarship, or research? You can apply NOW for up to $1,500 to fund your work.  Learn how to create a strong proposal for an Undergraduate...</Summary>
<Website>http://umbc.edu/undergrad_ed/research/URA/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40912/guest@my.umbc.edu/d55b433ffb52f9ca282c829fc7f75dac/api/pixel</TrackingUrl>
<Group token="undergradresearch">Undergraduate Research</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/undergradresearch</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/xsmall.png?1600355057</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/original.jpg?1600355057</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/xxlarge.png?1600355057</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/xlarge.png?1600355057</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/large.png?1600355057</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/medium.png?1600355057</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/small.png?1600355057</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/xsmall.png?1600355057</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/006/875606ced2b629148af4caa1a4e8dd3c/xxsmall.png?1600355057</AvatarUrl>
<Sponsor>Undergraduate Research</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:16:00 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="41053" important="false" status="posted" url="https://my3.my.umbc.edu/posts/41053">
<Title>Creating Brackets Extensions</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>A little while ago I wrote about the <a href="http://dev.tutsplus.com/tutorials/deeper-in-the-brackets-editor--net-35527" rel="nofollow external" class="bo">recent updates</a> to the Brackets editor. <a href="https://github.com/adobe/brackets" rel="nofollow external" class="bo">Brackets</a> is an open source project focused on web standards and built with web technologies. It has a narrow focus and therefore may not have a particular feature you've come to depend upon. Luckily, Brackets ships with a powerful extension API that lets you add any number of new features. In this article, I'm going to discuss this API and demonstrate how you can build your own extensions.</p>
    <p></p>
    <p>It is <em>crucial</em> that you remember that Brackets is in active development. This article is being written in December of 2013. It is certainly possible that the code demonstrated below is now out of date. Keep that in mind and be sure to check the <a href="https://github.com/adobe/brackets/wiki/How-to-Write-Extensions" rel="nofollow external" class="bo">wiki</a> for the latest updates to the extension API.</p>
    <hr>
    <h2>Getting Started</h2>
    <p>I'm going to assume you read my last article and are already familiar with the extension manager. This provides a simple, one click method of installing extensions. One of the best ways you can learn to write extensions is by looking at the work done by others (that's how I learned). I'd recommend grabbing a few extensions (there's almost 200 available now) and tearing apart their code. Don't be afraid to break a few while you're at it.</p>
    <p>Brackets puts all installed extensions within one main folder. To find that folder, go to the <strong>Help</strong> menu and select "<strong>Show Extensions Folder</strong>". For my OS X install, this was located at <strong>/Users/ray/Library/Application Support/Brackets/extensions/user</strong>. If you go up from that folder, you'll notice a disabled folder as well. Brackets will make a valiant effort to load no matter what, but if you ever find yourself in a situation where Brackets has completely crapped the bed and simply will not work, consider moving potentially bad extensions into the disabled folder. Later on in the article, I'll discuss how you can monitor and debug extensions to help prevent such problems in the first place.</p>
    <p>Begin by going to your user folder and creating a new folder, <code>helloworld1</code>. Yes, even though it is completely lame, we're going to build a HelloWorld extension. Don't hate me, I like simple. Inside that folder create a new file called <code>main.js</code>. Listing one shows what the contents of this file should be. Note that in this article I'll go through a couple of different iterations of the <code>helloworld</code> extension. Each one will be named with a progressively higher number. So our first example is from <code>helloworld1</code>, the next <code>helloworld2</code>, and so on. It would make sense for you to simply copy the code into one folder, <code>helloworld</code>, instead of copying each one by themselves. If you do, you'll have multiple related extensions running at once and that can definitely confuse things.</p>
    <pre>Listing 1: helloworld1/main.js&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld] "+s);&#x000A;        }&#x000A;    &#x000A;        log("Hello from HelloWorld.");&#x000A;    });</pre>
    <p>The first line defines our extension as a module that will be picked up by Brackets automatically on application load. The rest of the extension is a custom log message (you will see why in a second) and a call to that logger. Once you have this file saved, go back to Brackets, select the Debug menu, and hit Reload. (You can also use <strong>Command/Control+R</strong> to reload as well.) </p>
    <p>Brackets will reload and ... nothing else will happen. The extension we built didn't actually do anything that we could see, but it did log to the console. But where is that console? Brackets provides an easy way to view the console. Simply go back to the <strong>Debug</strong> menu and select <strong>Show Developer Tools</strong>. This will open a new tab in Chrome with a familiar Dev Tools UI. In the screen shot below I've highlighted our log. Other extensions, and Brackets itself, will also log messages to this screen. By prefixing my log messages with <code>[helloworld]</code>, I can make my own stuff a bit easier to find.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s1.jpeg" alt="Brackets console messages" width="600" height="268" style="max-width: 100%; height: auto;"><br>
    
    <p>Note that the full Chrome <code>console.api</code> works here. You can do stuff like this to format your console messages:</p>
    <pre>    &#x000A;    function log(s) {&#x000A;        console.log("%c[helloworld] "+s,"color:blue;font-size:large");&#x000A;    }</pre>
    <p>Go crazy, but try to remove these messages before you share your code with the rest of the world. In case you're curious, you can't use dev tools in another browser, like Firefox, at this time.</p>
    <hr>
    <h2>Integration Points</h2>
    <p>Now that you know the (very) basics, let's talk about what Brackets extensions can do to the editor:</p>
    <ul>
    <li>They can create keyboard shortcuts, allowing them to respond to custom keystrokes.</li>
    <li>They can add to the top level menu.</li>
    <li>They can add context menus (and to a specific area, like the file listing or the editor window).</li>
    <li>They can create UI items. This can be a modal dialog or even a panel. (Currently the panel is locked to the bottom of the screen).</li>
    <li>They can create a linting provider (essentially they can register themselves as a code checker for a file type).</li>
    <li>They can create their own inline editors (a major feature of Brackets).</li>
    <li>They can register as a documentation provider (for example, adding MDN support for docs).</li>
    <li>They can integrate with Quick Find and Quick Open.</li>
    <li>They can add custom code hints and syntax colors.</li>
    <li>They can read the current file open in the editor as well as modify it. (They can also see the current selected text, if any.)</li>
    </ul>
    <p>That describes how extensions can modify Brackets, but what can extensions actually do in terms of code? Keeping in mind that you're writing extensions in pure web standards (HTML, JavaScript, and CSS), you actually have quite a bit of power. The only real limits relate to binary data. There is a File system API that gives you control over files but is limited to text data only. Luckily, you have a way out.</p>
    <p>Any Brackets extension can integrate with Node.js. If you've got an existing Node.js package your extension can make calls to it and do, well, whatever Node.js can do, which is essentially anything.</p>
    <p>Let's update our extension to integrate with the editor a bit better. I'll start by simply adding a menu item for the extension.</p>
    <pre>Listing 2: helloworld2/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;                Menus = brackets.getModule("command/Menus"),&#x000A;                AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld2] "+s);&#x000A;        }&#x000A;    &#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;                alert("You ran me, thanks!");&#x000A;        }&#x000A;    &#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;                log("Hello from HelloWorld2.");&#x000A;    &#x000A;                var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;    &#x000A;                CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;                var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;                menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });</pre>
    <p>We've got a few changes here so let's tackle them one by one. You'll notice that the extension begins with three calls to brackets.getModule. All extensions have access to a brackets object that provides an API where we can load in core functionality from the editor. In this case the extension has loaded two libraries we'll need for the menu (CommandManager and Menus) and one which will be used to help initialize the extension (AppInit). </p>
    <p>Lets talk about AppInit. You can see that most of the extension is now loaded with a appReady callback. This callback is fired when Brackets has completed loading and is generally considered "best practice" for extensions to make use of. </p>
    <p>Registering a menu item takes a few steps. I begin by defining a "command ID", a unique identifier for the item I'll be adding to the UI. The typical way to do this is with the format <code>extensionname.someaction</code>. In my case, I used <code>helloworld.execute</code>. I can then register this command along with the function (<code>handleHelloWorld</code>) that should be called when the command is fired.</p>
    <p>The final step is to add this command to the menu. You can probably guess that my menu item will be added under the View menu based on this value: Menus.AppMenuBar.VIEW_MENU. How did I know that value? Simple, I saw other extensions do it. Seriously though, there is no specific list of items like this yet. Don't forget that Brackets is open source. I can easily pop over to the GitHub repo and check it out. In this case, the file is <code>Menus.js</code>, located on <a href="https://github.com/adobe/brackets/blob/master/src/command/Menus.js" rel="nofollow external" class="bo">Github</a>. In there I can see where the various different core menus are defined:</p>
    <pre>/**&#x000A;      * Brackets Application Menu Constants&#x000A;      * @enum {string}&#x000A;    */&#x000A;    var AppMenuBar = {&#x000A;         FILE_MENU       : "file-menu",&#x000A;         EDIT_MENU       : "edit-menu",&#x000A;         VIEW_MENU       : "view-menu",&#x000A;         NAVIGATE_MENU   : "navigate-menu",&#x000A;         HELP_MENU       : "help-menu"&#x000A;    };</pre>
    <p>As a general rule of thumb, it makes sense to have at least a cursory understanding of what's available in Brackets itself. Your extensions will, from time to time, make use of multiple different features so it's definitely in your best interest to at least know the lay of the land. </p>
    <p>After reloading Brackets, you'll now see the menu item in the <strong>View</strong> menu. Exactly where it is may be a bit random as you may have other extensions installed.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s2.png" alt="View menu updated" width="600" height="447" style="max-width: 100%; height: auto;"><br>
    
    <p>You can actually be a bit more specific about your position. Again, this is where the source code will help you. The same file I linked to above also contains the addMenuItem definition. </p>
    <hr>
    <h2>Put Some Lipstick on That Pig</h2>
    <p>Now that you've seen a simple example of how an extension can integrate into Brackets, let's look at how we update the UI. In the previous version of our code, an alert was used to send a message. While this works, it isn't very pretty. Your code can access the Brackets editor just like any other DOM modification code. While you <em>can</em> do anything you want, there are a few standard ways extensions update the UI in Brackets. (As a warning, in general you do not want to touch the DOM of the main editor UI. You can, but with future updates, your code may break. Also, users may not be happy if your extension changes something core to Brackets.)</p>
    <p>The first method we'll look at uses modal dialogs. Brackets already uses this and has an API available for extensions to call. As a simple example, let's just update the HelloWorld extension to use a modal instead.</p>
    <pre>Listing 3: helloworld3/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;            Menus = brackets.getModule("command/Menus"),&#x000A;            Dialogs = brackets.getModule("widgets/Dialogs"),&#x000A;            DefaultDialogs = brackets.getModule("widgets/DefaultDialogs"),&#x000A;            AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld3] "+s);&#x000A;        }&#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;            Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_INFO, "Hello World", "Same Important Message");&#x000A;        }&#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;            log("Hello from HelloWorld3.");&#x000A;    &#x000A;            var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;    &#x000A;            CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;            var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;            menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });</pre>
    <p>Note the addition of two additional Brackets modules: <code>Dialogs</code> and <code>DefaultDialogs</code>. The next change is in <code>handleHelloWorld</code>. One of the methods in the Dialog library is the ability to show a dialog (no surprise there, I suppose). The method wants a class, a title, and a body, and that's it. There's more you can do with dialogs, but for now, this demonstrates the feature. Now when we run the command, we get a much prettier UI. (Along with default buttons and behaviours to handle closing the dialog.)</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s3.png" alt="Dialog example" width="600" height="397" style="max-width: 100%; height: auto;"><br>
    
    <p>That's one example, now lets look at another: creating a bottom panel. As with dialogs, we've got support from Brackets to make it easier. Let's look at an example and then I'll explain the changes.</p>
    <pre>Listing 4: helloworld4/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;        Menus = brackets.getModule("command/Menus"),&#x000A;        PanelManager = brackets.getModule("view/PanelManager"),&#x000A;        AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;        var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;        var panel;&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld4] "+s);&#x000A;        }&#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;            if(panel.isVisible()) {&#x000A;                panel.hide();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(false);&#x000A;            } else {&#x000A;                panel.show();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(true);&#x000A;            }&#x000A;        }&#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;                log("Hello from HelloWorld4.");&#x000A;    &#x000A;                CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;                var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;                menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;                panel = PanelManager.createBottomPanel(HELLOWORLD_EXECUTE, $("&lt;div class='bottom-panel'&gt;HTML for my panel&lt;/div&gt;"),200);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });</pre>
    <p>Let's focus on the changes. First, I dropped the Dialog modules as I'm no longer using them. Instead, we load up the PanelManager. Down in the appReady block I've defined a new panel using the PanelManager API method createBottomPanel. Like the menu command this takes in a unique ID so I just reuse <code>HELLOWORLD_EXECUTE</code>. The second argument is a jQuery-wrapped block of HTML (and in case you're wondering, yes we can do this nicer), and finally, a minimum size. This sets up the panel but doesn't actually execute it.</p>
    <p>In the event handler, we have tied to the menu, we can ask the panel if it is visible and then either hide or show it. That part should be pretty trivial. For fun I've added in a bit more complexity. Notice that <code>CommandManager</code> lets us get a menu item and set a checked property. This may be unnecessary as the user can see the panel easily enough themselves, but adding the check just makes things a little bit more obvious. In the screen shot below you can see the panel in its visible state.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s4.png" alt="Panel example" width="600" height="493" style="max-width: 100%; height: auto;"><br>
    
    <p>Right away you may be wondering about the panel HTML. Is there a better way to provide the HTML? Anyway to style it? Yep, lets look at a more advanced version.</p>
    <pre>Listing 5: helloworld5/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;        Menus = brackets.getModule("command/Menus"),&#x000A;        PanelManager = brackets.getModule("view/PanelManager"),&#x000A;        ExtensionUtils          = brackets.getModule("utils/ExtensionUtils"),        &#x000A;        AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;        var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;        var panel;&#x000A;        var panelHtml     = require("text!panel.html");&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld5] "+s);&#x000A;        }&#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;            if(panel.isVisible()) {&#x000A;                panel.hide();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(false);&#x000A;            } else {&#x000A;                panel.show();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(true);&#x000A;            }&#x000A;        }&#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;            log("Hello from HelloWorld5.");&#x000A;            ExtensionUtils.loadStyleSheet(module, "helloworld.css");&#x000A;            CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;            var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;            menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;            panel = PanelManager.createBottomPanel(HELLOWORLD_EXECUTE, $(panelHtml),200);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });</pre>
    <p>As before, I'm going to focus on the changes. First note that I've included a variable called <code>panelHtml</code> that is loaded via require. This lets me define my HTML outside of my JavaScript code. (You can also use templating engines. Brackets ships with Mustache.) The HTML behind the panel is rather simple.</p>
    <pre>Listing 6: helloworld5/panel.html&#x000A;    &lt;div class="bottom-panel helloworld-panel" id="helloworldPanel"&gt;&#x000A;    &lt;h1&gt;My Panel&lt;/h1&gt;&#x000A;    &#x000A;    &lt;p&gt;&#x000A;    My panel brings all the boys to the yard,&lt;br/&gt;&#x000A;    And they're like&lt;br/&gt;&#x000A;    It's better than yours,&lt;br/&gt;&#x000A;    Damn right it's better than yours,&lt;br/&gt;&#x000A;    I can teach you,&lt;br/&gt;&#x000A;    But I have to charge&#x000A;    &lt;/p&gt;&#x000A;    &lt;/div&gt;</pre>
    <p>Returning to <code>main.js</code>, I've demonstrated another feature, loadStyleSheet. This lets you load an extension specific style sheet. I created a file, <code>helloworld.css</code>, with some simple (but tasteful) CSS styles.</p>
    <pre>Listing 7: helloworld5/helloworld.css&#x000A;    .helloworld-panel h1 {&#x000A;            color: red;&#x000A;    }&#x000A;    &#x000A;    .helloworld-panel p {&#x000A;            color: blue;&#x000A;            font-weight: bold;&#x000A;    }</pre>
    <p>Note that I prefixed my styles with a unique name. This helps ensure my classes don't conflict with anything built into Brackets. With these simple changes my panel now looks much better, and you can see why I'm known world wide for my superior design skills. </p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/a5.png" alt="Epic CSS" width="600" height="396" style="max-width: 100%; height: auto;"><br>
    
    <hr>
    <h2>Packaging and Sharing Your Kick Butt Extension</h2>
    <p>Of course, just creating the coolest Brackets extension isn't quite enough. You probably (hopefully!) want to share it with others. One option is to just zip up the directory and put it on your website. Folks can download the zip, extract it, and copy it to their Brackets extensions folder. </p>
    <p>But that's not cool. You want to be cool, right? In order to share your extension and make it available via the Brackets Extension manager, you simply need to add a <code>package.json</code> file to your extension. If you've ever used Node.js, then this will seem familiar. Here is a sample one for our extension.</p>
    <pre>Listing 8: helloworld6/package.json&#x000A;    {&#x000A;        "name": "camden.helloworld",&#x000A;        "title": "HelloWorld",&#x000A;        "description": "Adds HelloWorld support to Brackets.",&#x000A;        "homepage": "<a href="https://github.com/cfjedimaster/something">https://github.com/cfjedimaster/something</a> real here",&#x000A;        "version": "1.0.0",&#x000A;        "author": "Raymond Camden &lt;<a href="mailto:raymondcamden@gmail.com">raymondcamden@gmail.com</a>&gt; (<a href="http://www.raymondcamden.com">http://www.raymondcamden.com</a>)",&#x000A;        "license": "MIT",&#x000A;        "engines": {&#x000A;            "brackets": "&lt;=0.34.0"&#x000A;        }&#x000A;    }</pre>
    <p>Most of this is self-explanatory, but the real crucial portion is the engines block. Brackets updates itself pretty rapidly. If Brackets added a particular feature at some point that your extension relies on, you can add a simple conditional here to ensure folks don't try to install your extension on an incompatible version. (You can find a full listing of the possible settings on <a href="https://github.com/adobe/brackets/wiki/Extension-package-format#packagejson-format" rel="nofollow external" class="bo">the Wiki</a>.)</p>
    <p>Once you've done this, the next part is to upload it to the <a href="https://brackets-registry.aboutweb.com/" rel="nofollow external" class="bo">Brackets Registry</a>. You will need to log in via your GitHub account, but once you've done that, you can then simply upload your zip. Your extension will then be available to anyone using Brackets. Even better, if you update your extension, the Extension Manager will actually be able to flag this to the user so they know an update is available.</p>
    <hr>
    <h2>What Else?</h2>
    <p>Hopefully, you've seen how easy it is to extend Brackets. There's more we didn't cover, like the <a href="http://blog.brackets.io/2013/10/07/new-linting-api/" rel="nofollow external" class="bo">Linting API</a> and <a href="https://github.com/adobe/brackets/wiki/Brackets-Node-Process:-Overview-for-Developers#usage-example" rel="nofollow external" class="bo">NodeJS integration</a>, but this article should be more than enough to get you started. As a reminder, do not forget there is a large collection of extensions available for you to start playing with right now. Good luck!</p>
    </div>
]]>
</Body>
<Summary>A little while ago I wrote about the recent updates to the Brackets editor. Brackets is an open source project focused on web standards and built with web technologies. It has a narrow focus and...</Summary>
<Website>http://code.tutsplus.com/tutorials/creating-brackets-extensions--net-36781</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/41053/guest@my.umbc.edu/cd0c6bab5ae7302ee4c242f13e87cce8/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:00:26 -0500</PostedAt>
<EditAt>Mon, 03 Feb 2014 09:00:21 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="40913" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40913">
<Title>Creating Brackets Extensions</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36781&amp;c=152999730" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36781&amp;c=152999730" alt="" style="max-width: 100%; height: auto;"></a><p>A little while ago I wrote about the <a href="http://dev.tutsplus.com/tutorials/deeper-in-the-brackets-editor--net-35527" rel="nofollow external" class="bo">recent updates</a> to the Brackets editor. <a href="https://github.com/adobe/brackets" rel="nofollow external" class="bo">Brackets</a> is an open source project focused on web standards and built with web technologies. It has a narrow focus and therefore may not have a particular feature you’ve come to depend upon. Luckily, Brackets ships with a powerful extension API that lets you add any number of new features. In this article, I’m going to discuss this API and demonstrate how you can build your own extensions.</p>
    <p></p>
    <p>It is <em>crucial</em> that you remember that Brackets is in active development. This article is being written in December of 2013. It is certainly possible that the code demonstrated below is now out of date. Keep that in mind and be sure to check the <a href="https://github.com/adobe/brackets/wiki/How-to-Write-Extensions" rel="nofollow external" class="bo">wiki</a> for the latest updates to the extension API.</p>
    <hr>
    <h2>Getting Started</h2>
    <p>I’m going to assume you read my last article and are already familiar with the extension manager. This provides a simple, one click method of installing extensions. One of the best ways you can learn to write extensions is by looking at the work done by others (that’s how I learned). I’d recommend grabbing a few extensions (there’s almost 200 available now) and tearing apart their code. Don’t be afraid to break a few while you’re at it.</p>
    <p>Brackets puts all installed extensions within one main folder. To find that folder, go to the <strong>Help</strong> menu and select “<strong>Show Extensions Folder</strong>“. For my OS X install, this was located at <strong>/Users/ray/Library/Application Support/Brackets/extensions/user</strong>. If you go up from that folder, you’ll notice a disabled folder as well. Brackets will make a valiant effort to load no matter what, but if you ever find yourself in a situation where Brackets has completely crapped the bed and simply will not work, consider moving potentially bad extensions into the disabled folder. Later on in the article, I’ll discuss how you can monitor and debug extensions to help prevent such problems in the first place.</p>
    <p>Begin by going to your user folder and creating a new folder, <code>helloworld1</code>. Yes, even though it is completely lame, we’re going to build a HelloWorld extension. Don’t hate me, I like simple. Inside that folder create a new file called <code>main.js</code>. Listing one shows what the contents of this file should be. Note that in this article I’ll go through a couple of different iterations of the <code>helloworld</code> extension. Each one will be named with a progressively higher number. So our first example is from <code>helloworld1</code>, the next <code>helloworld2</code>, and so on. It would make sense for you to simply copy the code into one folder, <code>helloworld</code>, instead of copying each one by themselves. If you do, you’ll have multiple related extensions running at once and that can definitely confuse things.</p>
    <pre>Listing 1: helloworld1/main.js&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld] "+s);&#x000A;        }&#x000A;    &#x000A;        log("Hello from HelloWorld.");&#x000A;    });&#x000A;    </pre>
    <p>The first line defines our extension as a module that will be picked up by Brackets automatically on application load. The rest of the extension is a custom log message (you will see why in a second) and a call to that logger. Once you have this file saved, go back to Brackets, select the Debug menu, and hit Reload. (You can also use <strong>Command/Control+R</strong> to reload as well.)</p>
    <p>Brackets will reload and … nothing else will happen. The extension we built didn’t actually do anything that we could see, but it did log to the console. But where is that console? Brackets provides an easy way to view the console. Simply go back to the <strong>Debug</strong> menu and select <strong>Show Developer Tools</strong>. This will open a new tab in Chrome with a familiar Dev Tools UI. In the screen shot below I’ve highlighted our log. Other extensions, and Brackets itself, will also log messages to this screen. By prefixing my log messages with <code>[helloworld]</code>, I can make my own stuff a bit easier to find.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s1.jpeg" alt="Brackets console messages" width="600" height="268" style="max-width: 100%; height: auto;"><br> <p>Note that the full Chrome <code>console.api</code> works here. You can do stuff like this to format your console messages:</p>
    <pre>    &#x000A;    function log(s) {&#x000A;        console.log("%c[helloworld] "+s,"color:blue;font-size:large");&#x000A;    }&#x000A;    </pre>
    <p>Go crazy, but try to remove these messages before you share your code with the rest of the world. In case you’re curious, you can’t use dev tools in another browser, like Firefox, at this time.</p>
    <hr>
    <h2>Integration Points</h2>
    <p>Now that you know the (very) basics, let’s talk about what Brackets extensions can do to the editor:</p>
    <ul>
    <li>They can create keyboard shortcuts, allowing them to respond to custom keystrokes.</li>
    <li>They can add to the top level menu.</li>
    <li>They can add context menus (and to a specific area, like the file listing or the editor window).</li>
    <li>They can create UI items. This can be a modal dialog or even a panel. (Currently the panel is locked to the bottom of the screen).</li>
    <li>They can create a linting provider (essentially they can register themselves as a code checker for a file type).</li>
    <li>They can create their own inline editors (a major feature of Brackets).</li>
    <li>They can register as a documentation provider (for example, adding MDN support for docs).</li>
    <li>They can integrate with Quick Find and Quick Open.</li>
    <li>They can add custom code hints and syntax colors.</li>
    <li>They can read the current file open in the editor as well as modify it. (They can also see the current selected text, if any.)</li>
    </ul>
    <p>That describes how extensions can modify Brackets, but what can extensions actually do in terms of code? Keeping in mind that you’re writing extensions in pure web standards (HTML, JavaScript, and CSS), you actually have quite a bit of power. The only real limits relate to binary data. There is a File system API that gives you control over files but is limited to text data only. Luckily, you have a way out.</p>
    <p>Any Brackets extension can integrate with Node.js. If you’ve got an existing Node.js package your extension can make calls to it and do, well, whatever Node.js can do, which is essentially anything.</p>
    <p>Let’s update our extension to integrate with the editor a bit better. I’ll start by simply adding a menu item for the extension.</p>
    <pre>Listing 2: helloworld2/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    &#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    &#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;                Menus = brackets.getModule("command/Menus"),&#x000A;                AppInit = brackets.getModule("utils/AppInit");&#x000A;        function log(s) {&#x000A;                console.log("[helloworld2] "+s);&#x000A;        }&#x000A;        function handleHelloWorld() {&#x000A;                alert("You ran me, thanks!");&#x000A;        }&#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;                log("Hello from HelloWorld2.");&#x000A;    &#x000A;                var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;    &#x000A;                CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;                var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;                menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });&#x000A;    </pre>
    <p>We’ve got a few changes here so let’s tackle them one by one. You’ll notice that the extension begins with three calls to brackets.getModule. All extensions have access to a brackets object that provides an API where we can load in core functionality from the editor. In this case the extension has loaded two libraries we’ll need for the menu (CommandManager and Menus) and one which will be used to help initialize the extension (AppInit).</p>
    <p>Lets talk about AppInit. You can see that most of the extension is now loaded with a appReady callback. This callback is fired when Brackets has completed loading and is generally considered “best practice” for extensions to make use of.</p>
    <p>Registering a menu item takes a few steps. I begin by defining a “command ID”, a unique identifier for the item I’ll be adding to the UI. The typical way to do this is with the format <code>extensionname.someaction</code>. In my case, I used <code>helloworld.execute</code>. I can then register this command along with the function (<code>handleHelloWorld</code>) that should be called when the command is fired.</p>
    <p>The final step is to add this command to the menu. You can probably guess that my menu item will be added under the View menu based on this value: Menus.AppMenuBar.VIEW_MENU. How did I know that value? Simple, I saw other extensions do it. Seriously though, there is no specific list of items like this yet. Don’t forget that Brackets is open source. I can easily pop over to the GitHub repo and check it out. In this case, the file is <code>Menus.js</code>, located on <a href="https://github.com/adobe/brackets/blob/master/src/command/Menus.js" rel="nofollow external" class="bo">Github</a>. In there I can see where the various different core menus are defined:</p>
    <pre>/**&#x000A;      * Brackets Application Menu Constants&#x000A;      * @enum {string}&#x000A;    */&#x000A;    var AppMenuBar = {&#x000A;         FILE_MENU       : "file-menu",&#x000A;         EDIT_MENU       : "edit-menu",&#x000A;         VIEW_MENU       : "view-menu",&#x000A;         NAVIGATE_MENU   : "navigate-menu",&#x000A;         HELP_MENU       : "help-menu"&#x000A;    };      &#x000A;    </pre>
    <p>As a general rule of thumb, it makes sense to have at least a cursory understanding of what’s available in Brackets itself. Your extensions will, from time to time, make use of multiple different features so it’s definitely in your best interest to at least know the lay of the land.</p>
    <p>After reloading Brackets, you’ll now see the menu item in the <strong>View</strong> menu. Exactly where it is may be a bit random as you may have other extensions installed.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s2.png" alt="View menu updated" width="600" height="447" style="max-width: 100%; height: auto;"><br> <p>You can actually be a bit more specific about your position. Again, this is where the source code will help you. The same file I linked to above also contains the addMenuItem definition.</p>
    <hr>
    <h2>Put Some Lipstick on That Pig</h2>
    <p>Now that you’ve seen a simple example of how an extension can integrate into Brackets, let’s look at how we update the UI. In the previous version of our code, an alert was used to send a message. While this works, it isn’t very pretty. Your code can access the Brackets editor just like any other DOM modification code. While you <em>can</em> do anything you want, there are a few standard ways extensions update the UI in Brackets. (As a warning, in general you do not want to touch the DOM of the main editor UI. You can, but with future updates, your code may break. Also, users may not be happy if your extension changes something core to Brackets.)</p>
    <p>The first method we’ll look at uses modal dialogs. Brackets already uses this and has an API available for extensions to call. As a simple example, let’s just update the HelloWorld extension to use a modal instead.</p>
    <pre>Listing 3: helloworld3/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    &#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    &#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;            Menus = brackets.getModule("command/Menus"),&#x000A;            Dialogs = brackets.getModule("widgets/Dialogs"),&#x000A;            DefaultDialogs = brackets.getModule("widgets/DefaultDialogs"),&#x000A;            AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld3] "+s);&#x000A;        }&#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;            Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_INFO, "Hello World", "Same Important Message");&#x000A;        }&#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;            log("Hello from HelloWorld3.");&#x000A;    &#x000A;            var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;    &#x000A;            CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;            var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;            menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });&#x000A;    </pre>
    <p>Note the addition of two additional Brackets modules: <code>Dialogs</code> and <code>DefaultDialogs</code>. The next change is in <code>handleHelloWorld</code>. One of the methods in the Dialog library is the ability to show a dialog (no surprise there, I suppose). The method wants a class, a title, and a body, and that’s it. There’s more you can do with dialogs, but for now, this demonstrates the feature. Now when we run the command, we get a much prettier UI. (Along with default buttons and behaviours to handle closing the dialog.)</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s3.png" alt="Dialog example" width="600" height="397" style="max-width: 100%; height: auto;"><br> <p>That’s one example, now lets look at another: creating a bottom panel. As with dialogs, we’ve got support from Brackets to make it easier. Let’s look at an example and then I’ll explain the changes.</p>
    <pre>Listing 4: helloworld4/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    &#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    &#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;    &#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;        Menus = brackets.getModule("command/Menus"),&#x000A;        PanelManager = brackets.getModule("view/PanelManager"),&#x000A;        AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;        var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;        var panel;&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld4] "+s);&#x000A;        }&#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;            if(panel.isVisible()) {&#x000A;                panel.hide();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(false);&#x000A;            } else {&#x000A;                panel.show();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(true);&#x000A;            }&#x000A;        }&#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;                log("Hello from HelloWorld4.");&#x000A;    &#x000A;                CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;                var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;                menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;                panel = PanelManager.createBottomPanel(HELLOWORLD_EXECUTE, $("&lt;div class='bottom-panel'&gt;HTML for my panel&lt;/div&gt;"),200);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });&#x000A;    </pre>
    <p>Let’s focus on the changes. First, I dropped the Dialog modules as I’m no longer using them. Instead, we load up the PanelManager. Down in the appReady block I’ve defined a new panel using the PanelManager API method createBottomPanel. Like the menu command this takes in a unique ID so I just reuse <code>HELLOWORLD_EXECUTE</code>. The second argument is a jQuery-wrapped block of HTML (and in case you’re wondering, yes we can do this nicer), and finally, a minimum size. This sets up the panel but doesn’t actually execute it.</p>
    <p>In the event handler, we have tied to the menu, we can ask the panel if it is visible and then either hide or show it. That part should be pretty trivial. For fun I’ve added in a bit more complexity. Notice that <code>CommandManager</code> lets us get a menu item and set a checked property. This may be unnecessary as the user can see the panel easily enough themselves, but adding the check just makes things a little bit more obvious. In the screen shot below you can see the panel in its visible state.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/s4.png" alt="Panel example" width="600" height="493" style="max-width: 100%; height: auto;"><br> <p>Right away you may be wondering about the panel HTML. Is there a better way to provide the HTML? Anyway to style it? Yep, lets look at a more advanced version.</p>
    <pre>Listing 5: helloworld5/main.js&#x000A;    /*&#x000A;    Based - in part - on the HelloWorld sample extension on the Brackets wiki:&#x000A;    &#x000A;    <a href="https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension">https://github.com/adobe/brackets/wiki/Simple-%22Hello-World%22-extension</a>&#x000A;    &#x000A;    */&#x000A;    define(function(require, exports, module) {&#x000A;        var CommandManager = brackets.getModule("command/CommandManager"),&#x000A;        Menus = brackets.getModule("command/Menus"),&#x000A;        PanelManager = brackets.getModule("view/PanelManager"),&#x000A;        ExtensionUtils          = brackets.getModule("utils/ExtensionUtils"),        &#x000A;        AppInit = brackets.getModule("utils/AppInit");&#x000A;    &#x000A;        var HELLOWORLD_EXECUTE = "helloworld.execute";&#x000A;        var panel;&#x000A;        var panelHtml     = require("text!panel.html");&#x000A;    &#x000A;        function log(s) {&#x000A;                console.log("[helloworld5] "+s);&#x000A;        }&#x000A;    &#x000A;        function handleHelloWorld() {&#x000A;            if(panel.isVisible()) {&#x000A;                panel.hide();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(false);&#x000A;            } else {&#x000A;                panel.show();&#x000A;                CommandManager.get(HELLOWORLD_EXECUTE).setChecked(true);&#x000A;            }&#x000A;        }&#x000A;    &#x000A;        AppInit.appReady(function () {&#x000A;    &#x000A;            log("Hello from HelloWorld5.");&#x000A;            ExtensionUtils.loadStyleSheet(module, "helloworld.css");&#x000A;            CommandManager.register("Run HelloWorld", HELLOWORLD_EXECUTE, handleHelloWorld);&#x000A;    &#x000A;            var menu = Menus.getMenu(Menus.AppMenuBar.VIEW_MENU);&#x000A;            menu.addMenuItem(HELLOWORLD_EXECUTE);&#x000A;    &#x000A;            panel = PanelManager.createBottomPanel(HELLOWORLD_EXECUTE, $(panelHtml),200);&#x000A;    &#x000A;        });&#x000A;    &#x000A;    });&#x000A;    </pre>
    <p>As before, I’m going to focus on the changes. First note that I’ve included a variable called <code>panelHtml</code> that is loaded via require. This lets me define my HTML outside of my JavaScript code. (You can also use templating engines. Brackets ships with Mustache.) The HTML behind the panel is rather simple.</p>
    <pre>Listing 6: helloworld5/panel.html&#x000A;    &lt;div class="bottom-panel helloworld-panel" id="helloworldPanel"&gt;&#x000A;    &lt;h1&gt;My Panel&lt;/h1&gt;&#x000A;    &#x000A;    &lt;p&gt;&#x000A;    My panel brings all the boys to the yard,&lt;br/&gt;&#x000A;    And they're like&lt;br/&gt;&#x000A;    It's better than yours,&lt;br/&gt;&#x000A;    Damn right it's better than yours,&lt;br/&gt;&#x000A;    I can teach you,&lt;br/&gt;&#x000A;    But I have to charge&#x000A;    &lt;/p&gt;&#x000A;    &lt;/div&gt;&#x000A;    </pre>
    <p>Returning to <code>main.js</code>, I’ve demonstrated another feature, loadStyleSheet. This lets you load an extension specific style sheet. I created a file, <code>helloworld.css</code>, with some simple (but tasteful) CSS styles.</p>
    <pre>Listing 7: helloworld5/helloworld.css&#x000A;    .helloworld-panel h1 {&#x000A;            color: red;&#x000A;    }&#x000A;    &#x000A;    .helloworld-panel p {&#x000A;            color: blue;&#x000A;            font-weight: bold;&#x000A;    }&#x000A;    </pre>
    <p>Note that I prefixed my styles with a unique name. This helps ensure my classes don’t conflict with anything built into Brackets. With these simple changes my panel now looks much better, and you can see why I’m known world wide for my superior design skills.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/a5.png" alt="Epic CSS" width="600" height="396" style="max-width: 100%; height: auto;"><br> <hr>
    <h2>Packaging and Sharing Your Kick Butt Extension</h2>
    <p>Of course, just creating the coolest Brackets extension isn’t quite enough. You probably (hopefully!) want to share it with others. One option is to just zip up the directory and put it on your website. Folks can download the zip, extract it, and copy it to their Brackets extensions folder.</p>
    <p>But that’s not cool. You want to be cool, right? In order to share your extension and make it available via the Brackets Extension manager, you simply need to add a <code>package.json</code> file to your extension. If you’ve ever used Node.js, then this will seem familiar. Here is a sample one for our extension.</p>
    <pre>Listing 8: helloworld6/package.json&#x000A;    {&#x000A;        "name": "camden.helloworld",&#x000A;        "title": "HelloWorld",&#x000A;        "description": "Adds HelloWorld support to Brackets.",&#x000A;        "homepage": "<a href="https://github.com/cfjedimaster/something">https://github.com/cfjedimaster/something</a> real here",&#x000A;        "version": "1.0.0",&#x000A;        "author": "Raymond Camden &lt;<a href="mailto:raymondcamden@gmail.com">raymondcamden@gmail.com</a>&gt; (<a href="http://www.raymondcamden.com">http://www.raymondcamden.com</a>)",&#x000A;        "license": "MIT",&#x000A;        "engines": {&#x000A;            "brackets": "&lt;=0.34.0"&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>Most of this is self-explanatory, but the real crucial portion is the engines block. Brackets updates itself pretty rapidly. If Brackets added a particular feature at some point that your extension relies on, you can add a simple conditional here to ensure folks don’t try to install your extension on an incompatible version. (You can find a full listing of the possible settings on <a href="https://github.com/adobe/brackets/wiki/Extension-package-format#packagejson-format" rel="nofollow external" class="bo">the Wiki</a>.)</p>
    <p>Once you’ve done this, the next part is to upload it to the <a href="https://brackets-registry.aboutweb.com/" rel="nofollow external" class="bo">Brackets Registry</a>. You will need to log in via your GitHub account, but once you’ve done that, you can then simply upload your zip. Your extension will then be available to anyone using Brackets. Even better, if you update your extension, the Extension Manager will actually be able to flag this to the user so they know an update is available.</p>
    <hr>
    <h2>What Else?</h2>
    <p>Hopefully, you’ve seen how easy it is to extend Brackets. There’s more we didn’t cover, like the <a href="http://blog.brackets.io/2013/10/07/new-linting-api/" rel="nofollow external" class="bo">Linting API</a> and <a href="https://github.com/adobe/brackets/wiki/Brackets-Node-Process:-Overview-for-Developers#usage-example" rel="nofollow external" class="bo">NodeJS integration</a>, but this article should be more than enough to get you started. As a reminder, do not forget there is a large collection of extensions available for you to start playing with right now. Good luck!</p>
    </div>
]]>
</Body>
<Summary>A little while ago I wrote about the recent updates to the Brackets editor. Brackets is an open source project focused on web standards and built with web technologies. It has a narrow focus and...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/OnsSgMdfwkY/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40913/guest@my.umbc.edu/061c9d55f8ae6dfba682b43935354f37/api/pixel</TrackingUrl>
<Tag>brackets</Tag>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>extensions</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>javascript-and-ajax</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 03 Feb 2014 09:00:21 -0500</PostedAt>
<EditAt>Mon, 03 Feb 2014 09:00:21 -0500</EditAt>
</NewsItem>

</News>
