⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainshell.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	 * @param newModel
	 */
	public void setMobileModel(ShutterModel newModel) {
	    // set model
	    mobileModel = newModel;
	    views[MOBILE_VIEW].setModel(mobileModel);
        MobileMouseListener mml = new MobileMouseListener(this);
        views[MOBILE_VIEW].addItemMouseListener(mml, 0);
        views[MOBILE_VIEW].addContentMouseListener(mml, 0);
	}
	
    /* (non-Javadoc)
     * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
     */
    public void widgetDisposed(DisposeEvent e) {
    	if(font != null) font.dispose();
    	if(defaultStyle != null)
    		if(defaultStyle.foreground != null) 
    			defaultStyle.foreground.dispose();
    	if(groupColor != null) groupColor.dispose();
    	shutterBorderColor.dispose();
    	Colors.dispose();
    }    
    
	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
	 */
	public void shellIconified(ShellEvent e) {
	    /* 如果使用AutoHideManager,则注释掉下面这段,但是目前自动隐藏还有问题 */
		if(options.isAutoHide())
			shell.setVisible(false);
		
		if(!item.getVisible()) {
			initTray();
			uiHelper.setIconByStatus();
		}
	}
	
	/**
	 * @param client The client to set.
	 */
	public void setClient(QQClient client) {
		this.client = client;
		int qqNum = client.getUser().getQQ();
		myModel = new FriendModel(qqNum);
		shell.setText(String.valueOf(qqNum));
		
		// 初始化系统设置
		configHelper.initSystemOptions();
		// 初始化model
		mvcHelper.initModel();
		// 初始化备注信息
		configHelper.initRemarks();
		// 初始化手机好友
		configHelper.initMobiles();
		// 初始化快捷回复
		configHelper.initReplies();
		// 初始化代理列表
		configHelper.initProxies();
		// 初始化自定义表情
		configHelper.initFaces();
		// 初始化聊天记录管理器
		initMessageManager(qqNum);
		// 初始化QQ秀管理器
		initQQShowManager(qqNum);
		// 初始化手机好友视图
		mvcHelper.initMobileModel();
		
		// 设置声音精灵线程的使能性
		soundDaemon.setEnable(options.isEnableSound());
		// 设置其他Helper参数
		menuHelper.setClient(client);
	}

    /**
	 * 初始化QQ秀管理器
	 * @param qq
	 */
	private void initQQShowManager(int qqNum) {
		if(sm != null)
			sm.removeQQShowListener(this);
		sm = QQShowManager.getInstance(LumaQQ.INSTALL_DIR + "/" + String.valueOf(qqNum));
		sm.addQQShowListener(this);
	}

	/**
	 * 初始化聊天记录管理器
	 */
	private void initMessageManager(int qqNum) {
		mm = LumaQQMessageManager.getInstance(LumaQQ.INSTALL_DIR + "/" + String.valueOf(qqNum));
	}
	
	/**
	 * 创建字体
	 */
	public void createDefaultStyle() {
		String fontName = options.getFontName();
		if(fontName.equals(""))
		    fontName = LumaQQ.getString("default.font");
		int style = SWT.NORMAL;
		if(options.getBold()) style |= SWT.BOLD;
		if(options.getItalic()) style |= SWT.ITALIC;
		
		defaultStyle = new LineStyle(new Color(display, options.getRed(), options.getGreen(), options.getBlue()), null, fontName, style, options.getFontSize());		
	}
	
	/**
	 * 上传分组
	 */
	private void uploadGroup() {
	    JobExecutor executor = new JobExecutor(this);
	    executor.addJob(new UploadGroupJob());
	    executor.run();
	}
	
	/**
	 * 检查分组是否修改过,根据系统设置判断是否上传
	 */
	public void checkGroupDirty() {
	    // 如果分组被修改了,检查系统设置
	    if(isGroupDirty() && client.getUser().isLoggedIn()) {
	        if(options.getAutoUploadGroup() == OptionUtil.PROMPT) {
		        if(MessageDialog.openQuestion(shell, 
		                LumaQQ.getString("message.box.common.question.title"), 
		                LumaQQ.getString("message.box.upload.group"))) {
		            uploadGroup();
		        }
	        } else if(options.getAutoUploadGroup() == OptionUtil.ALWAYS) 
	            uploadGroup();
	    }
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
	 */
	public void shellClosed(ShellEvent e) {
	    // 上传分组
	    checkGroupDirty();
	    
	    // 关闭Client
	    if(processor != null && client != null) client.removeQQListener(processor);
	    // 注销
		if(client != null) client.logout();
		// 保存好友分组信息
		if(model != null) mvcHelper.saveModel();
		// 释放Tray Icon
		if(item != null) item.dispose();
		// 停止声音线程
		if(soundDaemon != null) soundDaemon.setStop(true);
		// 保存当前设置
		if(options.getOptionsModel() != null) {
		    // 保存窗口位置大小,自动隐藏相关的代码先注释掉
			Rectangle bound = /* ahm.needHide() ? ahm.getHistoryBound() :*/ shell.getBounds();
			options.setLocationX(bound.x);
			options.setLocationY(bound.y);
			options.setWidth(bound.width);
			options.setHeight(bound.height);
			// 保存字体信息
			if(defaultStyle != null) {
			    options.setFontName(defaultStyle.fontName);
			    options.setFontSize(defaultStyle.fontSize);
			    options.setBold((defaultStyle.fontStyle & SWT.BOLD) != 0);
			    options.setItalic((defaultStyle.fontStyle & SWT.ITALIC) != 0);			    
			}
			// 保存字体颜色
			if(defaultStyle.foreground != null) {
			    options.setRed(defaultStyle.foreground.getRed());
			    options.setGreen(defaultStyle.foreground.getGreen());
			    options.setBlue(defaultStyle.foreground.getBlue());
			}
			options.save();			
		}
		// 保存手机好友列表
		if(mobiles.getMobilesModel() != null)
		    mobiles.save();
		// 关闭消息队列
		if(mm != null) mm.close();
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.PropertyListener#propertyAdded(edu.tsinghua.swt.events.PropertyEvent)
	 */
	public void propertyAdded(PropertyEvent e) {
	    // 没什么要做的
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.PropertyListener#propertyRemoved(edu.tsinghua.swt.events.PropertyEvent)
	 */
	public void propertyRemoved(PropertyEvent e) {
	    // 没什么要做的
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.PropertyListener#propertyModified(edu.tsinghua.swt.events.PropertyEvent)
	 */
	public void propertyModified(PropertyEvent e) {
	    // 没什么要做的
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.ShutterModelListener#itemAdded(edu.tsinghua.swt.events.ShutterModelEvent)
	 */
	public void itemAdded(ShutterModelEvent e) {
	    // 没什么要做到
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.ShutterModelListener#itemRemoved(edu.tsinghua.swt.events.ShutterModelEvent)
	 */
	public void itemRemoved(ShutterModelEvent e) {
	    // 没什么要做到
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.ModelListener#modelAdded(edu.tsinghua.swt.events.ModelEvent)
	 */
	public void modelAdded(ModelEvent e) {
	    // 没什么要做到
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.swt.events.ModelListener#modelRemoved(edu.tsinghua.swt.events.ModelEvent)
	 */
	public void modelRemoved(ModelEvent e) {
	    // 没什么要做到
	}
	
	/**
	 * 删除一个成功或者失败的删除好友请求
	 * 
	 * @param key
	 * 			好友的QQ号
	 */
	public GroupModel removeDeleteToMap(Integer key) {
		return (GroupModel)deleteToMap.remove(key);
	}
	
	/**
	 * 得到要删除的那个好友的qq号
	 * 
	 * @param key
	 * 			好友的QQ号,用作键值
	 * @return 要删除的好友的QQ号
	 */
	public int getDeletedFriend(Integer key) {
		return ((Integer)deleteToMap.get(key)).intValue();
	}
	
	/**
	 * 关闭主shell
	 */
	public void close() {
		shell.close();
	}
	  
	/**
	 * 删除一个好友
	 * 
	 * @param viewPart
	 * 			view part
	 * @param directly
	 * 			表示是直接删除还是从服务器删除
	 * @param removeSelf
	 * 			是否把自己从对方的好友列表中删除
	 */
	public void deleteFriend(CoolButton viewPart, boolean directly, boolean removeSelf) {
		FriendModel f = (FriendModel)viewPart.getData();
		int qqNum = f.getQQ();
		int[] indices = null;
		if(f.isOriginal())
		    indices = mvcHelper.getFriendCoordinate(qqNum);
		else
		    indices = mvcHelper.getLatestCoordinate(qqNum);
		if(directly && indices != null)
			model.removeItem(indices[0], indices[1]);
		else {
			// 请求服务器删除该好友
			deleteFriendFromServer(qqNum, true, removeSelf, null);
		}
	}

    /**
	 * 从服务器上删除一个好友
	 * 
	 * @param qqNum
	 * 			要删除的QQ号,为0表示不执行删除动作
	 * @param doDelete
	 * 			表示是否从向服务器发请求要求删除这个好友,如果这个QQ号不在我好友列表里面就不需要
	 * @param removeSelf
	 * 			表示是否把自己也从这个好友的列表中删除
	 * @param g
	 * 			表示这个好友删除后把它放置到哪个组,如果为null则忽略
	 */
	public void deleteFriendFromServer(int qqNum, boolean doDelete, boolean removeSelf, GroupModel g) {
		// 如果删除请求包发送成功,则加入到删除请求哈希表中
		if(doDelete) {
			char seq = client.deleteFriend(qqNum);
			if(seq != 0)	
				deleteToMap.put(new Integer(seq), new Integer(qqNum));			
		}
		if(removeSelf)
			client.removeSelfFrom(qqNum);
		if(g != null)
			deleteToMap.put(new Integer(qqNum), g);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
	 */
	public void controlMoved(ControlEvent e) {
		loc = shell.getLocation();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
	 */
	public void controlResized(ControlEvent e) {
	    // 没什么要做的
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.lumaqq.events.QQShowListener#qqShowDownloaded(edu.tsinghua.lumaqq.events.QQShowEvent)
	 */
	public void qqShowDownloaded(QQShowEvent e) {
		final Integer key = (Integer)e.getSource();
		if(shellRegistry.hasUserInfoWindow(key) && sm.isCached(key.intValue())) {
			display.syncExec(
				new Runnable() {
					public void run() {
					    UserInfoWindow uis = shellRegistry.getUserInfoWindow(key);
					    if(uis != null)
					        uis.setQQShow(sm.getQQShowImage(key.intValue()));						
					}
				}
			);
		}
	}
	
	/**
	 * 设置组的在线好友数属性
	 * 
	 * @param tabIndex
	 * 		组索引
	 * @param onlineNumber
	 * 		在线好友数
	 */
	public void setGroupOnlineUser(int tabIndex, int onlineNumber) {
        GroupModel g = (GroupModel)model.getTab(tabIndex);
        g.setOnlineUser(onlineNumber);
    }
	
	/**
	 * 组在线好友数加1
	 * 
	 * @param tabIndex
	 * 		组索引
	 */
	public void increaseGroupOnlineUser(int tabIndex) {
        GroupModel g = (GroupModel)model.getTab(tabIndex);
        g.setOnlineUser(g.getOnlineUser() + 1);
	}
	
	/**
	 * 组在线好友数减1	  
	 * 
	 * @param tabIndex
	 * 		组索引
	 */
	public void decreaseGroupOnlineUser(int tabIndex) {
        GroupModel g = (GroupModel)model.getTab(tabIndex);
        g.setOnlineUser(g.getOnlineUser() - 1);
	}
	
	/**
	 * 组好友总数加1
	 * 
	 * @param tabIndex
	 * 		组索引
	 */
	public void increaseGroupUsers(int tabIndex) {
        GroupModel g = (GroupModel)model.getTab(tabIndex);
        g.setUsers(g.getUsers() + 1);
	}
	
	/**
	 * 组好友总数减1
	 * 
	 * @param tabIndex
	 * 		组索引
	 */
	public void decreaseGroupUser(int tabIndex) {
        GroupModel g = (GroupModel)model.getTab(tabIndex);
        g.setUsers(g.getUsers() - 1);
	}
	
	/**
	 * 设置窗口可见状态
	 * 
	 * @param b
	 * 			true表示窗口可见
	 */
	public void setVisible(boolean b) {
	    shell.setVisible(b);
	}
	
	/**
	 * @return true表示窗口目前处于最小化状态
	 */
	public boolean isMinimized() {
	    return shell.getMinimized();
	}
	
	/**
	 * 设置好友的属性,这个方法会兼顾好友组和最近联系人组,以保持他们同步
	 * 
	 * @param f
	 * 			FriendModel
	 * @param key
	 * 			属性键
	 * @param value
	 * 			属性值

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -