From 4d253630b7a04f501e36fc0a7efc5ff632760ca8 Mon Sep 17 00:00:00 2001 From: "jinxuesong@163.com" Date: Sun, 9 May 2021 20:14:02 +0800 Subject: [PATCH 1/2] update --- icons/book.gif | Bin 0 -> 194 bytes icons/gameboard.gif | Bin 0 -> 168 bytes icons/meBook.gif | Bin 0 -> 315 bytes icons/movingBox.gif | Bin 0 -> 115 bytes icons/newBook.gif | Bin 0 -> 189 bytes icons/remove.gif | Bin 0 -> 143 bytes lib/._RXTXcomm.jar7894315756722313710.tmp | Bin 0 -> 60984 bytes src/cbg/article/model/BoardGame.java | 20 ++ src/cbg/article/model/Book.java | 78 ++++ src/cbg/article/model/DeltaEvent.java | 13 + src/cbg/article/model/IDeltaListener.java | 5 + src/cbg/article/model/IModelVisitor.java | 9 + src/cbg/article/model/Model.java | 65 ++++ src/cbg/article/model/MovingBox.java | 152 ++++++++ src/cbg/article/model/NullDeltaListener.java | 18 + .../treeviewer/ui/BoardgameFilter.java | 18 + .../treeviewer/ui/BookBoxBoardSorter.java | 21 ++ .../ui/MovingBoxContentProvider.java | 138 +++++++ .../treeviewer/ui/MovingBoxLabelProvider.java | 77 ++++ .../article/treeviewer/ui/MovingBoxView.java | 337 ++++++++++++++++++ .../treeviewer/ui/NoArticleSorter.java | 52 +++ .../treeviewer/ui/ThreeItemFilter.java | 18 + .../education/action/AddCollegeAction.java | 2 +- .../education/action/AddSpecialtyAction.java | 2 +- .../education/action/AddUniversityAction.java | 2 +- .../education/action/UpdateCollegeAction.java | 46 +++ .../action/UpdateSpecialtyAction.java | 45 +++ .../action/UpdateUniversityAction.java | 46 +++ .../CourseInformationLabelProvider.java | 6 +- .../education/service/CollegeServiceImpl.java | 202 +++++------ .../education/service/ICollegeService.java | 76 ++-- .../education/service/ISpecialtyService.java | 82 ++--- .../education/service/IUniversityService.java | 2 + .../service/UniversityServiceImpl.java | 15 + .../education/view/DepartmentExploreView.java | 38 +- src/educationschedule/Activator.java | 123 +++---- src/educationschedule/Perspective.java | 3 +- 37 files changed, 1444 insertions(+), 267 deletions(-) create mode 100644 icons/book.gif create mode 100644 icons/gameboard.gif create mode 100644 icons/meBook.gif create mode 100644 icons/movingBox.gif create mode 100644 icons/newBook.gif create mode 100644 icons/remove.gif create mode 100644 lib/._RXTXcomm.jar7894315756722313710.tmp create mode 100644 src/cbg/article/model/BoardGame.java create mode 100644 src/cbg/article/model/Book.java create mode 100644 src/cbg/article/model/DeltaEvent.java create mode 100644 src/cbg/article/model/IDeltaListener.java create mode 100644 src/cbg/article/model/IModelVisitor.java create mode 100644 src/cbg/article/model/Model.java create mode 100644 src/cbg/article/model/MovingBox.java create mode 100644 src/cbg/article/model/NullDeltaListener.java create mode 100644 src/cbg/article/treeviewer/ui/BoardgameFilter.java create mode 100644 src/cbg/article/treeviewer/ui/BookBoxBoardSorter.java create mode 100644 src/cbg/article/treeviewer/ui/MovingBoxContentProvider.java create mode 100644 src/cbg/article/treeviewer/ui/MovingBoxLabelProvider.java create mode 100644 src/cbg/article/treeviewer/ui/MovingBoxView.java create mode 100644 src/cbg/article/treeviewer/ui/NoArticleSorter.java create mode 100644 src/cbg/article/treeviewer/ui/ThreeItemFilter.java create mode 100644 src/cn/edu/hit/education/action/UpdateCollegeAction.java create mode 100644 src/cn/edu/hit/education/action/UpdateSpecialtyAction.java create mode 100644 src/cn/edu/hit/education/action/UpdateUniversityAction.java diff --git a/icons/book.gif b/icons/book.gif new file mode 100644 index 0000000000000000000000000000000000000000..f6c03e121013f1972d23b73d40ab04ecbf8fe518 GIT binary patch literal 194 zcmZ?wbhEHb6krfwc+9|X@BZF7^X9ZPwOH2fjheSNDmKb8cFzC*|M%YC3nVdt;y+R6 zqSVBa)D(sC%#sX+kc?CXcTe8{2F0H&j9d)-3_1)z05Y6`CG5jVO-F&otZsJAStYD; ziA@U=)}>DfTxBT{SGZuZm2&&XyHZmhHZ1sCAT;+QOUuSEvnR^mdf4XsXihZ{5Menh eb6uK2=G>(N;s^4WmjpM)#I4xx^uv>d!5RSk+*kzw literal 0 HcmV?d00001 diff --git a/icons/gameboard.gif b/icons/gameboard.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ed371657160f4ea90f6ee3089b675a4a2881974 GIT binary patch literal 168 zcmZ?wbhEHb6krfwc+9}?;>3&tJr*xkc>LJn(UD@nz`$@|Ma7RL4L|<;_>T=J{$yd~ zV&G@c0jdO=Ai%)D68hn!=V}&~y zUwE{zZCCuqP-zLC_UA(4JQ4yO+DTojGPlM!mFny%oxf$v%mu3KXZ_aX*qLv7w~~Xw F8URH!PYnP7 literal 0 HcmV?d00001 diff --git a/icons/meBook.gif b/icons/meBook.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8e13c27542fb5bd9c8e61c22749c6d2a5442197 GIT binary patch literal 315 zcmZ?wbhEHb6krfwSjxaq9cft^Zdnm#SsrTn{ZjFl^93bAmZia#A5Z4KKbBqSZ&?&z z`TAh`%e|@jzLrmSBtG5}pW|iuV13NJ)sdO*mbaFL-B=uw=3<%dYI$XDz@=G!$&QvO zPL}7VdY_r-kzi+;Xm1&BYZ+^8xwn!gNbx5NBNu}`gAM}_fc(V37I9#HfrpM%|A{4n z0s=fOKFb3gG$dL=R)1{p&}fNSUwAOXq9tYX#g7dxEjil_m1YLCl8MYXBadGCcqQ literal 0 HcmV?d00001 diff --git a/icons/newBook.gif b/icons/newBook.gif new file mode 100644 index 0000000000000000000000000000000000000000..9a3b1ad6329f0083d6a4008db8e459248473a390 GIT binary patch literal 189 zcmZ?wbhEHb6krfwc+9|X@BZF7^X9ZPwOH2fjheSNDmH3Yy314s2Futv|A9b);eTJ; z-urvsi81^SU;qjz{$yd~V&G@cVE_V<84N60A5MBY3N&VQvun;OVUB0ezHLDzl{@qz)$clA{M&d~Lyvck ov+p%WM@NNaE7(3UC>$*Be#X$)#84;1)ZW3`rLWk_FUVjG0H1bCC;$Ke literal 0 HcmV?d00001 diff --git a/icons/remove.gif b/icons/remove.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f647666d3246d97b6e5471736ad102ab4fe2d9e GIT binary patch literal 143 zcmZ?wbhEHb6krfw*v!E2pMjwPNZQ-qx3}MKZ$BT%m_Psi{{8>|17)xP#h)yU3=A9$ zIv_ca84N5o0w+CJ@3n{*?ylU1t(AAR;DlBM~ZSEi-q53?|FTE@ea0@ Z#!u6n*|vHWalV)VF1^`wJD^>si literal 0 HcmV?d00001 diff --git a/lib/._RXTXcomm.jar7894315756722313710.tmp b/lib/._RXTXcomm.jar7894315756722313710.tmp new file mode 100644 index 0000000000000000000000000000000000000000..e1e75034a3841c4382dc220a3ebc75a5dcc92113 GIT binary patch literal 60984 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%0De^ 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 literal 0 HcmV?d00001 diff --git a/src/cbg/article/model/BoardGame.java b/src/cbg/article/model/BoardGame.java new file mode 100644 index 0000000..c6b5040 --- /dev/null +++ b/src/cbg/article/model/BoardGame.java @@ -0,0 +1,20 @@ +package cbg.article.model; +public class BoardGame extends Model { + + public BoardGame(String title, String authorGivenName, String authorSirName) { + super(title, authorGivenName, authorSirName); + } + + + + + + + /* + * @see Model#accept(ModelVisitorI, Object) + */ + public void accept(IModelVisitor visitor, Object passAlongArgument) { + visitor.visitBoardgame(this, passAlongArgument); + } + +} diff --git a/src/cbg/article/model/Book.java b/src/cbg/article/model/Book.java new file mode 100644 index 0000000..0b66a40 --- /dev/null +++ b/src/cbg/article/model/Book.java @@ -0,0 +1,78 @@ +package cbg.article.model; + +import java.util.ArrayList; +import java.util.List; + +public class Book extends Model { + protected static List newBooks = buildBookList(); + protected static int cursor = 0; + + public Book(String title, String authorGivenName, String authorSirName) { + super(title, authorGivenName, authorSirName); + } + + + + + public static Book newBook() { + Book newBook = (Book)newBooks.get(cursor); + cursor = ((cursor + 1) % newBooks.size()); + return newBook; + } + + + protected static List buildBookList() { + newBooks = new ArrayList(); + Book[] books = new Book[] { + new Book("Advanced Java: Idioms, Pitfalls, Styles and Programming Tips", "Chris", "Laffra"), + new Book("Programming Ruby: A Pragmatic Programmer's Guide", "David", "Thomas"), + new Book("The Pragmatic Programmer", "Andrew", "Hunt"), + new Book("Java Virtual Machine", "Jon", "Meyer"), + new Book("Using Netscape IFC", "Arun", "Rao"), + new Book("Smalltalk-80", "Adele", "Goldberg"), + new Book("Cold Mountain", "Charles", "Frazier"), + new Book("Software Development Using Eiffel", "Richard", "Wiener"), + new Book("Winter's Heart", "Robert", "Jordan"), + new Book("Ender's Game", "Orson Scott", "Card"), + new Book("Castle", "David", "Macaulay"), + new Book("Cranberry Thanksgiving", "Wende", "Devlin"), + new Book("The Biggest Bear", "Lynd", "Ward"), + new Book("The Boxcar Children", "Gertrude Chandler", "Warner"), + new Book("BASIC Fun with Adventure Games", "Susan Drake", "Lipscomb"), + new Book("Bridge to Terabithia", "Katherine", "Paterson"), + new Book("One Renegade Cell", "Robert A.", "Weinberg"), + new Book("Programming Internet Mail", "David", "Wood"), + new Book("Refactoring", "Martin", "Fowler"), + new Book("Effective Java", "Joshua", "Bloch"), + new Book("Cutting-Edge Java Game Programming", "Neil", "Bartlett"), + new Book("The C Programming Language", "Brian W.", "Kernighan"), + new Book("The Design and Analysis of Spatial Data Structures", "Hanan", "Samet"), + new Book("Object-Oriented Programming", "Brad", "Cox"), + new Book("Python Essential Reference", "David M.", "Beazley"), + new Book("The Practical SQL Handbook", "Judith S.", "Bowman"), + new Book("The Design Patterns Smalltalk Companion", "Sherman R.", "Alpert"), + new Book("Design Patterns", "Erich", "Gamma"), + new Book("Gig", "John", "Bowe"), + new Book("You Can't Be Too Careful", "David Pryce", "Jones"), + new Book("Go for Beginners", "Kaoru", "Iwamoto"), + new Book("How to Read a Book", "Mortimer J.", "Adler"), + new Book("The Message", "Eugene H.", "Peterson"), + new Book("Beyond Bumper Sticker Ethics", "Steve", "Wilkens"), + new Book("Life Together", "Dietrich", "Bonhoeffer"), + new Book("Java 2 Exam Cram", "William", "Brogden") + }; + + for (int i = 0; i < books.length; i++) { + newBooks.add(books[i]); + + } + return newBooks; + } + /* + * @see Model#accept(ModelVisitorI, Object) + */ + public void accept(IModelVisitor visitor, Object passAlongArgument) { + visitor.visitBook(this, passAlongArgument); + } + +} diff --git a/src/cbg/article/model/DeltaEvent.java b/src/cbg/article/model/DeltaEvent.java new file mode 100644 index 0000000..c7943e0 --- /dev/null +++ b/src/cbg/article/model/DeltaEvent.java @@ -0,0 +1,13 @@ +package cbg.article.model; + +public class DeltaEvent { + protected Object actedUpon; + + public DeltaEvent(Object receiver) { + actedUpon = receiver; + } + + public Object receiver() { + return actedUpon; + } +} diff --git a/src/cbg/article/model/IDeltaListener.java b/src/cbg/article/model/IDeltaListener.java new file mode 100644 index 0000000..b34ef74 --- /dev/null +++ b/src/cbg/article/model/IDeltaListener.java @@ -0,0 +1,5 @@ +package cbg.article.model; +public interface IDeltaListener { + public void add(DeltaEvent event); + public void remove(DeltaEvent event); +} diff --git a/src/cbg/article/model/IModelVisitor.java b/src/cbg/article/model/IModelVisitor.java new file mode 100644 index 0000000..da8ba88 --- /dev/null +++ b/src/cbg/article/model/IModelVisitor.java @@ -0,0 +1,9 @@ +package cbg.article.model; + + + +public interface IModelVisitor { + public void visitMovingBox(MovingBox box, Object passAlongArgument); + public void visitBook(Book book, Object passAlongArgument); + public void visitBoardgame(BoardGame boardgame, Object passAlongArgument); +} diff --git a/src/cbg/article/model/Model.java b/src/cbg/article/model/Model.java new file mode 100644 index 0000000..c899fec --- /dev/null +++ b/src/cbg/article/model/Model.java @@ -0,0 +1,65 @@ +package cbg.article.model; +public abstract class Model { + protected MovingBox parent; + protected String name; + protected String authorGivenName, authorSirName; + protected IDeltaListener listener = NullDeltaListener.getSoleInstance(); + + protected void fireAdd(Object added) { + listener.add(new DeltaEvent(added)); + } + + protected void fireRemove(Object removed) { + listener.remove(new DeltaEvent(removed)); + } + + public void setName(String name) { + this.name = name; + } + + public MovingBox getParent() { + return parent; + } + + /* The receiver should visit the toVisit object and + * pass along the argument. */ + public abstract void accept(IModelVisitor visitor, Object passAlongArgument); + + public String getName() { + return name; + } + + public void addListener(IDeltaListener listener) { + this.listener = listener; + } + + public Model(String title, String authorGivenName, String authorSirName) { + this.name = title; + this.authorGivenName = authorGivenName; + this.authorSirName = authorSirName; + } + + public Model() { + } + + public void removeListener(IDeltaListener listener) { + if(this.listener.equals(listener)) { + this.listener = NullDeltaListener.getSoleInstance(); + } + } + + public String authorGivenName() { + return authorGivenName; + } + + + public String authorSirName() { + return authorSirName; + } + + public String getTitle() { + return name; + } + + +} diff --git a/src/cbg/article/model/MovingBox.java b/src/cbg/article/model/MovingBox.java new file mode 100644 index 0000000..fcd08dc --- /dev/null +++ b/src/cbg/article/model/MovingBox.java @@ -0,0 +1,152 @@ +package cbg.article.model; + +import java.util.ArrayList; +import java.util.List; + +public class MovingBox extends Model { + protected List boxes; + protected List games; + protected List books; + + private static IModelVisitor adder = new Adder(); + private static IModelVisitor remover = new Remover(); + + public MovingBox() { + boxes = new ArrayList(); + games = new ArrayList(); + books = new ArrayList(); + } + + private static class Adder implements IModelVisitor { + + /* + * @see ModelVisitorI#visitBoardgame(BoardGame) + */ + + /* + * @see ModelVisitorI#visitBook(MovingBox) + */ + + /* + * @see ModelVisitorI#visitMovingBox(MovingBox) + */ + + /* + * @see ModelVisitorI#visitBoardgame(BoardGame, Object) + */ + public void visitBoardgame(BoardGame boardgame, Object argument) { + ((MovingBox) argument).addBoardGame(boardgame); + } + + /* + * @see ModelVisitorI#visitBook(MovingBox, Object) + */ + public void visitBook(Book book, Object argument) { + ((MovingBox) argument).addBook(book); + } + + /* + * @see ModelVisitorI#visitMovingBox(MovingBox, Object) + */ + public void visitMovingBox(MovingBox box, Object argument) { + ((MovingBox) argument).addBox(box); + } + + } + + private static class Remover implements IModelVisitor { + public void visitBoardgame(BoardGame boardgame, Object argument) { + ((MovingBox) argument).removeBoardGame(boardgame); + } + + /* + * @see ModelVisitorI#visitBook(MovingBox, Object) + */ + public void visitBook(Book book, Object argument) { + ((MovingBox) argument).removeBook(book); + } + + /* + * @see ModelVisitorI#visitMovingBox(MovingBox, Object) + */ + public void visitMovingBox(MovingBox box, Object argument) { + ((MovingBox) argument).removeBox(box); + box.addListener(NullDeltaListener.getSoleInstance()); + } + + } + + public MovingBox(String name) { + this(); + this.name = name; + } + + public List getBoxes() { + return boxes; + } + + protected void addBox(MovingBox box) { + boxes.add(box); + box.parent = this; + fireAdd(box); + } + + protected void addBook(Book book) { + books.add(book); + book.parent = this; + fireAdd(book); + } + + protected void addBoardGame(BoardGame game) { + games.add(game); + game.parent = this; + fireAdd(game); + } + + public List getBooks() { + return books; + } + + public void remove(Model toRemove) { + toRemove.accept(remover, this); + } + + protected void removeBoardGame(BoardGame boardGame) { + games.remove(boardGame); + boardGame.addListener(NullDeltaListener.getSoleInstance()); + fireRemove(boardGame); + } + + protected void removeBook(Book book) { + books.remove(book); + book.addListener(NullDeltaListener.getSoleInstance()); + fireRemove(book); + } + + protected void removeBox(MovingBox box) { + boxes.remove(box); + box.addListener(NullDeltaListener.getSoleInstance()); + fireRemove(box); + } + + public void add(Model toAdd) { + toAdd.accept(adder, this); + } + + public List getGames() { + return games; + } + + /** Answer the total number of items the + * receiver contains. */ + public int size() { + return getBooks().size() + getBoxes().size() + getGames().size(); + } + /* + * @see Model#accept(ModelVisitorI, Object) + */ + public void accept(IModelVisitor visitor, Object passAlongArgument) { + visitor.visitMovingBox(this, passAlongArgument); + } + +} diff --git a/src/cbg/article/model/NullDeltaListener.java b/src/cbg/article/model/NullDeltaListener.java new file mode 100644 index 0000000..e6fca56 --- /dev/null +++ b/src/cbg/article/model/NullDeltaListener.java @@ -0,0 +1,18 @@ +package cbg.article.model; +public class NullDeltaListener implements IDeltaListener { + protected static NullDeltaListener soleInstance = new NullDeltaListener(); + public static NullDeltaListener getSoleInstance() { + return soleInstance; + } + + /* + * @see IDeltaListener#add(DeltaEvent) + */ + public void add(DeltaEvent event) {} + + /* + * @see IDeltaListener#remove(DeltaEvent) + */ + public void remove(DeltaEvent event) {} + +} diff --git a/src/cbg/article/treeviewer/ui/BoardgameFilter.java b/src/cbg/article/treeviewer/ui/BoardgameFilter.java new file mode 100644 index 0000000..1f0fba5 --- /dev/null +++ b/src/cbg/article/treeviewer/ui/BoardgameFilter.java @@ -0,0 +1,18 @@ +package cbg.article.treeviewer.ui; + +import cbg.article.model.BoardGame; +import cbg.article.model.MovingBox; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; + +public class BoardgameFilter extends ViewerFilter { + + /* + * @see ViewerFilter#select(Viewer, Object, Object) + */ + public boolean select(Viewer viewer, Object parentElement, Object element) { + return element instanceof BoardGame || element instanceof MovingBox; + } + +} diff --git a/src/cbg/article/treeviewer/ui/BookBoxBoardSorter.java b/src/cbg/article/treeviewer/ui/BookBoxBoardSorter.java new file mode 100644 index 0000000..1c97433 --- /dev/null +++ b/src/cbg/article/treeviewer/ui/BookBoxBoardSorter.java @@ -0,0 +1,21 @@ +package cbg.article.treeviewer.ui; + +import cbg.article.model.Book; +import cbg.article.model.MovingBox; + +import org.eclipse.jface.viewers.ViewerSorter; + +public class BookBoxBoardSorter extends ViewerSorter { + + /* + * @see ViewerSorter#category(Object) + */ + /** Orders the items in such a way that books appear + * before moving boxes, which appear before board games. */ + public int category(Object element) { + if(element instanceof Book) return 1; + if(element instanceof MovingBox) return 2; + return 3; + } + +} diff --git a/src/cbg/article/treeviewer/ui/MovingBoxContentProvider.java b/src/cbg/article/treeviewer/ui/MovingBoxContentProvider.java new file mode 100644 index 0000000..dd386be --- /dev/null +++ b/src/cbg/article/treeviewer/ui/MovingBoxContentProvider.java @@ -0,0 +1,138 @@ +package cbg.article.treeviewer.ui; + +import java.util.Iterator; + +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; + +import cbg.article.model.Book; +import cbg.article.model.DeltaEvent; +import cbg.article.model.IDeltaListener; +import cbg.article.model.Model; +import cbg.article.model.IModelVisitor; +import cbg.article.model.MovingBox; + +public class MovingBoxContentProvider implements ITreeContentProvider, IDeltaListener { + private static Object[] EMPTY_ARRAY = new Object[0]; + protected TreeViewer viewer; + + /* + * @see IContentProvider#dispose() + */ + public void dispose() {} + + /* + * @see IContentProvider#inputChanged(Viewer, Object, Object) + */ + /** + * Notifies this content provider that the given viewer's input + * has been switched to a different element. + *

+ * A typical use for this method is registering the content provider as a listener + * to changes on the new input (using model-specific means), and deregistering the viewer + * from the old input. In response to these change notifications, the content provider + * propagates the changes to the viewer. + *

+ * + * @param viewer the viewer + * @param oldInput the old input element, or null if the viewer + * did not previously have an input + * @param newInput the new input element, or null if the viewer + * does not have an input + */ + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + this.viewer = (TreeViewer)viewer; + if(oldInput != null) { + removeListenerFrom((MovingBox)oldInput); + } + if(newInput != null) { + addListenerTo((MovingBox)newInput); + } + } + + /** Because the domain model does not have a richer + * listener model, recursively remove this listener + * from each child box of the given box. */ + protected void removeListenerFrom(MovingBox box) { + box.removeListener(this); + for (Iterator iterator = box.getBoxes().iterator(); iterator.hasNext();) { + MovingBox aBox = (MovingBox) iterator.next(); + removeListenerFrom(aBox); + } + } + + /** Because the domain model does not have a richer + * listener model, recursively add this listener + * to each child box of the given box. */ + protected void addListenerTo(MovingBox box) { + box.addListener(this); + for (Iterator iterator = box.getBoxes().iterator(); iterator.hasNext();) { + MovingBox aBox = (MovingBox) iterator.next(); + addListenerTo(aBox); + } + } + + + + + /* + * @see ITreeContentProvider#getChildren(Object) + */ + public Object[] getChildren(Object parentElement) { + if(parentElement instanceof MovingBox) { + MovingBox box = (MovingBox)parentElement; + return concat(box.getBoxes().toArray(), + box.getBooks().toArray(), box.getGames().toArray()); + } + return EMPTY_ARRAY; + } + + protected Object[] concat(Object[] object, Object[] more, Object[] more2) { + Object[] both = new Object[object.length + more.length + more2.length]; + System.arraycopy(object, 0, both, 0, object.length); + System.arraycopy(more, 0, both, object.length, more.length); + System.arraycopy(more2, 0, both, object.length + more.length, more2.length); + return both; + } + + /* + * @see ITreeContentProvider#getParent(Object) + */ + public Object getParent(Object element) { + if(element instanceof Model) { + return ((Model)element).getParent(); + } + return null; + } + + /* + * @see ITreeContentProvider#hasChildren(Object) + */ + public boolean hasChildren(Object element) { + return getChildren(element).length > 0; + } + + /* + * @see IStructuredContentProvider#getElements(Object) + */ + public Object[] getElements(Object inputElement) { + return getChildren(inputElement); + } + + /* + * @see IDeltaListener#add(DeltaEvent) + */ + public void add(DeltaEvent event) { + Object movingBox = ((Model)event.receiver()).getParent(); + viewer.refresh(movingBox, false); + } + + /* + * @see IDeltaListener#remove(DeltaEvent) + */ + public void remove(DeltaEvent event) { + add(event); + } + +} diff --git a/src/cbg/article/treeviewer/ui/MovingBoxLabelProvider.java b/src/cbg/article/treeviewer/ui/MovingBoxLabelProvider.java new file mode 100644 index 0000000..a667ffb --- /dev/null +++ b/src/cbg/article/treeviewer/ui/MovingBoxLabelProvider.java @@ -0,0 +1,77 @@ +package cbg.article.treeviewer.ui; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import cbg.article.model.BoardGame; +import cbg.article.model.Book; +import cbg.article.model.MovingBox; +import educationschedule.Activator; + +public class MovingBoxLabelProvider extends LabelProvider { + private Map imageCache = new HashMap(11); + + /* + * @see ILabelProvider#getImage(Object) + */ + public Image getImage(Object element) { + ImageDescriptor descriptor = null; + if (element instanceof MovingBox) { + descriptor = AbstractUIPlugin.imageDescriptorFromPlugin( + Activator.PLUGIN_ID, "icons/movingBox.gif"); + } else if (element instanceof Book) { + descriptor = AbstractUIPlugin.imageDescriptorFromPlugin( + Activator.PLUGIN_ID, "icons/book.gif"); + } else if (element instanceof BoardGame) { + descriptor = AbstractUIPlugin.imageDescriptorFromPlugin( + Activator.PLUGIN_ID, "icons/gameboard.gif"); + } else { + throw unknownElement(element); + } + + //obtain the cached image corresponding to the descriptor + Image image = (Image)imageCache.get(descriptor); + if (image == null) { + image = descriptor.createImage(); + imageCache.put(descriptor, image); + } + return image; + } + + /* + * @see ILabelProvider#getText(Object) + */ + public String getText(Object element) { + if (element instanceof MovingBox) { + if(((MovingBox)element).getName() == null) { + return "Box"; + } else { + return ((MovingBox)element).getName(); + } + } else if (element instanceof Book) { + return ((Book)element).getTitle(); + } else if (element instanceof BoardGame) { + return ((BoardGame)element).getTitle(); + } else { + throw unknownElement(element); + } + } + + public void dispose() { + for (Iterator i = imageCache.values().iterator(); i.hasNext();) { + ((Image) i.next()).dispose(); + } + imageCache.clear(); + } + + protected RuntimeException unknownElement(Object element) { + return new RuntimeException("Unknown type of element in tree of type " + element.getClass().getName()); + } + +} diff --git a/src/cbg/article/treeviewer/ui/MovingBoxView.java b/src/cbg/article/treeviewer/ui/MovingBoxView.java new file mode 100644 index 0000000..c1b9e2f --- /dev/null +++ b/src/cbg/article/treeviewer/ui/MovingBoxView.java @@ -0,0 +1,337 @@ +package cbg.article.treeviewer.ui; + +import java.util.Iterator; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.part.ViewPart; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import cbg.article.model.BoardGame; +import cbg.article.model.Book; +import cbg.article.model.Model; +import cbg.article.model.MovingBox; +import educationschedule.Activator; + +/** + * Insert the type's description here. + * @see ViewPart + */ +public class MovingBoxView extends ViewPart { + public static final String ID = "cbg.article.treeviewer.ui.MovingBoxView"; + protected TreeViewer treeViewer; + protected Text text; + protected MovingBoxLabelProvider labelProvider; + + protected Action onlyBoardGamesAction, atLeatThreeItems; + protected Action booksBoxesGamesAction, noArticleAction; + protected Action addBookAction, removeAction; + protected ViewerFilter onlyBoardGamesFilter, atLeastThreeFilter; + protected ViewerSorter booksBoxesGamesSorter, noArticleSorter; + + protected MovingBox root; + + /** + * The constructor. + */ + public MovingBoxView() { + } + + /* + * @see IWorkbenchPart#createPartControl(Composite) + */ + public void createPartControl(Composite parent) { + /* Create a grid layout object so the text and treeviewer + * are layed out the way I want. */ + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + layout.verticalSpacing = 2; + layout.marginWidth = 0; + layout.marginHeight = 2; + parent.setLayout(layout); + + /* Create a "label" to display information in. I'm + * using a text field instead of a lable so you can + * copy-paste out of it. */ + text = new Text(parent, SWT.READ_ONLY | SWT.SINGLE | SWT.BORDER); + // layout the text field above the treeviewer + GridData layoutData = new GridData(); + layoutData.grabExcessHorizontalSpace = true; + layoutData.horizontalAlignment = GridData.FILL; + text.setLayoutData(layoutData); + + // Create the tree viewer as a child of the composite parent + treeViewer = new TreeViewer(parent); + treeViewer.setContentProvider(new MovingBoxContentProvider()); + labelProvider = new MovingBoxLabelProvider(); + treeViewer.setLabelProvider(labelProvider); + + treeViewer.setUseHashlookup(true); + + // layout the tree viewer below the text field + layoutData = new GridData(); + layoutData.grabExcessHorizontalSpace = true; + layoutData.grabExcessVerticalSpace = true; + layoutData.horizontalAlignment = GridData.FILL; + layoutData.verticalAlignment = GridData.FILL; + treeViewer.getControl().setLayoutData(layoutData); + + // Create menu, toolbars, filters, sorters. + createFiltersAndSorters(); + createActions(); + createMenus(); + createToolbar(); + hookListeners(); + + treeViewer.setInput(getInitalInput()); + treeViewer.expandAll(); + } + + protected void createFiltersAndSorters() { + atLeastThreeFilter = new ThreeItemFilter(); + onlyBoardGamesFilter = new BoardgameFilter(); + booksBoxesGamesSorter = new BookBoxBoardSorter(); + noArticleSorter = new NoArticleSorter(); + } + + protected void hookListeners() { + treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + // if the selection is empty clear the label + if(event.getSelection().isEmpty()) { + text.setText(""); + return; + } + if(event.getSelection() instanceof IStructuredSelection) { + IStructuredSelection selection = (IStructuredSelection)event.getSelection(); + StringBuffer toShow = new StringBuffer(); + for (Iterator iterator = selection.iterator(); iterator.hasNext();) { + Object domain = (Model) iterator.next(); + String value = labelProvider.getText(domain); + toShow.append(value); + toShow.append(", "); + } + // remove the trailing comma space pair + if(toShow.length() > 0) { + toShow.setLength(toShow.length() - 2); + } + text.setText(toShow.toString()); + } + } + }); + } + + protected void createActions() { + onlyBoardGamesAction = new Action("Only Board Games") { + public void run() { + updateFilter(onlyBoardGamesAction); + } + }; + onlyBoardGamesAction.setChecked(false); + + atLeatThreeItems = new Action("Boxes With At Least Three Items") { + public void run() { + updateFilter(atLeatThreeItems); + } + }; + atLeatThreeItems.setChecked(false); + + booksBoxesGamesAction = new Action("Books, Boxes, Games") { + public void run() { + updateSorter(booksBoxesGamesAction); + } + }; + booksBoxesGamesAction.setChecked(false); + + noArticleAction = new Action("Ignoring Articles") { + public void run() { + updateSorter(noArticleAction); + } + }; + noArticleAction.setChecked(false); + + addBookAction = new Action("Add Book") { + public void run() { + addNewBook(); + } + }; + addBookAction.setToolTipText("Add a New Book"); + addBookAction.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin( + Activator.PLUGIN_ID, "icons/newBook.gif")); + + removeAction = new Action("Delete") { + public void run() { + removeSelected(); + } + }; + removeAction.setToolTipText("Delete"); + removeAction.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin( + Activator.PLUGIN_ID, "icons/remove.gif")); + } + + /** Add a new book to the selected moving box. + * If a moving box is not selected, use the selected + * obect's moving box. + * + * If nothing is selected add to the root. */ + protected void addNewBook() { + MovingBox receivingBox; + if (treeViewer.getSelection().isEmpty()) { + receivingBox = root; + } else { + IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); + Model selectedDomainObject = (Model) selection.getFirstElement(); + if (!(selectedDomainObject instanceof MovingBox)) { + receivingBox = selectedDomainObject.getParent(); + } else { + receivingBox = (MovingBox) selectedDomainObject; + } + } + receivingBox.add(Book.newBook()); + } + + /** Remove the selected domain object(s). + * If multiple objects are selected remove all of them. + * + * If nothing is selected do nothing. */ + protected void removeSelected() { + if (treeViewer.getSelection().isEmpty()) { + return; + } + IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); + /* Tell the tree to not redraw until we finish + * removing all the selected children. */ + treeViewer.getTree().setRedraw(false); + for (Iterator iterator = selection.iterator(); iterator.hasNext();) { + Model model = (Model) iterator.next(); + MovingBox parent = model.getParent(); + parent.remove(model); + } + treeViewer.getTree().setRedraw(true); + } + + protected void createMenus() { + IMenuManager rootMenuManager = getViewSite().getActionBars().getMenuManager(); + rootMenuManager.setRemoveAllWhenShown(true); + rootMenuManager.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager mgr) { + fillMenu(mgr); + } + }); + fillMenu(rootMenuManager); + } + + + protected void fillMenu(IMenuManager rootMenuManager) { + IMenuManager filterSubmenu = new MenuManager("Filters"); + rootMenuManager.add(filterSubmenu); + filterSubmenu.add(onlyBoardGamesAction); + filterSubmenu.add(atLeatThreeItems); + + IMenuManager sortSubmenu = new MenuManager("Sort By"); + rootMenuManager.add(sortSubmenu); + sortSubmenu.add(booksBoxesGamesAction); + sortSubmenu.add(noArticleAction); + } + + + + protected void updateSorter(Action action) { + if(action == booksBoxesGamesAction) { + noArticleAction.setChecked(!booksBoxesGamesAction.isChecked()); + if(action.isChecked()) { + treeViewer.setSorter(booksBoxesGamesSorter); + } else { + treeViewer.setSorter(null); + } + } else if(action == noArticleAction) { + booksBoxesGamesAction.setChecked(!noArticleAction.isChecked()); + if(action.isChecked()) { + treeViewer.setSorter(noArticleSorter); + } else { + treeViewer.setSorter(null); + } + } + + } + + /* Multiple filters can be enabled at a time. */ + protected void updateFilter(Action action) { + if(action == atLeatThreeItems) { + if(action.isChecked()) { + treeViewer.addFilter(atLeastThreeFilter); + } else { + treeViewer.removeFilter(atLeastThreeFilter); + } + } else if(action == onlyBoardGamesAction) { + if(action.isChecked()) { + treeViewer.addFilter(onlyBoardGamesFilter); + } else { + treeViewer.removeFilter(onlyBoardGamesFilter); + } + } + } + + protected void createToolbar() { + IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager(); + toolbarManager.add(addBookAction); + toolbarManager.add(removeAction); + } + + + public MovingBox getInitalInput() { + root = new MovingBox(); + MovingBox someBooks = new MovingBox("Books"); + MovingBox games = new MovingBox("Games"); + MovingBox books = new MovingBox("More books"); + MovingBox games2 = new MovingBox("More games"); + + root.add(someBooks); + root.add(games); + root.add(new MovingBox()); + + someBooks.add(books); + games.add(games2); + + books.add(new Book("The Lord of the Rings", "J.R.R.", "Tolkien")); + books.add(new BoardGame("Taj Mahal", "Reiner", "Knizia")); + books.add(new Book("Cryptonomicon", "Neal", "Stephenson")); + books.add(new Book("Smalltalk, Objects, and Design", "Chamond", "Liu")); + books.add(new Book("A Game of Thrones", "George R. R.", " Martin")); + books.add(new Book("The Hacker Ethic", "Pekka", "Himanen")); + //books.add(new MovingBox()); + + books.add(new Book("The Code Book", "Simon", "Singh")); + books.add(new Book("The Chronicles of Narnia", "C. S.", "Lewis")); + books.add(new Book("The Screwtape Letters", "C. S.", "Lewis")); + books.add(new Book("Mere Christianity ", "C. S.", "Lewis")); + games.add(new BoardGame("Tigris & Euphrates", "Reiner", "Knizia")); + games.add(new BoardGame("La Citta", "Gerd", "Fenchel")); + games.add(new BoardGame("El Grande", "Wolfgang", "Kramer")); + games.add(new BoardGame("The Princes of Florence", "Richard", "Ulrich")); + games.add(new BoardGame("The Traders of Genoa", "Rudiger", "Dorn")); + games2.add(new BoardGame("Tikal", "M.", "Kiesling")); + games2.add(new BoardGame("Modern Art", "Reiner", "Knizia")); + return root; + } + + /* + * @see IWorkbenchPart#setFocus() + */ + public void setFocus() {} + +} diff --git a/src/cbg/article/treeviewer/ui/NoArticleSorter.java b/src/cbg/article/treeviewer/ui/NoArticleSorter.java new file mode 100644 index 0000000..969e022 --- /dev/null +++ b/src/cbg/article/treeviewer/ui/NoArticleSorter.java @@ -0,0 +1,52 @@ +package cbg.article.treeviewer.ui; + +import org.eclipse.jface.viewers.ContentViewer; +import org.eclipse.jface.viewers.IBaseLabelProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; + +public class NoArticleSorter extends ViewerSorter { /* + * @see ViewerSorter#compare(Viewer, Object, Object) + */ + public int compare(Viewer viewer, Object e1, Object e2) { + int cat1 = category(e1); + int cat2 = category(e2); + if (cat1 != cat2) return cat1 - cat2; + String name1, name2; + if (viewer == null || !(viewer instanceof ContentViewer)) { + name1 = e1.toString(); + name2 = e2.toString(); + } else { + IBaseLabelProvider prov = ((ContentViewer)viewer).getLabelProvider(); + if (prov instanceof ILabelProvider) { + ILabelProvider lprov = (ILabelProvider)prov; + name1 = lprov.getText(e1); + name2 = lprov.getText(e2); + } else { + name1 = e1.toString(); + name2 = e2.toString(); + } + } + if(name1 == null) name1 = ""; + if(name2 == null) name2 = ""; + name1 = stripArticles(name1); + name2 = stripArticles(name2); + return collator.compare(name1, name2); + } + + protected String stripArticles(String name) { + String test = name.toLowerCase(); + if(test.startsWith("the ") && test.length() > 3) { + return name.substring(4); + } else if(test.startsWith("a ") && test.length() > 1) { + return name.substring(2); + } else if(test.startsWith("el ") && test.length() > 2) { + return name.substring(3); + } else if(test.startsWith("la ") && test.length() > 2) { + return name.substring(3); + } + return name; + } + +} diff --git a/src/cbg/article/treeviewer/ui/ThreeItemFilter.java b/src/cbg/article/treeviewer/ui/ThreeItemFilter.java new file mode 100644 index 0000000..26a7915 --- /dev/null +++ b/src/cbg/article/treeviewer/ui/ThreeItemFilter.java @@ -0,0 +1,18 @@ +package cbg.article.treeviewer.ui; + +import cbg.article.model.BoardGame; +import cbg.article.model.MovingBox; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; + +public class ThreeItemFilter extends ViewerFilter { + + /* + * @see ViewerFilter#select(Viewer, Object, Object) + */ + public boolean select(Viewer viewer, Object parentElement, Object element) { + return parentElement instanceof MovingBox && ((MovingBox)parentElement).size() >= 3; + } + +} diff --git a/src/cn/edu/hit/education/action/AddCollegeAction.java b/src/cn/edu/hit/education/action/AddCollegeAction.java index b44db96..ccdadd7 100644 --- a/src/cn/edu/hit/education/action/AddCollegeAction.java +++ b/src/cn/edu/hit/education/action/AddCollegeAction.java @@ -39,7 +39,7 @@ public class AddCollegeAction extends Action { college.setUniversityId(universityId); int count = collegeService.insert(college); if(count > 0){ - viewPart.refreshData(college); + viewPart.refreshNewData(college); } } super.run(); diff --git a/src/cn/edu/hit/education/action/AddSpecialtyAction.java b/src/cn/edu/hit/education/action/AddSpecialtyAction.java index 89c8a9a..e5ebf21 100644 --- a/src/cn/edu/hit/education/action/AddSpecialtyAction.java +++ b/src/cn/edu/hit/education/action/AddSpecialtyAction.java @@ -38,7 +38,7 @@ public class AddSpecialtyAction extends Action { specialty.setCollegeId(collegeId); int count = specialtyService.insert(specialty); if(count > 0){ - viewPart.refreshData(specialty); + viewPart.refreshNewData(specialty); } } super.run(); diff --git a/src/cn/edu/hit/education/action/AddUniversityAction.java b/src/cn/edu/hit/education/action/AddUniversityAction.java index 2b59842..f0191d9 100644 --- a/src/cn/edu/hit/education/action/AddUniversityAction.java +++ b/src/cn/edu/hit/education/action/AddUniversityAction.java @@ -33,7 +33,7 @@ public class AddUniversityAction extends Action { if(IDialogConstants.OK_ID == universityDialog.open()){ int count = universityService.insert(university); if(count > 0){ - viewPart.refreshData(university); + viewPart.refreshNewData(university); } } super.run(); diff --git a/src/cn/edu/hit/education/action/UpdateCollegeAction.java b/src/cn/edu/hit/education/action/UpdateCollegeAction.java new file mode 100644 index 0000000..add0810 --- /dev/null +++ b/src/cn/edu/hit/education/action/UpdateCollegeAction.java @@ -0,0 +1,46 @@ +package cn.edu.hit.education.action; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import cn.edu.hit.education.dialog.CollegeDialog; +import cn.edu.hit.education.pojo.College; +import cn.edu.hit.education.service.ICollegeService; +import cn.edu.hit.education.view.DepartmentExploreView; +import educationschedule.Activator; +import educationschedule.Application; + +public class UpdateCollegeAction extends Action { + private DepartmentExploreView viewPart; + ICollegeService collegeService = (ICollegeService)Application.applicationContext.getBean("collegeServiceImpl"); + private int collegeId; + + public UpdateCollegeAction(DepartmentExploreView viewPart,int collegeId){ + this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/toolbar/course_code_16px.png")); + this.setToolTipText("修改学院"); + this.setText("修改学院"); + this.viewPart = viewPart; + this.collegeId = collegeId; + } + + @Override + public void run() { + Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + CollegeDialog collegeDialog = new CollegeDialog(parentShell); + College college = collegeService.queryCollegeByPrimaryKey(collegeId); + collegeDialog.setCollege(college); + if(IDialogConstants.OK_ID == collegeDialog.open()){ + int count = collegeService.update(college); + if(count > 0){ + viewPart.refreshUpdateData(college); + } + } + super.run(); + } + + + +} diff --git a/src/cn/edu/hit/education/action/UpdateSpecialtyAction.java b/src/cn/edu/hit/education/action/UpdateSpecialtyAction.java new file mode 100644 index 0000000..3dbad3d --- /dev/null +++ b/src/cn/edu/hit/education/action/UpdateSpecialtyAction.java @@ -0,0 +1,45 @@ +package cn.edu.hit.education.action; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import cn.edu.hit.education.dialog.SpecialtyDialog; +import cn.edu.hit.education.pojo.Specialty; +import cn.edu.hit.education.service.ISpecialtyService; +import cn.edu.hit.education.view.DepartmentExploreView; +import educationschedule.Activator; +import educationschedule.Application; + +public class UpdateSpecialtyAction extends Action { + ISpecialtyService specialtyService = (ISpecialtyService)Application.applicationContext.getBean("specialtyServiceImpl"); + private int specialtyId; + private DepartmentExploreView viewPart; + /** + * @wbp.parser.entryPoint + */ + public UpdateSpecialtyAction(DepartmentExploreView viewPart,int specialtyId){ + this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/toolbar/course_code_16px.png")); + this.setToolTipText("修改专业"); + this.setText("修改专业"); + this.viewPart = viewPart; + this.specialtyId = specialtyId; + } + + @Override + public void run() { + Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + SpecialtyDialog specialtyDialog = new SpecialtyDialog(parentShell); + Specialty specialty = specialtyService.queryByPrimaryKey(specialtyId); + specialtyDialog.setSpecialty(specialty); + if(IDialogConstants.OK_ID == specialtyDialog.open()){ + int count = specialtyService.update(specialty); + if(count > 0){ + viewPart.refreshUpdateData(specialty); + } + } + super.run(); + } +} diff --git a/src/cn/edu/hit/education/action/UpdateUniversityAction.java b/src/cn/edu/hit/education/action/UpdateUniversityAction.java new file mode 100644 index 0000000..cb4d496 --- /dev/null +++ b/src/cn/edu/hit/education/action/UpdateUniversityAction.java @@ -0,0 +1,46 @@ +package cn.edu.hit.education.action; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import cn.edu.hit.education.dialog.UniversityDialog; +import cn.edu.hit.education.pojo.University; +import cn.edu.hit.education.service.IUniversityService; +import cn.edu.hit.education.view.DepartmentExploreView; +import educationschedule.Activator; +import educationschedule.Application; + +public class UpdateUniversityAction extends Action { + private DepartmentExploreView viewPart; + IUniversityService universityService = (IUniversityService)Application.applicationContext.getBean("universityServiceImpl"); + private int unversityId; + + public UpdateUniversityAction(DepartmentExploreView viewPart,int unversityId){ + this.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/toolbar/course_code_16px.png")); + this.setToolTipText("修改学校"); + this.setText("修改学校"); + this.viewPart = viewPart; + this.unversityId = unversityId; + } + + @Override + public void run() { + Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + UniversityDialog universityDialog = new UniversityDialog(parentShell); + University university = universityService.queryUniversityByPrimaryKey(unversityId); + universityDialog.setUniversity(university); + if(IDialogConstants.OK_ID == universityDialog.open()){ + int count = universityService.update(university); + if(count > 0){ + viewPart.refreshUpdateData(university); + } + } + super.run(); + } + + + +} diff --git a/src/cn/edu/hit/education/labelprovider/CourseInformationLabelProvider.java b/src/cn/edu/hit/education/labelprovider/CourseInformationLabelProvider.java index a7365e6..f44cfd3 100644 --- a/src/cn/edu/hit/education/labelprovider/CourseInformationLabelProvider.java +++ b/src/cn/edu/hit/education/labelprovider/CourseInformationLabelProvider.java @@ -23,19 +23,19 @@ public class CourseInformationLabelProvider extends LabelProvider implements }else if (columnIndex == 2) { return String.valueOf(data.getCredits()); }else if (columnIndex == 3) { - if(data.getMethod() != null && data.getMethod().trim().equals("��ɢ")){ + if(data.getMethod() != null && data.getMethod().trim().equals("分散")){ return "(" + String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + ") " + unitName; }else{ return String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + " " + unitName; } }else if (columnIndex == 4) { - if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("��ɢ")){ + if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("分散")){ return "(" + String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + ") " + unitName; }else{ return String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + " " + unitName; } }else if (columnIndex == 5) { - if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("��ɢ")){ + if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("分散")){ return "(" + String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + ") " + unitName; }else{ return String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + " " + unitName; diff --git a/src/cn/edu/hit/education/service/CollegeServiceImpl.java b/src/cn/edu/hit/education/service/CollegeServiceImpl.java index b2de18d..be467a6 100644 --- a/src/cn/edu/hit/education/service/CollegeServiceImpl.java +++ b/src/cn/edu/hit/education/service/CollegeServiceImpl.java @@ -1,109 +1,93 @@ -/** -*

title £º CollegeServiceImpl.java

-*

package £º cn.edu.hit.education.service

-*

description £ºTODO

-*

copyright £º ¹þ¶û±õ¹¤Òµ´óѧ(C) 2019

-*

company £º ¹þ¶û±õ¹¤Òµ´óѧAS&MT

-*

author £º ½ðÑ©ËÉ jinxuesong@163.com

-*

date £º 2021Äê4ÔÂ21ÈÕ ÏÂÎç4:36:36

-*

version £º v1.0

-* -* Modification History: -* Date Author Version Discription -* ----------------------------------------------------------------------------------- -* 2021Äê4ÔÂ21ÈÕ ½ðÑ©ËÉ 1.0 1.0 -* Why & What is modified: <ÐÞ¸ÄÔ­ÒòÃèÊö> -*/ -package cn.edu.hit.education.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import cn.edu.hit.education.dao.CollegeMapper; -import cn.edu.hit.education.pojo.College; -import cn.edu.hit.education.pojo.CollegeExample; - -/** - *

classname £º CollegeServiceImpl

- *

description £ºTODO

- *

author £º ½ðÑ©ËÉ jinxuesong@163.com

- *

date £º 2021Äê4ÔÂ21ÈÕ ÏÂÎç4:36:36

- */ -@Service -public class CollegeServiceImpl implements ICollegeService { - - @Autowired - CollegeMapper collegeMapper; - - @Override - public int insert(College college) { - // TODO ×Ô¶¯Éú³ÉµÄ·½·¨´æ¸ù - return collegeMapper.insert(college); - } - - /* (·Ç Javadoc) - *

Title: deleteByPrimaryKey

- *

Description:

- * @param id - * @return - * @see cn.edu.hit.education.service.ICollegeService#deleteByPrimaryKey(int) - */ - - @Override - public int deleteByPrimaryKey(int id) { - // TODO ×Ô¶¯Éú³ÉµÄ·½·¨´æ¸ù - return collegeMapper.deleteByPrimaryKey(id); - } - - /* (·Ç Javadoc) - *

Title: update

- *

Description:

- * @param college - * @return - * @see cn.edu.hit.education.service.ICollegeService#update(cn.edu.hit.education.pojo.College) - */ - - @Override - public int update(College college) { - // TODO ×Ô¶¯Éú³ÉµÄ·½·¨´æ¸ù - return collegeMapper.updateByPrimaryKey(college); - } - - /* (·Ç Javadoc) - *

Title: queryAllCollege

- *

Description:

- * @return - * @see cn.edu.hit.education.service.ICollegeService#queryAllCollege() - */ - - @Override - public List queryAllCollege() { - // TODO ×Ô¶¯Éú³ÉµÄ·½·¨´æ¸ù - CollegeExample example = new CollegeExample(); - CollegeExample.Criteria criteria = example.createCriteria(); - criteria.andIdGreaterThan(0); - - return collegeMapper.selectByExample(example); - } - - /* (·Ç Javadoc) - *

Title: queryCollegesByUniversityId

- *

Description:

- * @param universityId - * @return - * @see cn.edu.hit.education.service.ICollegeService#queryCollegesByUniversityId(int) - */ - - @Override - public List queryCollegesByUniversityId(int universityId) { - // TODO ×Ô¶¯Éú³ÉµÄ·½·¨´æ¸ù - CollegeExample example = new CollegeExample(); - CollegeExample.Criteria criteria = example.createCriteria(); - criteria.andUniversityIdEqualTo(universityId); - - return collegeMapper.selectByExample(example); - } - -} +/** +*

title �� CollegeServiceImpl.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����4:36:36

+*

version �� v1.0

+* +* Modification History: +* Date Author Version Discription +* ----------------------------------------------------------------------------------- +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> +*/ +package cn.edu.hit.education.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import cn.edu.hit.education.dao.CollegeMapper; +import cn.edu.hit.education.pojo.College; +import cn.edu.hit.education.pojo.CollegeExample; +import cn.edu.hit.education.pojo.Specialty; + +@Service +public class CollegeServiceImpl implements ICollegeService { + + @Autowired + CollegeMapper collegeMapper; + @Autowired + ISpecialtyService specialtyService; + + @Override + public int insert(College college) { + return collegeMapper.insert(college); + } + + + @Override + public int deleteByPrimaryKey(int id) { + return collegeMapper.deleteByPrimaryKey(id); + } + + + @Override + public int update(College college) { + return collegeMapper.updateByPrimaryKey(college); + } + + @Override + public List queryAllCollege() { + CollegeExample example = new CollegeExample(); + CollegeExample.Criteria criteria = example.createCriteria(); + criteria.andIdGreaterThan(0); + + return collegeMapper.selectByExample(example); + } + + @Override + public List queryCollegesByUniversityId(int universityId) { + CollegeExample example = new CollegeExample(); + CollegeExample.Criteria criteria = example.createCriteria(); + criteria.andUniversityIdEqualTo(universityId); + + return collegeMapper.selectByExample(example); + } + + @Override + public College queryCollegeByPrimaryKey(int id) { + // TODO Auto-generated method stub + return collegeMapper.selectByPrimaryKey(id); + } + + + @Override + public int deleteByPrimaryKeyCascade(int id) { + // TODO Auto-generated method stub + List specialties = specialtyService.querySpecialtiesByCollegeId(id); + if(specialties != null && specialties.size() > 0){ + for (Specialty specialty : specialties) { + specialtyService.deleteByPrimaryKey(specialty.getId()); + } + } + + + return collegeMapper.deleteByPrimaryKey(id); + } + +} diff --git a/src/cn/edu/hit/education/service/ICollegeService.java b/src/cn/edu/hit/education/service/ICollegeService.java index f29323d..fc22e34 100644 --- a/src/cn/edu/hit/education/service/ICollegeService.java +++ b/src/cn/edu/hit/education/service/ICollegeService.java @@ -1,39 +1,37 @@ -/** -*

title £º ICollegeService.java

-*

package £º cn.edu.hit.education.service

-*

description £ºTODO

-*

copyright £º ¹þ¶û±õ¹¤Òµ´óѧ(C) 2019

-*

company £º ¹þ¶û±õ¹¤Òµ´óѧAS&MT

-*

author £º ½ðÑ©ËÉ jinxuesong@163.com

-*

date £º 2021Äê4ÔÂ21ÈÕ ÏÂÎç2:59:45

-*

version £º v1.0

-* -* Modification History: -* Date Author Version Discription -* ----------------------------------------------------------------------------------- -* 2021Äê4ÔÂ21ÈÕ ½ðÑ©ËÉ 1.0 1.0 -* Why & What is modified: <ÐÞ¸ÄÔ­ÒòÃèÊö> -*/ -package cn.edu.hit.education.service; - -import java.util.List; - -import cn.edu.hit.education.pojo.College; - -/** - *

classname £º ICollegeService

- *

description £ºTODO

- *

author £º ½ðÑ©ËÉ jinxuesong@163.com

- *

date £º 2021Äê4ÔÂ21ÈÕ ÏÂÎç2:59:45

- */ -public interface ICollegeService { - int insert(College college); - - int deleteByPrimaryKey(int id); - - int update(College college); - - List queryAllCollege(); - - List queryCollegesByUniversityId(int universityId); -} +/** +*

title �� ICollegeService.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����2:59:45

+*

version �� v1.0

+* +* Modification History: +* Date Author Version Discription +* ----------------------------------------------------------------------------------- +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> +*/ +package cn.edu.hit.education.service; + +import java.util.List; + +import cn.edu.hit.education.pojo.College; + +public interface ICollegeService { + int insert(College college); + + int deleteByPrimaryKey(int id); + + int update(College college); + + int deleteByPrimaryKeyCascade(int id); + + College queryCollegeByPrimaryKey(int id); + + List queryAllCollege(); + + List queryCollegesByUniversityId(int universityId); +} diff --git a/src/cn/edu/hit/education/service/ISpecialtyService.java b/src/cn/edu/hit/education/service/ISpecialtyService.java index 76c2b8e..b8e084f 100644 --- a/src/cn/edu/hit/education/service/ISpecialtyService.java +++ b/src/cn/edu/hit/education/service/ISpecialtyService.java @@ -1,44 +1,38 @@ -/** -*

title �� ISpecialtyService.java

-*

package �� cn.edu.hit.education.service

-*

description ��TODO

-*

copyright �� ��������ҵ��ѧ(C) 2019

-*

company �� ��������ҵ��ѧAS&MT

-*

author �� ��ѩ�� jinxuesong@163.com

-*

date �� 2021��4��21�� ����2:59:59

-*

version �� v1.0

-* -* Modification History: -* Date Author Version Discription -* ----------------------------------------------------------------------------------- -* 2021��4��21�� ��ѩ�� 1.0 1.0 -* Why & What is modified: <�޸�ԭ������> -*/ -package cn.edu.hit.education.service; - -import java.util.List; - -import cn.edu.hit.education.pojo.Specialty; - -/** - *

classname �� ISpecialtyService

- *

description ��TODO

- *

author �� ��ѩ�� jinxuesong@163.com

- *

date �� 2021��4��21�� ����2:59:59

- */ -public interface ISpecialtyService { - - int insert(Specialty specialty); - - int deleteByPrimaryKey(int id); - - int update(Specialty specialty); - - Specialty queryByPrimaryKey(int id); - - List queryAllSpecialty(); - - List querySpecialtiesByCollegeId(int collegeId); - - List queryRelativeSpecialty(List ids); -} +/** +*

title �� ISpecialtyService.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����2:59:59

+*

version �� v1.0

+* +* Modification History: +* Date Author Version Discription +* ----------------------------------------------------------------------------------- +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> +*/ +package cn.edu.hit.education.service; + +import java.util.List; + +import cn.edu.hit.education.pojo.Specialty; + +public interface ISpecialtyService { + + int insert(Specialty specialty); + + int deleteByPrimaryKey(int id); + + int update(Specialty specialty); + + Specialty queryByPrimaryKey(int id); + + List queryAllSpecialty(); + + List querySpecialtiesByCollegeId(int collegeId); + + List queryRelativeSpecialty(List ids); +} diff --git a/src/cn/edu/hit/education/service/IUniversityService.java b/src/cn/edu/hit/education/service/IUniversityService.java index abf4f7c..afad92a 100644 --- a/src/cn/edu/hit/education/service/IUniversityService.java +++ b/src/cn/edu/hit/education/service/IUniversityService.java @@ -26,6 +26,8 @@ public interface IUniversityService { int deleteByPrimaryKey(int id); + int deleteByPrimaryKeyCascade(int id); + int update(University university); List queryAllUniversity(); diff --git a/src/cn/edu/hit/education/service/UniversityServiceImpl.java b/src/cn/edu/hit/education/service/UniversityServiceImpl.java index a9d9cc0..d32a5f9 100644 --- a/src/cn/edu/hit/education/service/UniversityServiceImpl.java +++ b/src/cn/edu/hit/education/service/UniversityServiceImpl.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.edu.hit.education.dao.UniversityMapper; +import cn.edu.hit.education.pojo.College; import cn.edu.hit.education.pojo.University; import cn.edu.hit.education.pojo.UniversityExample; @@ -29,6 +30,8 @@ import cn.edu.hit.education.pojo.UniversityExample; public class UniversityServiceImpl implements IUniversityService { @Autowired UniversityMapper universityMapper; + @Autowired + ICollegeService collegeService; @Override public int insert(University university) { @@ -60,4 +63,16 @@ public class UniversityServiceImpl implements IUniversityService { return universityMapper.selectByPrimaryKey(id); } + @Override + public int deleteByPrimaryKeyCascade(int id) { + // TODO Auto-generated method stub + List colleges = collegeService.queryCollegesByUniversityId(id); + if(colleges != null && colleges.size() > 0){ + for (College college : colleges) { + collegeService.deleteByPrimaryKeyCascade(college.getId()); + } + } + return universityMapper.deleteByPrimaryKey(id); + } + } diff --git a/src/cn/edu/hit/education/view/DepartmentExploreView.java b/src/cn/edu/hit/education/view/DepartmentExploreView.java index ea68be4..5b4781e 100644 --- a/src/cn/edu/hit/education/view/DepartmentExploreView.java +++ b/src/cn/edu/hit/education/view/DepartmentExploreView.java @@ -15,6 +15,9 @@ import org.springframework.stereotype.Component; import cn.edu.hit.education.action.AddCollegeAction; import cn.edu.hit.education.action.AddSpecialtyAction; import cn.edu.hit.education.action.AddUniversityAction; +import cn.edu.hit.education.action.UpdateCollegeAction; +import cn.edu.hit.education.action.UpdateSpecialtyAction; +import cn.edu.hit.education.action.UpdateUniversityAction; import cn.edu.hit.education.contentprovider.DepartmentContentProvider; import cn.edu.hit.education.labelprovider.DepartmentLabelProvider; import cn.edu.hit.education.model.CollegeNode; @@ -72,10 +75,12 @@ public class DepartmentExploreView extends ViewPart { menuMgr.add(new AddUniversityAction(DepartmentExploreView.this)); }else if(currentNode instanceof UniversityNode){ menuMgr.add(new AddCollegeAction(DepartmentExploreView.this,currentNode.getId())); + menuMgr.add(new UpdateUniversityAction(DepartmentExploreView.this,currentNode.getId())); }else if(currentNode instanceof CollegeNode){ menuMgr.add(new AddSpecialtyAction(DepartmentExploreView.this,currentNode.getId())); + menuMgr.add(new UpdateCollegeAction(DepartmentExploreView.this,currentNode.getId())); }else{ - + menuMgr.add(new UpdateSpecialtyAction(DepartmentExploreView.this,currentNode.getId())); } } } @@ -85,27 +90,46 @@ public class DepartmentExploreView extends ViewPart { } - public void refreshData(Object obj){ + public void refreshNewData(Object obj){ if(obj instanceof University){ University university = (University)obj; UniversityNode universityNode = new UniversityNode(university.getId(),university.getName()); - treeViewer.add(currentNode, universityNode); + currentNode.addChild(universityNode); + //treeViewer.add(currentNode, universityNode); }else if(obj instanceof College){ College college = (College)obj; CollegeNode collegeNode = new CollegeNode(college.getId(),college.getName()); - treeViewer.add(currentNode, collegeNode); + currentNode.addChild(collegeNode); + //treeViewer.add(currentNode, collegeNode); }else if(obj instanceof Specialty){ Specialty specialty = (Specialty)obj; SpecialtyNode specialtyNode = new SpecialtyNode(specialty.getId(),specialty.getName()); - treeViewer.add(currentNode, specialtyNode); + currentNode.addChild(specialtyNode); + //treeViewer.add(currentNode, specialtyNode); }else{ } - Object nodes = treeViewer.getInput(); - //treeViewer.refresh(); + treeViewer.refresh(currentNode,true); treeViewer.setExpandedState(currentNode, true); + } + + public void refreshUpdateData(Object obj){ + if(obj instanceof University){ + University university = (University)obj; + currentNode.setName(university.getName()); + }else if(obj instanceof College){ + College college = (College)obj; + currentNode.setName(college.getName()); + }else if(obj instanceof Specialty){ + Specialty specialty = (Specialty)obj; + currentNode.setName(specialty.getName()); + }else{ + + } + treeViewer.refresh(currentNode,true); + treeViewer.setExpandedState(currentNode, true); } /** diff --git a/src/educationschedule/Activator.java b/src/educationschedule/Activator.java index d9ccc8f..9e77176 100644 --- a/src/educationschedule/Activator.java +++ b/src/educationschedule/Activator.java @@ -1,61 +1,62 @@ -package educationschedule; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class Activator extends AbstractUIPlugin { - - // The plug-in ID - public static final String PLUGIN_ID = "EducationSchedule"; //$NON-NLS-1$ - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - - /** - * Returns an image descriptor for the image file at the given - * plug-in relative path - * - * @param path the path - * @return the image descriptor - */ - public static ImageDescriptor getImageDescriptor(String path) { - return imageDescriptorFromPlugin(PLUGIN_ID, path); - } -} +package educationschedule; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "EducationSchedule"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + + /** + * Returns an image descriptor for the image file at the given + * plug-in relative path + * + * @param path the path + * @return the image descriptor + */ + public static ImageDescriptor getImageDescriptor(String path) { + return imageDescriptorFromPlugin(PLUGIN_ID, path); + } + +} diff --git a/src/educationschedule/Perspective.java b/src/educationschedule/Perspective.java index 314ee9d..db5635d 100644 --- a/src/educationschedule/Perspective.java +++ b/src/educationschedule/Perspective.java @@ -4,6 +4,7 @@ import org.eclipse.ui.IFolderLayout; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; +import cbg.article.treeviewer.ui.MovingBoxView; import cn.edu.hit.education.view.CourseExploreView; import cn.edu.hit.education.view.CourseInformationView; import cn.edu.hit.education.view.CourseScheduleView; @@ -23,7 +24,7 @@ public class Perspective implements IPerspectiveFactory { IFolderLayout mainArea = layout.createFolder("mainArea", IPageLayout.LEFT, 0.8f, editorArea); mainArea.addView(CourseScheduleView.ID); mainArea.addView(CourseInformationView.ID); - //mainArea.addView(View.ID); + mainArea.addView(MovingBoxView.ID); } } -- Gitee From c3061adc45471731686652c3d2d736c03ac665dd Mon Sep 17 00:00:00 2001 From: "jinxuesong@163.com" Date: Sun, 9 May 2021 20:47:35 +0800 Subject: [PATCH 2/2] aaa --- .../ExScheduleContentProvider.java | 28 ++ .../CourseScheduleLabelProvider.java | 112 ++--- .../ExScheduleLabelProvider.java | 60 +++ src/cn/edu/hit/education/pojo/ExSchedule.java | 13 + .../education/service/IScheduleService.java | 109 +++-- .../service/ScheduleServiceImpl.java | 399 +++++++++--------- .../education/view/CourseScheduleView.java | 3 - 7 files changed, 414 insertions(+), 310 deletions(-) create mode 100644 src/cn/edu/hit/education/contentprovider/ExScheduleContentProvider.java create mode 100644 src/cn/edu/hit/education/labelprovider/ExScheduleLabelProvider.java create mode 100644 src/cn/edu/hit/education/pojo/ExSchedule.java diff --git a/src/cn/edu/hit/education/contentprovider/ExScheduleContentProvider.java b/src/cn/edu/hit/education/contentprovider/ExScheduleContentProvider.java new file mode 100644 index 0000000..02543dd --- /dev/null +++ b/src/cn/edu/hit/education/contentprovider/ExScheduleContentProvider.java @@ -0,0 +1,28 @@ +package cn.edu.hit.education.contentprovider; + +import java.util.List; + +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.Viewer; + +public class ExScheduleContentProvider implements IStructuredContentProvider{ + + @Override + public void dispose() { + // TODO Auto-generated method stub + + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + // TODO Auto-generated method stub + + } + + @Override + public Object[] getElements(Object inputElement) { + // TODO Auto-generated method stub + return ((List) inputElement).toArray(); + } + +} diff --git a/src/cn/edu/hit/education/labelprovider/CourseScheduleLabelProvider.java b/src/cn/edu/hit/education/labelprovider/CourseScheduleLabelProvider.java index 28c6fbd..4576163 100644 --- a/src/cn/edu/hit/education/labelprovider/CourseScheduleLabelProvider.java +++ b/src/cn/edu/hit/education/labelprovider/CourseScheduleLabelProvider.java @@ -1,57 +1,57 @@ -package cn.edu.hit.education.labelprovider; - -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.swt.graphics.Image; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.PlatformUI; - -import cn.edu.hit.education.pojo.Course; - -public class CourseScheduleLabelProvider extends LabelProvider implements - ITableLabelProvider { - /*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );*/ - - @Override - public String getColumnText(Object element, int columnIndex) { - // TODO Auto-generated method stub - Course data = (Course) element; - String unitName = data.getUnit() == null ? "" : data.getUnit(); - if (columnIndex == 0) { - return data.getNumber()==null?"":data.getNumber(); - }else if (columnIndex == 1) { - return data.getName(); - }else if (columnIndex == 2) { - return String.valueOf(data.getCredits()); - }else if (columnIndex == 3) { - if(data.getMethod() != null && data.getMethod().trim().equals("·ÖÉ¢")){ - return "(" + String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + ") " + unitName; - }else{ - return String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + " " + unitName; - } - }else if (columnIndex == 4) { - if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("·ÖÉ¢")){ - return "(" + String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + ") " + unitName; - }else{ - return String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + " " + unitName; - } - }else if (columnIndex == 5) { - if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("·ÖÉ¢")){ - return "(" + String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + ") " + unitName; - }else{ - return String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + " " + unitName; - } - }else{ - return ""; - } - } - - public Image getColumnImage(Object obj, int index) { - return null; - } - - public Image getImage(Object obj) { - return PlatformUI.getWorkbench().getSharedImages() - .getImage(ISharedImages.IMG_OBJ_ELEMENT); - } +package cn.edu.hit.education.labelprovider; + +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; + +import cn.edu.hit.education.pojo.Course; + +public class CourseScheduleLabelProvider extends LabelProvider implements + ITableLabelProvider { + /*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );*/ + + @Override + public String getColumnText(Object element, int columnIndex) { + // TODO Auto-generated method stub + Course data = (Course) element; + String unitName = data.getUnit() == null ? "" : data.getUnit(); + if (columnIndex == 0) { + return data.getNumber()==null?"":data.getNumber(); + }else if (columnIndex == 1) { + return data.getName(); + }else if (columnIndex == 2) { + return String.valueOf(data.getCredits()); + }else if (columnIndex == 3) { + if(data.getMethod() != null && data.getMethod().trim().equals("分散")){ + return "(" + String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + ") " + unitName; + }else{ + return String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + " " + unitName; + } + }else if (columnIndex == 4) { + if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("分散")){ + return "(" + String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + ") " + unitName; + }else{ + return String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + " " + unitName; + } + }else if (columnIndex == 5) { + if(data.getMethod() != null && data.getMethod() != null && data.getMethod().trim().equals("分散")){ + return "(" + String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + ") " + unitName; + }else{ + return String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + " " + unitName; + } + }else{ + return ""; + } + } + + public Image getColumnImage(Object obj, int index) { + return null; + } + + public Image getImage(Object obj) { + return PlatformUI.getWorkbench().getSharedImages() + .getImage(ISharedImages.IMG_OBJ_ELEMENT); + } } \ No newline at end of file diff --git a/src/cn/edu/hit/education/labelprovider/ExScheduleLabelProvider.java b/src/cn/edu/hit/education/labelprovider/ExScheduleLabelProvider.java new file mode 100644 index 0000000..996a576 --- /dev/null +++ b/src/cn/edu/hit/education/labelprovider/ExScheduleLabelProvider.java @@ -0,0 +1,60 @@ +package cn.edu.hit.education.labelprovider; + +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; + +import cn.edu.hit.education.pojo.Course; +import cn.edu.hit.education.pojo.ExSchedule; + +public class ExScheduleLabelProvider extends LabelProvider implements + ITableLabelProvider { + /*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );*/ + + @Override + public String getColumnText(Object element, int columnIndex) { + // TODO Auto-generated method stub + ExSchedule data = (ExSchedule) element; + Course course = data.getCourse(); + + String unitName = course.getUnit() == null ? "" : course.getUnit(); + if (columnIndex == 0) { + return course.getNumber()==null?"":course.getNumber(); + }else if (columnIndex == 1) { + return course.getName(); + }else if (columnIndex == 2) { + return String.valueOf(data.getCredits()); + }else if (columnIndex == 3) { + if(course.getMethod() != null && course.getMethod().trim().equals("分散")){ + return "(" + String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + ") " + unitName; + }else{ + return String.valueOf(data.getPeriod()==null?"":data.getPeriod()) + " " + unitName; + } + }else if (columnIndex == 4) { + if(course.getMethod() != null && course.getMethod() != null && course.getMethod().trim().equals("分散")){ + return "(" + String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + ") " + unitName; + }else{ + return String.valueOf(data.getTheoretical()==null?"":data.getTheoretical()) + " " + unitName; + } + }else if (columnIndex == 5) { + if(course.getMethod() != null && course.getMethod() != null && course.getMethod().trim().equals("分散")){ + return "(" + String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + ") " + unitName; + }else{ + return String.valueOf(data.getExperiment()==null?"":data.getExperiment()) + " " + unitName; + } + }else{ + return ""; + } + } + + public Image getColumnImage(Object obj, int index) { + return null; + } + + public Image getImage(Object obj) { + return PlatformUI.getWorkbench().getSharedImages() + .getImage(ISharedImages.IMG_OBJ_ELEMENT); + } +} \ No newline at end of file diff --git a/src/cn/edu/hit/education/pojo/ExSchedule.java b/src/cn/edu/hit/education/pojo/ExSchedule.java new file mode 100644 index 0000000..57dcb5e --- /dev/null +++ b/src/cn/edu/hit/education/pojo/ExSchedule.java @@ -0,0 +1,13 @@ +package cn.edu.hit.education.pojo; + +public class ExSchedule extends Schedule { + private Course course; + + public Course getCourse() { + return course; + } + + public void setCourse(Course course) { + this.course = course; + } +} diff --git a/src/cn/edu/hit/education/service/IScheduleService.java b/src/cn/edu/hit/education/service/IScheduleService.java index cd18852..fca9347 100644 --- a/src/cn/edu/hit/education/service/IScheduleService.java +++ b/src/cn/edu/hit/education/service/IScheduleService.java @@ -1,56 +1,53 @@ -/** -*

title �� IScheduleService.java

-*

package �� cn.edu.hit.education.service

-*

description ��TODO

-*

copyright �� ��������ҵ��ѧ(C) 2019

-*

company �� ��������ҵ��ѧAS&MT

-*

author �� ��ѩ�� jinxuesong@163.com

-*

date �� 2021��4��21�� ����3:00:32

-*

version �� v1.0

-* -* Modification History: -* Date Author Version Discription -* ----------------------------------------------------------------------------------- -* 2021��4��21�� ��ѩ�� 1.0 1.0 -* Why & What is modified: <�޸�ԭ������> -*/ -package cn.edu.hit.education.service; - -import java.util.List; - -import cn.edu.hit.education.pojo.Schedule; - -/** - *

classname �� IScheduleService

- *

description ��TODO

- *

author �� ��ѩ�� jinxuesong@163.com

- *

date �� 2021��4��21�� ����3:00:32

- */ -public interface IScheduleService { - - int insert(Schedule schedule); - - int deleteByPrimaryKey(int id); - - int update(Schedule schedule); - - Schedule qurySchedule(int courseId); - - List queryAllSchedule(); - - List querySchedulesBySpecialtyId(int specialtyId,int opened); - - List querySchedulesBySpecialtySemesterId(int specialtyId, int semesterId); - - List querySchedulesBySpecialtySemesterCourseId(int specialtyId, int semesterId,int courseId); - - List querySchedulesBySpecialtyCourseId(int specialtyId, int courseId); - - void statisticsSchedule(int specialtyId,int opened); - - List querySchedulesBySemesterCourseId(Integer semesterId, Integer courseId); - - List querySchedulesBySemesterId(int semesterId); - - List querySchedulesBySCourseId(Integer courseId); -} +/** +*

title �� IScheduleService.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����3:00:32

+*

version �� v1.0

+* +* Modification History: +* Date Author Version Discription +* ----------------------------------------------------------------------------------- +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> +*/ +package cn.edu.hit.education.service; + +import java.util.List; + +import cn.edu.hit.education.pojo.ExSchedule; +import cn.edu.hit.education.pojo.Schedule; + +public interface IScheduleService { + + int insert(Schedule schedule); + + int deleteByPrimaryKey(int id); + + int update(Schedule schedule); + + Schedule qurySchedule(int courseId); + + List queryAllSchedule(); + + List querySchedulesBySpecialtyId(int specialtyId,int opened); + + List querySchedulesBySpecialtySemesterId(int specialtyId, int semesterId); + + List querySchedulesBySpecialtySemesterCourseId(int specialtyId, int semesterId,int courseId); + + List querySchedulesBySpecialtyCourseId(int specialtyId, int courseId); + + void statisticsSchedule(int specialtyId,int opened); + + List querySchedulesBySemesterCourseId(Integer semesterId, Integer courseId); + + List querySchedulesBySemesterId(int semesterId); + + List querySchedulesBySCourseId(Integer courseId); + + List queryExSchedulesBySpecialtySemesterId(int specialtyId, int semesterId); +} diff --git a/src/cn/edu/hit/education/service/ScheduleServiceImpl.java b/src/cn/edu/hit/education/service/ScheduleServiceImpl.java index 36ef135..f18c8db 100644 --- a/src/cn/edu/hit/education/service/ScheduleServiceImpl.java +++ b/src/cn/edu/hit/education/service/ScheduleServiceImpl.java @@ -1,195 +1,204 @@ -/** -*

title �� ScheduleServiceImpl.java

-*

package �� cn.edu.hit.education.service

-*

description ��TODO

-*

copyright �� ��������ҵ��ѧ(C) 2019

-*

company �� ��������ҵ��ѧAS&MT

-*

author �� ��ѩ�� jinxuesong@163.com

-*

date �� 2021��4��21�� ����4:40:39

-*

version �� v1.0

-* -* Modification History: -* Date Author Version Discription -* ----------------------------------------------------------------------------------- -* 2021��4��21�� ��ѩ�� 1.0 1.0 -* Why & What is modified: <�޸�ԭ������> -*/ -package cn.edu.hit.education.service; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import cn.edu.hit.education.dao.ScheduleMapper; -import cn.edu.hit.education.pojo.Course; -import cn.edu.hit.education.pojo.Schedule; -import cn.edu.hit.education.pojo.ScheduleExample; -import cn.edu.hit.education.utils.StatisticsUtil; - -/** - *

classname �� ScheduleServiceImpl

- *

description ��TODO

- *

author �� ��ѩ�� jinxuesong@163.com

- *

date �� 2021��4��21�� ����4:40:39

- */ -@Service -public class ScheduleServiceImpl implements IScheduleService { - - @Autowired - ScheduleMapper scheduleMapper; - @Autowired - ICourseService courseService; - - @Override - public int insert(Schedule schedule) { - // TODO �Զ����ɵķ������ - return scheduleMapper.insert(schedule); - } - @Override - public int deleteByPrimaryKey(int id) { - // TODO �Զ����ɵķ������ - return scheduleMapper.deleteByPrimaryKey(id); - } - - @Override - public int update(Schedule schedule) { - // TODO �Զ����ɵķ������ - return scheduleMapper.updateByPrimaryKey(schedule); - } - - @Override - public List queryAllSchedule() { - // TODO �Զ����ɵķ������ - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andIdGreaterThan(0); - - return scheduleMapper.selectByExample(example); - } - - @Override - public List querySchedulesBySpecialtySemesterId(int specialtyId, - int semesterId) { - // TODO �Զ����ɵķ������ - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andSpecialtyIdEqualTo(specialtyId); - criteria.andSemesterIdEqualTo(semesterId); - - return scheduleMapper.selectByExample(example); - } - - @Override - public List querySchedulesBySpecialtySemesterCourseId( - int specialtyId, int semesterId, int courseId) { - // TODO �Զ����ɵķ������ - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andSpecialtyIdEqualTo(specialtyId); - criteria.andSemesterIdEqualTo(semesterId); - criteria.andCourseIdEqualTo(courseId); - - return scheduleMapper.selectByExample(example); - } - - @Override - public List querySchedulesBySpecialtyCourseId(int specialtyId,int courseId) { - // TODO �Զ����ɵķ������ - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andSpecialtyIdEqualTo(specialtyId); - criteria.andCourseIdEqualTo(courseId); - - return scheduleMapper.selectByExample(example); - } - - @Override - public List querySchedulesBySpecialtyId(int specialtyId,int opened) { - // TODO �Զ����ɵķ������ - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andSpecialtyIdEqualTo(specialtyId); - criteria.andOpenedEqualTo(opened); - - return scheduleMapper.selectByExample(example); - } - - @Override - public void statisticsSchedule(int specialtyId,int opened) { - // TODO �Զ����ɵķ������ - List schedules = querySchedulesBySpecialtyId(specialtyId,opened); - - List courses0 = new ArrayList(); - List courses1 = new ArrayList(); - List courses2 = new ArrayList(); - List courses3 = new ArrayList(); - - for (Schedule schedule : schedules) { - Course course = courseService.queryCourseByPrimaryKey(schedule.getCourseId()); - if(course.getSelected().trim().equals("���޿�")){ - if(course.getPropertyId() <= 6){// ��ʵ���� - courses0.add(course); - }else{ - courses1.add(course); - } - }else{ - if(course.getPropertyId() <= 6){// ʵ���� - courses2.add(course); - }else{ - courses3.add(course); - } - } - } - - StatisticsUtil.processCourseScheduleData(courses0); - StatisticsUtil.printTotal(courses0); - StatisticsUtil.processCourseScheduleData(courses1); - StatisticsUtil.printTotal(courses1); - StatisticsUtil.processCourseScheduleData(courses2); - StatisticsUtil.printTotal(courses2); - StatisticsUtil.processCourseScheduleData(courses3); - StatisticsUtil.printTotal(courses3); - } - - @Override - public Schedule qurySchedule(int courseId) { - // TODO Auto-generated method stub - - - return (scheduleMapper.queryCourseByCourseId(courseId)); - } - @Override - public List querySchedulesBySemesterCourseId(Integer semesterId, - Integer courseId) { - // TODO Auto-generated method stub - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andSemesterIdEqualTo(semesterId); - criteria.andCourseIdEqualTo(courseId); - - return scheduleMapper.selectByExample(example); - } - @Override - public List querySchedulesBySemesterId(int semesterId) { - // TODO Auto-generated method stub - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - criteria.andSemesterIdEqualTo(semesterId); - - return scheduleMapper.selectByExample(example); - } - @Override - public List querySchedulesBySCourseId(Integer courseId) { - // TODO Auto-generated method stub - ScheduleExample example = new ScheduleExample(); - ScheduleExample.Criteria criteria = example.createCriteria(); - - criteria.andCourseIdEqualTo(courseId); - - return scheduleMapper.selectByExample(example); - } - - -} +/** +*

title �� ScheduleServiceImpl.java

+*

package �� cn.edu.hit.education.service

+*

description ��TODO

+*

copyright �� ��������ҵ��ѧ(C) 2019

+*

company �� ��������ҵ��ѧAS&MT

+*

author �� ��ѩ�� jinxuesong@163.com

+*

date �� 2021��4��21�� ����4:40:39

+*

version �� v1.0

+* +* Modification History: +* Date Author Version Discription +* ----------------------------------------------------------------------------------- +* 2021��4��21�� ��ѩ�� 1.0 1.0 +* Why & What is modified: <�޸�ԭ������> +*/ +package cn.edu.hit.education.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import cn.edu.hit.education.dao.ScheduleMapper; +import cn.edu.hit.education.pojo.Course; +import cn.edu.hit.education.pojo.ExSchedule; +import cn.edu.hit.education.pojo.Schedule; +import cn.edu.hit.education.pojo.ScheduleExample; +import cn.edu.hit.education.utils.StatisticsUtil; + +@Service +public class ScheduleServiceImpl implements IScheduleService { + + @Autowired + ScheduleMapper scheduleMapper; + @Autowired + ICourseService courseService; + + @Override + public int insert(Schedule schedule) { + return scheduleMapper.insert(schedule); + } + @Override + public int deleteByPrimaryKey(int id) { + return scheduleMapper.deleteByPrimaryKey(id); + } + + @Override + public int update(Schedule schedule) { + return scheduleMapper.updateByPrimaryKey(schedule); + } + + @Override + public List queryAllSchedule() { + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andIdGreaterThan(0); + + return scheduleMapper.selectByExample(example); + } + + @Override + public List querySchedulesBySpecialtySemesterId(int specialtyId, + int semesterId) { + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andSpecialtyIdEqualTo(specialtyId); + criteria.andSemesterIdEqualTo(semesterId); + + return scheduleMapper.selectByExample(example); + } + + @Override + public List querySchedulesBySpecialtySemesterCourseId( + int specialtyId, int semesterId, int courseId) { + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andSpecialtyIdEqualTo(specialtyId); + criteria.andSemesterIdEqualTo(semesterId); + criteria.andCourseIdEqualTo(courseId); + + return scheduleMapper.selectByExample(example); + } + + @Override + public List querySchedulesBySpecialtyCourseId(int specialtyId,int courseId) { + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andSpecialtyIdEqualTo(specialtyId); + criteria.andCourseIdEqualTo(courseId); + + return scheduleMapper.selectByExample(example); + } + + @Override + public List querySchedulesBySpecialtyId(int specialtyId,int opened) { + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andSpecialtyIdEqualTo(specialtyId); + criteria.andOpenedEqualTo(opened); + + return scheduleMapper.selectByExample(example); + } + + @Override + public void statisticsSchedule(int specialtyId,int opened) { + List schedules = querySchedulesBySpecialtyId(specialtyId,opened); + + List courses0 = new ArrayList(); + List courses1 = new ArrayList(); + List courses2 = new ArrayList(); + List courses3 = new ArrayList(); + + for (Schedule schedule : schedules) { + Course course = courseService.queryCourseByPrimaryKey(schedule.getCourseId()); + if(course.getSelected().trim().equals("���޿�")){ + if(course.getPropertyId() <= 6){// + courses0.add(course); + }else{ + courses1.add(course); + } + }else{ + if(course.getPropertyId() <= 6){// + courses2.add(course); + }else{ + courses3.add(course); + } + } + } + + StatisticsUtil.processCourseScheduleData(courses0); + StatisticsUtil.printTotal(courses0); + StatisticsUtil.processCourseScheduleData(courses1); + StatisticsUtil.printTotal(courses1); + StatisticsUtil.processCourseScheduleData(courses2); + StatisticsUtil.printTotal(courses2); + StatisticsUtil.processCourseScheduleData(courses3); + StatisticsUtil.printTotal(courses3); + } + + @Override + public Schedule qurySchedule(int courseId) { + // TODO Auto-generated method stub + + + return (scheduleMapper.queryCourseByCourseId(courseId)); + } + @Override + public List querySchedulesBySemesterCourseId(Integer semesterId, + Integer courseId) { + // TODO Auto-generated method stub + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andSemesterIdEqualTo(semesterId); + criteria.andCourseIdEqualTo(courseId); + + return scheduleMapper.selectByExample(example); + } + @Override + public List querySchedulesBySemesterId(int semesterId) { + // TODO Auto-generated method stub + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + criteria.andSemesterIdEqualTo(semesterId); + + return scheduleMapper.selectByExample(example); + } + @Override + public List querySchedulesBySCourseId(Integer courseId) { + // TODO Auto-generated method stub + ScheduleExample example = new ScheduleExample(); + ScheduleExample.Criteria criteria = example.createCriteria(); + + criteria.andCourseIdEqualTo(courseId); + + return scheduleMapper.selectByExample(example); + } + + @Override + public List queryExSchedulesBySpecialtySemesterId( + int specialtyId, int semesterId) { + List exSchedules = new ArrayList(); + List schedules = querySchedulesBySpecialtySemesterId(specialtyId, semesterId); + for (Schedule schedule : schedules) { + ExSchedule exSchedule = new ExSchedule(); + exSchedule.setId(schedule.getId()); + exSchedule.setSpecialtyId(schedule.getSpecialtyId()); + exSchedule.setSemesterId(schedule.getSemesterId()); + exSchedule.setCourseId(schedule.getCourseId()); + exSchedule.setOpened(schedule.getOpened()); + exSchedule.setCredits(schedule.getCredits()); + exSchedule.setPeriod(schedule.getPeriod()); + exSchedule.setTheoretical(schedule.getTheoretical()); + exSchedule.setExperiment(schedule.getExperiment()); + exSchedule.setNote(schedule.getNote()); + exSchedule.setCourse(courseService.queryCourseByPrimaryKey(schedule.getCourseId())); + exSchedules.add(exSchedule); + } + return exSchedules; + } + + +} diff --git a/src/cn/edu/hit/education/view/CourseScheduleView.java b/src/cn/edu/hit/education/view/CourseScheduleView.java index b76fc68..96e563c 100644 --- a/src/cn/edu/hit/education/view/CourseScheduleView.java +++ b/src/cn/edu/hit/education/view/CourseScheduleView.java @@ -217,9 +217,6 @@ public class CourseScheduleView extends ViewPart implements ISelectionProvider{ initSemesterCombo(); // /////////////// refreshData(); - - - } @Override -- Gitee